]> git.donarmstrong.com Git - lilypond.git/blobdiff - scripts/ly2dvi.py
patch::: 1.3.140.jcn5
[lilypond.git] / scripts / ly2dvi.py
index 042cf07ba4cc88aa988d5b1106ae0802d6d4e081..e731503e2460ff9c065622021e77ba119cc439bb 100644 (file)
@@ -4,7 +4,22 @@
 # Note: gettext work best if we use ' for docstrings and "
 # for gettextable strings
 
-''' TODO: --dependencies
+'''
+TODO:
+
+  * check --dependencies
+
+  * move versatile taglines, 
+  
+     \header {
+        beginfooter=\mutopiaPD
+        endfooter=\tagline  -> 'lily was here <version>'
+     }
+
+  * head/header tagline/endfooter
+
+  * dvi from lilypond .tex output?  This is hairy, because we create dvi
+    from lilypond .tex *and* header output.
 
 '''
 
@@ -19,6 +34,7 @@ import __main__
 import operator
 import tempfile
 
+sys.path.append ('@datadir@/python')
 import gettext
 gettext.bindtextdomain ('lilypond', '@localedir@')
 gettext.textdomain('lilypond')
@@ -35,8 +51,8 @@ extra_init = {
        'language' : [],
        'latexheaders' : [],
        'latexpackages' :  ['geometry'],
-       'papersizename' : [],
-       'pagenumber' : [],
+       'papersize' : [],
+       'pagenumber' : [1],
        'textheight' : [], 
        'linewidth' : [],
        'orientation' : []
@@ -63,12 +79,16 @@ if program_version == '@' + 'TOPLEVEL_VERSION' + '@':
 # generate ps ?
 postscript_p = 0
 
+# be verbose?
+verbose_p = 0
+
 option_definitions = [
        ('', 'h', 'help', _ ("this help")),
        ('KEY=VAL', 's', 'set', _ ("change global setting KEY to VAL")),
        ('', 'P', 'postscript', _ ("generate PostScript output")),
        ('', 'k', 'keep', _ ("keep all output, and name the directory ly2dvi.dir")),
        ('', '', 'no-lily', _ ("don't run LilyPond")),
+       ('', 'V', 'verbose', _ ("verbose")),
        ('', 'v', 'version', _ ("print version number")),
        ('', 'w', 'warranty', _ ("show warranty and copyright")),
        ('DIR', '', 'outdir', _ ("dump all final output into DIR")),
@@ -92,13 +112,21 @@ NO WARRANTY.'''))
 
 
 
+def star_progress (s):
+       '''Progress messages that stand out between lilypond stuff'''
+       progress ('*** ' + s)
+
 def progress (s):
-       '''Make the progress messages stand out between lilypond stuff'''
-       # Why should they have to stand out?  Blend in would be nice too.
-       sys.stderr.write ('*** ' + s+ '\n')
+       sys.stderr.write (s + '\n')
+
+def warning (s):
+       sys.stderr.write (_ ("warning: ") + s)
+       sys.stderr.write ('\n')
        
+               
 def error (s):
-       sys.stderr.write (s)
+       sys.stderr.write (_ ("error: ") + s)
+       sys.stderr.write ('\n')
        raise _ ("Exiting ... ")
 
 
@@ -118,7 +146,7 @@ def find_file (name):
                except IOError:
                        pass
        if f:
-               sys.stderr.write (_ ("Reading `%s'") % nm)
+               sys.stderr.write (_ ("Reading %s...") % nm)
                sys.stderr.write ('\n');
                return (f.read (), nm)
        else:
@@ -193,9 +221,8 @@ def help ():
        sys.stdout.write ('\n')
        sys.stdout.write (options_help_str (option_definitions))
        sys.stdout.write ('\n\n')
-       sys.stdout.write (_ ("warning: "))
-       sys.stdout.write (_ ("all output is written in the CURRENT directory"))
-       sys.stdout.write ('\n\n')
+       warning (_ ("all output is written in the CURRENT directory"))
+       sys.stdout.write ('\n')
        sys.stdout.write (_ ("Report bugs to %s") % 'bug-gnu-music@gnu.org')
        sys.stdout.write ('\n')
        sys.exit (0)
@@ -208,7 +235,7 @@ def setup_temp ():
                temp_dir = tempfile.mktemp ('ly2dvi')
                
        try:
-               os.mkdir (temp_dir)
+               os.mkdir (temp_dir, 0777)
        except OSError:
                pass
                
@@ -224,12 +251,13 @@ def setup_temp ():
        os.environ['TFMFONTS'] =  original_dir + fp
 
        os.chdir (temp_dir)
-       progress (_ ('Temp directory is `%s\'\n') % temp_dir) 
+       if verbose_p:
+               progress (_ ('Temp directory is `%s\'\n') % temp_dir) 
 
        
 def system (cmd, ignore_error = 0):
-       sys.stderr.write (_ ("Invoking `%s\'") % cmd)
-       sys.stderr.write ('\n')
+       if verbose_p:
+               progress (_ ("Invoking `%s\'") % cmd)
        st = os.system (cmd)
        if st:
                msg =  ( _ ("error: ") + _ ("command exited with value %d") % st)
@@ -242,7 +270,8 @@ def system (cmd, ignore_error = 0):
 
 def cleanup_temp ():
        if not keep_temp_dir:
-               progress (_ ('Cleaning up `%s\'') % temp_dir)
+               if verbose_p:
+                       progress (_ ('Cleaning up `%s\'') % temp_dir)
                system ('rm -rf %s' % temp_dir)
        
 
@@ -263,11 +292,13 @@ def set_setting (dict, key, val):
        try:
                val = string.atof (val)
        except ValueError:
+               #warning (_ ("invalid value: %s") % `val`)
                pass
 
        try:
                dict[key].append (val)
        except KeyError:
+               warning (_ ("no such setting: %s") % `key`)
                dict[key] = [val]
        
 
@@ -280,7 +311,7 @@ def analyse_lilypond_output (filename, extra):
 
        # search only the first 10k
        s = s[:10240]
-       for x in ('textheight', 'linewidth', 'papersizename', 'orientation'):
+       for x in ('textheight', 'linewidth', 'papersize', 'orientation'):
                m = re.search (r'\\def\\lilypondpaper%s{([^}]*)}'%x, s)
                if m:
                        set_setting (extra, x, m.group (1))
@@ -307,7 +338,7 @@ def find_tex_files (files, extra):
                x = 0
                while 1:
                        fname = os.path.basename (f)
-                       fname = os.path.splitext (fname)[0]
+                       fname = strip_ly_suffix (fname)
                        if x:
                                fname = fname + '-%d' % x
 
@@ -317,13 +348,20 @@ def find_tex_files (files, extra):
                        else:
                                break
 
-                       x = x +1 
+                       x = x + 1
+       if not x:
+               warning (_ ("no lilypond output found for %s") % `files`)
        return tfiles
 
 def one_latex_definition (defn, first):
-       s = ''
+       s = '\n'
        for (k,v) in defn[1].items ():
-               s = r'''\def\the%s{%s}''' % (k,open (v).read ())
+               val = open (v).read ()
+               if (string.strip (val)):
+                       s = s + r'''\def\lilypond%s{%s}''' % (k, val)
+               else:
+                       s = s + r'''\let\lilypond%s\relax''' % k
+               s = s + '\n'
 
        if first:
                s = s + '\\def\\mustmakelilypondtitle{}\n'
@@ -336,7 +374,7 @@ def one_latex_definition (defn, first):
 
 ly_paper_to_latexpaper =  {
        'a4' : 'a4paper',
-       
+       'letter' : 'letterpaper', 
 }
 
 def global_latex_definition (tfiles, extra):
@@ -350,8 +388,13 @@ def global_latex_definition (tfiles, extra):
 
        paper = ''
 
-       if extra['papersizename']:
-               paper = '[%s]' % ly_paper_to_latexpaper[extra['papersizename'][0]]
+       if extra['papersize']:
+               try:
+                       paper = '[%s]' % ly_paper_to_latexpaper[extra['papersize'][0]]
+               except:
+                       warning (_ ("invalid value: %s") % `extra['papersize'][0]`)
+                       pass
+       
        s = s + '\\documentclass%s{article}\n' % paper
 
        if extra['language']:
@@ -370,29 +413,42 @@ def global_latex_definition (tfiles, extra):
        orientation = 'portrait'
        if extra['orientation']:
                orientation = extra['orientation'][0]
-       s = s + '\geometry{width=%spt%s,headheight=2mm,headsep=0pt,footskip=2mm,%s}\n' % (extra['linewidth'][0], textheight, orientation)
 
-       s= s + r'''
-\usepackage[latin1]{inputenc} 
+       # set sane geometry width (a4-width) for linewidth = -1.
+       linewidth = extra['linewidth'][0]
+       if linewidth < 0:
+               linewidth = 597
+       s = s + '\geometry{width=%spt%s,headheight=2mm,headsep=0pt,footskip=2mm,%s}\n' % (linewidth, textheight, orientation)
+
+       s = s + r'''
+\usepackage[latin1]{inputenc}
 \input{titledefs}
 \makeatletter
-\renewcommand{\@oddfoot}{\parbox{\textwidth}{\mbox{}\thefooter}}%%
+\renewcommand{\@oddfoot}{\parbox{\textwidth}{\mbox{}\thefooter}}%
 '''
-       if extra['pagenumber'] and  extra['pagenumber'][-1]:
+       
+       if extra['pagenumber'] and extra['pagenumber'][-1] and extra['pagenumber'][-1] != 'no':
                s = s + r'''
-               \renewcommand{\@oddhead}{\parbox{\textwidth}%%
-               {\mbox{}\small\theheader\hfill\textbf{\thepage}}}%%'''
+\renewcommand{\@oddhead}{\parbox{\textwidth}%
+    {\mbox{}\small\theheader\hfill\textbf{\thepage}}}
+'''
        else:
-               s = s + '\\pagestyle{empty}'
-               
-       s = s + '\\begin{document}'
+               s = s + '\\pagestyle{empty}\n'
+
+       s = s + '\\makeatother\n'
+       s = s + '\\begin{document}\n'
+
 
        first = 1
        for t in tfiles:
                s = s + one_latex_definition (t, first)
                first = 0
-               
+
+       s = s + r'''
+\makeatletter
+\renewcommand{\@oddfoot}{\parbox{\textwidth}{\mbox{}\lilypondtagline}}%
+\makeatother
+'''
        s = s + '\\end{document}'
 
        return s
@@ -420,8 +476,8 @@ def generate_postscript (dvi_name, extra):
        '''Run dvips on DVI_NAME, optionally doing -t landscape'''
 
        opts = ''
-       if extra['papersizename']:
-               opts = opts + ' -t %s' % extra['papersizename'][0]
+       if extra['papersize']:
+               opts = opts + ' -t %s' % extra['papersize'][0]
 
        if extra['orientation'] and extra['orientation'][0] == 'landscape':
                opts = opts + ' -t landscape'
@@ -480,6 +536,8 @@ for opt in options:
                set_setting (extra_init, ss[0], ss[1])
        elif o == '--dependencies' or o == '-d':
                track_dependencies_p = 1
+       elif o == '--verbose' or o == '-V':
+               verbose_p = 1
        elif o == '--version' or o == '-v':
                identify ()
                sys.exit (0)
@@ -526,19 +584,23 @@ if files:
                type = 'DVI'
 
        dest = os.path.join (outdir, dest)
+       if outdir != '.':
+               system ('mkdir -p %s' % outdir)
        system ('cp \"%s\" \"%s\"' % (srcname, dest ))
-       system ('cp *.midi %s' % outdir, ignore_error = 1)
+       if re.match ('[.]midi', string.join (os.listdir ('.'))):
+               system ('cp *.midi %s' % outdir, ignore_error = 1)
 
        depfile = os.path.join (outdir, base + '.dep')
 
        if track_dependencies_p:
                generate_dependency_file (depfile, dest)
 
+       os.chdir (original_dir)
        cleanup_temp ()
 
        # most insteresting info last
        progress (_ ("dependencies output to %s...") % depfile)
-       progress (_ ("%s file left in `%s'") % (type, dest))
+       progress (_ ("%s output to %s...") % (type, dest))