]> git.donarmstrong.com Git - lilypond.git/blobdiff - scripts/ly2dvi.py
* Documentation/user/refman.itely: doco updates.
[lilypond.git] / scripts / ly2dvi.py
index 4e8a5322532f044ea290b63e2e4f11d22ffa57cb..54ac389ad31f87f5a44082d5f969b73d93968cf7 100644 (file)
@@ -50,9 +50,6 @@ TODO:
 '''
 
 
 '''
 
 
-
-
-
 import os
 import stat
 import string
 import os
 import stat
 import string
@@ -66,6 +63,11 @@ import tempfile
 import traceback
 
 
 import traceback
 
 
+################################################################
+# lilylib.py -- options and stuff
+# 
+# source file of the GNU LilyPond music typesetter
+
 # Handle bug in Python 1.6-2.1
 #
 # there are recursion limits for some patterns in Python 1.6 til 2.1. 
 # Handle bug in Python 1.6-2.1
 #
 # there are recursion limits for some patterns in Python 1.6 til 2.1. 
@@ -79,11 +81,14 @@ try:
 except ImportError:
        import re
 
 except ImportError:
        import re
 
-
-################################################################
-# lilylib.py -- options and stuff
-# 
-# source file of the GNU LilyPond music typesetter
+# Attempt to fix problems with limited stack size set by Python!
+# Sets unlimited stack size. Note that the resource module only
+# is available on UNIX.
+try:
+       import resource
+       resource.setrlimit (resource.RLIMIT_STACK, (-1, -1))
+except:
+       pass
 
 try:
        import gettext
 
 try:
        import gettext
@@ -96,7 +101,7 @@ except:
 
 program_version = '@TOPLEVEL_VERSION@'
 if program_version == '@' + 'TOPLEVEL_VERSION' + '@':
 
 program_version = '@TOPLEVEL_VERSION@'
 if program_version == '@' + 'TOPLEVEL_VERSION' + '@':
-       program_version = '1.5.17'
+       program_version = '1.5.54'
 
 def identify ():
        sys.stdout.write ('%s (GNU LilyPond) %s\n' % (program_name, program_version))
 
 def identify ():
        sys.stdout.write ('%s (GNU LilyPond) %s\n' % (program_name, program_version))
@@ -125,8 +130,6 @@ def user_error (s, e=1):
        sys.exit (e)
        
 def error (s):
        sys.exit (e)
        
 def error (s):
-
-
        '''Report the error S.  Exit by raising an exception. Please
        do not abuse by trying to catch this error. If you do not want
        a stack trace, write to the output directly.
        '''Report the error S.  Exit by raising an exception. Please
        do not abuse by trying to catch this error. If you do not want
        a stack trace, write to the output directly.
@@ -223,7 +226,7 @@ def setup_temp ():
        return temp_dir
 
 
        return temp_dir
 
 
-def system (cmd, ignore_error = 0):
+def system (cmd, ignore_error = 0, quiet =0):
        """Run CMD. If IGNORE_ERROR is set, don't complain when CMD returns non zero.
 
        RETURN VALUE
        """Run CMD. If IGNORE_ERROR is set, don't complain when CMD returns non zero.
 
        RETURN VALUE
@@ -239,7 +242,8 @@ def system (cmd, ignore_error = 0):
                name = re.match ('[ \t]*([^ \t]*)', cmd).group (1)
                msg = name + ': ' + _ ("command exited with value %d") % st
                if ignore_error:
                name = re.match ('[ \t]*([^ \t]*)', cmd).group (1)
                msg = name + ': ' + _ ("command exited with value %d") % st
                if ignore_error:
-                       warning (msg + ' ' + _ ("(ignored)") + ' ')
+                       if not quiet:
+                               warning (msg + ' ' + _ ("(ignored)") + ' ')
                else:
                        error (msg)
 
                else:
                        error (msg)
 
@@ -259,28 +263,56 @@ def strip_extension (f, ext):
                e = ''
        return p + e
 
                e = ''
        return p + e
 
-################################################################
-# END Library
+
+def cp_to_dir (pattern, dir):
+       "Copy files matching re PATTERN from cwd to DIR"
+       # Duh.  Python style portable: cp *.EXT OUTDIR
+       # system ('cp *.%s %s' % (ext, outdir), 1)
+       files = filter (lambda x, p=pattern: re.match (p, x), os.listdir ('.'))
+       map (lambda x, d=dir: shutil.copy2 (x, os.path.join (d, x)), files)
 
 
 
 
+# Python < 1.5.2 compatibility
+#
+# On most platforms, this is equivalent to
+#`normpath(join(os.getcwd()), PATH)'.  *Added in Python version 1.5.2*
+if os.path.__dict__.has_key ('abspath'):
+       abspath = os.path.abspath
+else:
+       def abspath (path):
+               return os.path.normpath (os.path.join (os.getcwd (), path))
 
 
+if os.__dict__.has_key ('makedirs'):
+       makedirs = os.makedirs
+else:
+       def makedirs (dir, mode=0777):
+               system ('mkdir -p %s' % dir)
 
 
 
 
+def mkdir_p (dir, mode=0777):
+       if not os.path.isdir (dir):
+               makedirs (dir, mode)
+
 
 # if set, LILYPONDPREFIX must take prevalence
 # if datadir is not set, we're doing a build and LILYPONDPREFIX 
 
 # if set, LILYPONDPREFIX must take prevalence
 # if datadir is not set, we're doing a build and LILYPONDPREFIX 
-datadir = '@datadir@'
-
+datadir = '@local_lilypond_datadir@'
 
 if os.environ.has_key ('LILYPONDPREFIX') :
        datadir = os.environ['LILYPONDPREFIX']
 else:
 
 if os.environ.has_key ('LILYPONDPREFIX') :
        datadir = os.environ['LILYPONDPREFIX']
 else:
-       datadir = '@datadir@'
+       datadir = '@local_lilypond_datadir@'
 
 
 while datadir[-1] == os.sep:
        datadir= datadir[:-1]
 
 
 
 while datadir[-1] == os.sep:
        datadir= datadir[:-1]
 
+sys.path.insert (0, os.path.join (datadir, 'python'))
+
+################################################################
+# END Library
+
+
 program_name = 'ly2dvi'
 
 original_dir = os.getcwd ()
 program_name = 'ly2dvi'
 
 original_dir = os.getcwd ()
@@ -289,24 +321,7 @@ errorport = sys.stderr
 keep_temp_dir_p = 0
 verbose_p = 0
 preview_p = 0
 keep_temp_dir_p = 0
 verbose_p = 0
 preview_p = 0
-
-try:
-       import gettext
-       gettext.bindtextdomain ('lilypond', '@localedir@')
-       gettext.textdomain ('lilypond')
-       _ = gettext.gettext
-except:
-       def _ (s):
-               return s
-
-# Attempt to fix problems with limited stack size set by Python!
-# Sets unlimited stack size. Note that the resource module only
-# is available on UNIX.
-try:
-       import resource
-       resource.setrlimit (resource.RLIMIT_STACK, (-1, -1))
-except:
-       pass
+preview_resolution = 90
 
 help_summary = _ ("Generate .dvi with LaTeX for LilyPond")
 
 
 help_summary = _ ("Generate .dvi with LaTeX for LilyPond")
 
@@ -321,7 +336,9 @@ option_definitions = [
        (_ ("FILE"), 'f', 'find-pfa', _ ("find pfa fonts used in FILE")),
        # why capital P?
        ('', '', 'preview', _("Make a picture of the first system.")),
        (_ ("FILE"), 'f', 'find-pfa', _ ("find pfa fonts used in FILE")),
        # why capital P?
        ('', '', 'preview', _("Make a picture of the first system.")),
+       (_ ('RES'), '', 'preview-resolution', _("Set the resolution of the preview to RES.")),
        ('', 'P', 'postscript', _ ("generate PostScript output")),
        ('', 'P', 'postscript', _ ("generate PostScript output")),
+       ('', '', 'pdf', _ ("generate PDF output")),     
        (_ ("KEY=VAL"), 's', 'set', _ ("change global setting KEY to VAL")),
        ('', 'V', 'verbose', _ ("verbose")),
        ('', 'v', 'version', _ ("print version number")),
        (_ ("KEY=VAL"), 's', 'set', _ ("change global setting KEY to VAL")),
        ('', 'V', 'verbose', _ ("verbose")),
        ('', 'v', 'version', _ ("print version number")),
@@ -371,7 +388,10 @@ kpse = re.sub('[ \t\n]+$','', kpse)
 type1_paths = os.popen ('kpsewhich -expand-path=\$T1FONTS').read ()
 
 environment = {
 type1_paths = os.popen ('kpsewhich -expand-path=\$T1FONTS').read ()
 
 environment = {
-       ## todo: prevent multiple addition.
+       # TODO: * prevent multiple addition.
+       #       * clean TEXINPUTS, MFINPUTS, TFMFONTS,
+       #         as these take prevalence over $TEXMF
+       #         and thus may break tex run?
        'TEXMF' : "{%s,%s}" % (datadir, kpse) ,
        'GS_FONTPATH' : type1_paths,
        'GS_LIB' : datadir + '/ps',
        'TEXMF' : "{%s,%s}" % (datadir, kpse) ,
        'GS_FONTPATH' : type1_paths,
        'GS_LIB' : datadir + '/ps',
@@ -386,10 +406,9 @@ non_path_environment = {
 
 def setup_environment ():
        # $TEXMF is special, previous value is already taken care of
 
 def setup_environment ():
        # $TEXMF is special, previous value is already taken care of
-       if os.environ.has_key ('TEXM'):
+       if os.environ.has_key ('TEXMF'):
                del os.environ['TEXMF']
  
                del os.environ['TEXMF']
  
-
        for key in environment.keys ():
                val = environment[key]
                if os.environ.has_key (key):
        for key in environment.keys ():
                val = environment[key]
                if os.environ.has_key (key):
@@ -419,12 +438,12 @@ def print_environment ():
        for (k,v) in os.environ.items ():
                sys.stderr.write ("%s=\"%s\"\n" % (k,v)) 
 
        for (k,v) in os.environ.items ():
                sys.stderr.write ("%s=\"%s\"\n" % (k,v)) 
 
-def quiet_system (cmd, name):
+def quiet_system (cmd, name, ignore_error = 0):
        if not verbose_p:
                progress ( _("Running %s...") % name)
                cmd = cmd + ' 1> /dev/null 2> /dev/null'
 
        if not verbose_p:
                progress ( _("Running %s...") % name)
                cmd = cmd + ' 1> /dev/null 2> /dev/null'
 
-       return system (cmd)
+       return system (cmd, ignore_error, quiet = 1)
 
 
 def run_lilypond (files, outbase, dep_prefix):
 
 
 def run_lilypond (files, outbase, dep_prefix):
@@ -453,8 +472,22 @@ def run_lilypond (files, outbase, dep_prefix):
 
                # for better debugging!
                print_environment ()
 
                # for better debugging!
                print_environment ()
-       print opts, fs  
-       system ('lilypond %s %s ' % (opts, fs), 'lilypond')
+
+       cmd = 'lilypond %s %s ' % (opts, fs)
+       if  verbose_p:
+               progress ("Invoking `%s'"% cmd)
+       status = os.system (cmd)
+
+       signal = 0x0f & status
+       exit_status = status >> 8
+
+       # 2 == user interrupt.
+       if signal and  signal <> 2:
+               error("\n\nLilyPond crashed (signal %d). Please submit a bugreport to bug-lilypond@gnu.org\n" % signal)
+
+       if status:
+               error ("\n\nLilyPond failed on the input file. (exit status %d)\n" % exit_status)
+               
 
 def analyse_lilypond_output (filename, extra):
        
 
 def analyse_lilypond_output (filename, extra):
        
@@ -567,7 +600,7 @@ def global_latex_preamble (extra):
        s = s + '\\documentclass[%s]{article}\n' % options
 
        if extra['language']:
        s = s + '\\documentclass[%s]{article}\n' % options
 
        if extra['language']:
-               s = s + r'\usepackage[%s]{babel}\n' % extra['language'][-1]
+               s = s + r'\usepackage[%s]{babel}' % extra['language'][-1] + '\n'
 
 
        s = s + '\\usepackage{%s}\n' \
 
 
        s = s + '\\usepackage{%s}\n' \
@@ -652,8 +685,22 @@ None
        f.close ()
 
        cmd = 'latex \\\\nonstopmode \\\\input %s' % latex_fn
        f.close ()
 
        cmd = 'latex \\\\nonstopmode \\\\input %s' % latex_fn
-       quiet_system (cmd, 'LaTeX')
+       status = quiet_system (cmd, 'LaTeX', ignore_error = 1)
+
+       signal = 0xf & status
+       exit_stat = status >> 8
 
 
+       if exit_stat:
+               logstr = open (outbase + '.log').read()
+               m = re.search ("\n!", logstr)
+               start = m.start (0)
+               logstr = logstr[start:start+200]
+               
+               sys.stderr.write(_("""LaTeX failed on the output file.
+The error log is as follows:
+%s...\n""" % logstr))
+               raise 'LaTeX error'
+       
        if preview_p:
                # make a preview by rendering only the 1st line.
                preview_fn = outbase + '.preview.tex'
        if preview_p:
                # make a preview by rendering only the 1st line.
                preview_fn = outbase + '.preview.tex'
@@ -690,6 +737,9 @@ None.
        if extra['orientation'] and extra['orientation'][0] == 'landscape':
                opts = opts + ' -tlandscape'
 
        if extra['orientation'] and extra['orientation'][0] == 'landscape':
                opts = opts + ' -tlandscape'
 
+       if 'PDF' in targets:
+               opts = opts + '-Ppdf -G0 -u lilypond.map'
+               
        cmd = 'dvips %s -o%s %s' % (opts, outbase + '.ps', outbase + '.dvi')
        quiet_system (cmd, 'dvips')
 
        cmd = 'dvips %s -o%s %s' % (opts, outbase + '.ps', outbase + '.dvi')
        quiet_system (cmd, 'dvips')
 
@@ -697,6 +747,10 @@ None.
                cmd = 'dvips -E -o%s %s' % ( outbase + '.preview.ps', outbase + '.preview.dvi')         
                quiet_system (cmd, 'dvips for preview')
 
                cmd = 'dvips -E -o%s %s' % ( outbase + '.preview.ps', outbase + '.preview.dvi')         
                quiet_system (cmd, 'dvips for preview')
 
+       if 'PDF' in targets:
+               cmd = 'ps2pdf %s.ps %s.pdf' % (outbase , outbase)
+               quiet_system (cmd, 'ps2pdf')
+               
 def get_bbox (filename):
        # cut & paste 
        system ('gs -sDEVICE=bbox -q  -sOutputFile=- -dNOPAUSE %s -c quit > %s.bbox 2>&1 ' % (filename, filename))
 def get_bbox (filename):
        # cut & paste 
        system ('gs -sDEVICE=bbox -q  -sOutputFile=- -dNOPAUSE %s -c quit > %s.bbox 2>&1 ' % (filename, filename))
@@ -719,14 +773,12 @@ def make_preview (name, extra):
        fo.write ('%d %d translate\n' % (-bbox[0]+margin, -bbox[1]+margin))
        fo.close ()
        
        fo.write ('%d %d translate\n' % (-bbox[0]+margin, -bbox[1]+margin))
        fo.close ()
        
-       res = 90
-
-       x = (2* margin + bbox[2] - bbox[0]) * res / 72.
-       y = (2* margin + bbox[3] - bbox[1]) * res / 72.
+       x = (2* margin + bbox[2] - bbox[0]) * preview_resolution / 72.
+       y = (2* margin + bbox[3] - bbox[1]) * preview_resolution / 72.
 
        cmd = r'''gs -g%dx%d -sDEVICE=pgm  -dTextAlphaBits=4 -dGraphicsAlphaBits=4  -q -sOutputFile=- -r%d -dNOPAUSE %s %s -c quit | pnmtopng > %s'''
        
 
        cmd = r'''gs -g%dx%d -sDEVICE=pgm  -dTextAlphaBits=4 -dGraphicsAlphaBits=4  -q -sOutputFile=- -r%d -dNOPAUSE %s %s -c quit | pnmtopng > %s'''
        
-       cmd = cmd % (x, y, res, name + '.trans.eps', name + '.preview.ps',name + '.png')
+       cmd = cmd % (x, y, preview_resolution, name + '.trans.eps', name + '.preview.ps',name + '.png')
        quiet_system (cmd, 'gs')
 
        try:
        quiet_system (cmd, 'gs')
 
        try:
@@ -810,6 +862,9 @@ for opt in options:
                include_path.append (a)
        elif o == '--postscript' or o == '-P':
                targets.append ('PS')
                include_path.append (a)
        elif o == '--postscript' or o == '-P':
                targets.append ('PS')
+       elif o == '--pdf':
+               targets.append ('PDF')
+               targets.append ('PS')
        elif o == '--keep' or o == '-k':
                keep_temp_dir_p = 1
        elif o == '--no-lily':
        elif o == '--keep' or o == '-k':
                keep_temp_dir_p = 1
        elif o == '--no-lily':
@@ -817,9 +872,9 @@ for opt in options:
        elif o == '--preview':
                preview_p = 1
                targets.append ('PNG')
        elif o == '--preview':
                preview_p = 1
                targets.append ('PNG')
-               
+       elif o == '--preview-resolution':
+               preview_resolution = string.atoi (a)
        elif o == '--no-paper' or o == '-m':
        elif o == '--no-paper' or o == '-m':
-
                targets = ['MIDI'] 
                paper_p = 0
        elif o == '--output' or o == '-o':
                targets = ['MIDI'] 
                paper_p = 0
        elif o == '--output' or o == '-o':
@@ -841,34 +896,6 @@ for opt in options:
 
                sys.exit (0)
 
 
                sys.exit (0)
 
-
-def cp_to_dir (pattern, dir):
-       "Copy files matching re PATTERN from cwd to DIR"
-       # Duh.  Python style portable: cp *.EXT OUTDIR
-       # system ('cp *.%s %s' % (ext, outdir), 1)
-       files = filter (lambda x, p=pattern: re.match (p, x), os.listdir ('.'))
-       map (lambda x, d=dir: shutil.copy2 (x, os.path.join (d, x)), files)
-
-# Python < 1.5.2 compatibility
-#
-# On most platforms, this is equivalent to
-#`normpath(join(os.getcwd()), PATH)'.  *Added in Python version 1.5.2*
-if os.path.__dict__.has_key ('abspath'):
-       abspath = os.path.abspath
-else:
-       def abspath (path):
-               return os.path.normpath (os.path.join (os.getcwd (), path))
-
-if os.__dict__.has_key ('makedirs'):
-       makedirs = os.makedirs
-else:
-       def makedirs (dir, mode=0777):
-               system ('mkdir -p %s' % dir)
-
-def mkdir_p (dir, mode=0777):
-       if not os.path.isdir (dir):
-               makedirs (dir, mode)
-
 include_path = map (abspath, include_path)
 
 original_output = output_name
 include_path = map (abspath, include_path)
 
 original_output = output_name