]> git.donarmstrong.com Git - lilypond.git/blobdiff - scripts/ly2dvi.py
patch::: 1.3.140.jcn3
[lilypond.git] / scripts / ly2dvi.py
index 042cf07ba4cc88aa988d5b1106ae0802d6d4e081..1c93f63ceded422e4f1612bf2c1426fc0910511e 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' : []
@@ -96,9 +112,15 @@ 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')
+
+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 ... ")
 
 
@@ -193,9 +215,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 +229,7 @@ def setup_temp ():
                temp_dir = tempfile.mktemp ('ly2dvi')
                
        try:
-               os.mkdir (temp_dir)
+               os.mkdir (temp_dir, 0777)
        except OSError:
                pass
                
@@ -263,11 +284,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 +303,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 +330,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 +340,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 +366,7 @@ def one_latex_definition (defn, first):
 
 ly_paper_to_latexpaper =  {
        'a4' : 'a4paper',
-       
+       'letter' : 'letterpaper', 
 }
 
 def global_latex_definition (tfiles, extra):
@@ -350,8 +380,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 +405,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 +468,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'
@@ -526,6 +574,8 @@ 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)
 
@@ -534,6 +584,7 @@ if files:
        if track_dependencies_p:
                generate_dependency_file (depfile, dest)
 
+       os.chdir (original_dir)
        cleanup_temp ()
 
        # most insteresting info last