]> git.donarmstrong.com Git - lilypond.git/blobdiff - scripts/lilypond-book.py
Change Info docs setup and clean up Documentation/user/GNUmakefile
[lilypond.git] / scripts / lilypond-book.py
index 472101b8b53338edd2d542bcd60c0feee1ea9e57..bdb0637d17ee418424e1d1e83eb5fc91f96315e7 100644 (file)
@@ -37,23 +37,9 @@ import sys
 import re
 import md5
 
-################
-# RELOCATION
-################
-
-
-for d in ['@lilypond_datadir@',
-          '@lilypond_libdir@']:
-    sys.path.insert (0, os.path.join (d, 'python'))
-
-# dynamic relocation, for GUB binaries.
-bindir = os.path.abspath (os.path.split (sys.argv[0])[0])
-
-os.environ['PATH'] = bindir + os.pathsep + os.environ['PATH']
-for p in ['share', 'lib']:
-    datadir = os.path.abspath (bindir + '/../%s/lilypond/current/python/' % p)
-    sys.path.insert (0, datadir)
-
+"""
+@relocate-preamble@
+"""
 
 import lilylib as ly
 import fontextract
@@ -80,7 +66,6 @@ _ ("Process LilyPond snippets in hybrid HTML, LaTeX, texinfo or DocBook document
 authors = ('Jan Nieuwenhuizen <janneke@gnu.org>',
       'Han-Wen Nienhuys <hanwen@xs4all.nl>')
 
-    
 ################################################################
 def exit (i):
     if global_options.verbose:
@@ -89,16 +74,15 @@ def exit (i):
         sys.exit (i)
 
 def identify ():
-    sys.stdout.write ('%s (GNU LilyPond) %s\n' % (program_name, program_version))
+    ly.encoded_write (sys.stdout, '%s (GNU LilyPond) %s\n' % (program_name, program_version))
 
-def progress (s):
-    sys.stderr.write (s)
+progress = ly.progress
 
 def warning (s):
-    sys.stderr.write (program_name + ": " + _ ("warning: %s") % s + '\n')
+    ly.stderr_write (program_name + ": " + _ ("warning: %s") % s + '\n')
 
 def error (s):
-    sys.stderr.write (program_name + ": " + _ ("error: %s") % s + '\n')
+    ly.stderr_write (program_name + ": " + _ ("error: %s") % s + '\n')
 
 def ps_page_count (ps_name):
     header = open (ps_name).read (1024)
@@ -109,14 +93,14 @@ def ps_page_count (ps_name):
 
 def warranty ():
     identify ()
-    sys.stdout.write ('''
+    ly.encoded_write (sys.stdout, '''
 %s
 
 %s
 
 %s
 %s
-''' % ( _ ('Copyright (c) %s by') % '2001--2006',
+''' % ( _ ('Copyright (c) %s by') % '2001--2007',
     ' '.join (authors),
    _ ("Distributed under terms of the GNU General Public License."),
    _ ("It comes with NO WARRANTY.")))
@@ -139,19 +123,33 @@ def get_option_parser ():
                   metavar=_ ("DIR"),
                   action='append', dest='include_path',
                   default=[os.path.abspath (os.getcwd ())])
+
+    p.add_option ('--info-images-dir', help=_ ("format Texinfo output so that Info will "
+                                               "look for images of music in DIR"),
+                  metavar=_ ("DIR"),
+                  action='store', dest='info_images_dir',
+                  default='')
+
+    p.add_option ('--left-padding', 
+                  metavar=_ ("PAD"),
+                  dest="padding_mm",
+                  help=_ ("pad left side of music to align music inspite of uneven bar numbers (in mm)"),
+                  type="float",
+                  default=3.0)
     
     p.add_option ("-o", '--output', help=_ ("write output to DIR"),
                   metavar=_ ("DIR"),
                   action='store', dest='output_name',
                   default='')
+    
     p.add_option ('-P', '--process', metavar=_ ("COMMAND"),
                   help = _ ("process ly_files using COMMAND FILE..."),
                   action='store', 
-                  dest='process_cmd', default='lilypond -eps')
+                  dest='process_cmd', default='lilypond -dbackend=eps')
     p.add_option ('--pdf',
                   action="store_true",
                   dest="create_pdf",
-                  help=_ ("Create PDF files for use with PDFTeX"),
+                  help=_ ("create PDF files for use with PDFTeX"),
                   default=False)
     p.add_option ('', '--psfonts', action="store_true", dest="psfonts",
                   help=_ ('''extract all PostScript fonts into INPUT.psfonts for LaTeX
@@ -164,7 +162,7 @@ must use this with dvips -h INPUT.psfonts'''),
     p.add_option ('-w', '--warranty',
                   help=_ ("show warranty and copyright"),
                   action='store_true')
-    p.add_option_group ('bugs',
+    p.add_option_group (_ ('Bugs'),
                         description=(_ ("Report bugs via")
                                      + ''' http://post.gmane.org/post.php'''
                                      '''?group=gmane.comp.gnu.lilypond.bugs\n'''))
@@ -195,6 +193,7 @@ INDENT = 'indent'
 LATEX = 'latex'
 LAYOUT = 'layout'
 LINE_WIDTH = 'line-width'
+LILYQUOTE = 'lilyquote'
 NOFRAGMENT = 'nofragment'
 NOINDENT = 'noindent'
 NOQUOTE = 'noquote'
@@ -517,6 +516,8 @@ ly_options = {
 
         QUOTE: r'''line-width = %(line-width)s - 2.0 * %(exampleindent)s''',
 
+        LILYQUOTE: r'''line-width = %(line-width)s - 2.0 * %(exampleindent)s''',
+
         RAGGED_RIGHT: r'''ragged-right = ##t''',
 
         PACKED: r'''packed = ##t''',
@@ -632,7 +633,7 @@ output = {
 
         OUTPUTIMAGE: r'''@noindent
 @ifinfo
-@image{%(base)s,,,%(alt)s,%(ext)s}
+@image{%(info_image_path)s,,,%(alt)s,%(ext)s}
 @end ifinfo
 @html
 <p>
@@ -683,21 +684,20 @@ if 0:
 PREAMBLE_LY = '''%%%% Generated by %(program_name)s
 %%%% Options: [%(option_string)s]
 \\include "lilypond-book-preamble.ly"
-%(preamble_string)s
-
-
-
-
 
 
 %% ****************************************************************
 %% Start cut-&-pastable-section 
 %% ****************************************************************
 
+%(preamble_string)s
+
 \paper {
   #(define dump-extents #t)
   %(font_dump_setting)s
   %(paper_string)s
+  force-assignment = #""
+  line-width = #(- line-width (* mm  %(padding_mm)f))
 }
 
 \layout {
@@ -880,6 +880,9 @@ class Lilypond_snippet (Snippet):
         os = match.group ('options')
         self.do_options (os, self.type)
 
+    def verb_ly (self):
+        return self.substring ('code')
+
     def ly (self):
         contents = self.substring ('code')
         return ('\\sourcefileline %d\n%s'
@@ -1052,7 +1055,7 @@ class Lilypond_snippet (Snippet):
                       '\n  ') % vars ()
         preamble_string = string.join (compose_dict[PREAMBLE],
                        '\n  ') % override
-        
+        padding_mm = global_options.padding_mm
         font_dump_setting = ''
         if FONTLOAD in self.option_dict:
             font_dump_setting = '#(define-public force-eps-font-include #t)\n'
@@ -1083,7 +1086,7 @@ class Lilypond_snippet (Snippet):
         open (self.basename () + '.txt', 'w').write ('image of music')
 
     def relevant_contents (self, ly):
-        return re.sub (r'\\(version|sourcefileline)[^\n]*\n', '', ly)
+        return re.sub (r'\\(version|sourcefileline|sourcefilename)[^\n]*\n', '', ly)
              
     def ly_is_outdated (self):
         base = self.basename ()
@@ -1100,8 +1103,7 @@ class Lilypond_snippet (Snippet):
             and (self.relevant_contents (self.full_ly ())
                  == self.relevant_contents (open (ly_file).read ()))):
             return None
-        if global_options.verbose:
-            print 'OUT OF DATE: ', ly_file
+
         return self
 
     def png_is_outdated (self):
@@ -1175,7 +1177,7 @@ class Lilypond_snippet (Snippet):
             else:
                 str = '<mediaobject>' + str + '</mediaobject>'
         if VERBATIM in self.option_dict:
-                verb = verbatim_html (self.substring ('code'))
+                verb = verbatim_html (self.verb_ly ())
                 str = output[DOCBOOK][VERBATIM] % vars () + str
         return str
        
@@ -1185,7 +1187,7 @@ class Lilypond_snippet (Snippet):
         if global_options.format == HTML:
             str += self.output_print_filename (HTML)
             if VERBATIM in self.option_dict:
-                verb = verbatim_html (self.substring ('code'))
+                verb = verbatim_html (self.verb_ly ())
                 str += output[HTML][VERBATIM] % vars ()
             if QUOTE in self.option_dict:
                 str = output[HTML][QUOTE] % vars ()
@@ -1207,6 +1209,7 @@ class Lilypond_snippet (Snippet):
             # Specifying no extension is most robust.
             ext = ''
             alt = self.option_dict[ALT]
+            info_image_path = os.path.join (global_options.info_images_dir, base)
             str += output[TEXINFO][OUTPUTIMAGE] % vars ()
 
         base = self.basename ()
@@ -1219,7 +1222,7 @@ class Lilypond_snippet (Snippet):
         if global_options.format == LATEX:
             str += self.output_print_filename (LATEX)
             if VERBATIM in self.option_dict:
-                verb = self.substring ('code')
+                verb = self.verb_ly ()
                 str += (output[LATEX][VERBATIM] % vars ())
 
         str += (output[LATEX][OUTPUT] % vars ())
@@ -1257,13 +1260,16 @@ class Lilypond_snippet (Snippet):
             if os.path.exists (texidoc):
                 str += '@include %(texidoc)s\n\n' % vars ()
 
+        substr = ''
         if VERBATIM in self.option_dict:
-            verb = self.substring ('code')
-            str += (output[TEXINFO][VERBATIM] % vars ())
+            verb = self.verb_ly ()
+            substr += output[TEXINFO][VERBATIM] % vars ()
             if not QUOTE in self.option_dict:
-                str = output[TEXINFO][NOQUOTE] % vars ()
-
-        str += self.output_info ()
+                substr = output[TEXINFO][NOQUOTE] % {'str':substr}
+        substr += self.output_info ()
+        if LILYQUOTE in self.option_dict:
+            substr = output[TEXINFO][QUOTE] % {'str':substr}
+        str += substr
 
 #                str += ('@ifinfo\n' + self.output_info () + '\n@end ifinfo\n')
 #                str += ('@tex\n' + self.output_latex () + '\n@end tex\n')
@@ -1277,12 +1283,25 @@ class Lilypond_snippet (Snippet):
 
         return str
 
+re_begin_verbatim = re.compile (r'\s+%.*?begin verbatim.*\n*', re.M)
+re_end_verbatim = re.compile (r'\s+%.*?end verbatim.*$', re.M)
+
 class Lilypond_file_snippet (Lilypond_snippet):
+    def __init__ (self, type, match, format, line_number):
+        Lilypond_snippet.__init__ (self, type, match, format, line_number)
+        self.contents = open (find_file (self.substring ('filename'))).read ()
+
+    def verb_ly (self):
+        s = self.contents
+        s = re_begin_verbatim.split (s)[-1]
+        s = re_end_verbatim.split (s)[0]
+        return s
+
     def ly (self):
         name = self.substring ('filename')
-        contents = open (find_file (name)).read ()
         return ('\\sourcefilename \"%s\"\n\\sourcefileline 0\n%s'
-                % (name, contents))
+                % (name, self.contents))
+
 
 snippet_type_to_class = {
     'lilypond_file': Lilypond_file_snippet,
@@ -1404,8 +1423,8 @@ def filter_pipe (input, cmd):
         exit_status = status >> 8
         error (_ ("`%s' failed (%d)") % (cmd, exit_status))
         error (_ ("The error log is as follows:"))
-        sys.stderr.write (error)
-        sys.stderr.write (stderr.read ())
+        ly.stderr_write (error)
+        ly.stderr_write (stderr.read ())
         exit (status)
 
     if global_options.verbose:
@@ -1439,10 +1458,12 @@ def process_snippets (cmd, ly_snippets, texstr_snippets, png_snippets):
                             be_verbose=global_options.verbose, 
                             progress_p=1)
 
-    if global_options.format in (HTML, TEXINFO):
+    if global_options.format in (HTML, TEXINFO) and '--formats' not in cmd:
         cmd += ' --formats=png '
-    if global_options.format in (DOCBOOK):
+    elif global_options.format in (DOCBOOK) and '--formats' not in cmd:
         cmd += ' --formats=png,pdf '
+
+        
     # UGH
     # the --process=CMD switch is a bad idea
     # it is too generic for lilypond-book.
@@ -1554,6 +1575,7 @@ def write_file_map (lys, name):
     snippet_map = open ('snippet-map.ly', 'w')
     snippet_map.write ("""
 #(define version-seen #t)
+#(define output-empty-score-list #f)
 #(ly:add-file-name-alist '(
 """)
     for ly in lys:
@@ -1566,7 +1588,7 @@ def write_file_map (lys, name):
 def do_process_cmd (chunks, input_name):
     all_lys = filter (lambda x: is_derived_class (x.__class__,
                            Lilypond_snippet),
-             chunks)
+                      chunks)
 
     write_file_map (all_lys, input_name)
     ly_outdated = filter (lambda x: is_derived_class (x.__class__,
@@ -1762,6 +1784,22 @@ def do_options ():
         
     return args
 
+def psfonts_warning (options, basename):
+    if options.format in (TEXINFO, LATEX):
+        psfonts_file = os.path.join (options.output_name, basename + '.psfonts')
+        output = os.path.join (options.output_name, basename +  '.dvi' )
+
+        if not options.create_pdf:
+            if not options.psfonts:
+                warning (_ ("option --psfonts not used"))
+                warning (_ ("processing with dvips will have no fonts"))
+            else:
+                progress ('\n')
+                progress (_ ("DVIPS usage:"))
+                progress ('\n')
+                progress ("    dvips -h %(psfonts_file)s %(output)s" % vars ())
+                progress ('\n')
+
 def main ():
     # FIXME: 85 lines of `main' macramee??
     files = do_options ()
@@ -1790,15 +1828,16 @@ def main ():
     if global_options.format in (TEXINFO, LATEX):
         ## prevent PDF from being switched on by default.
         global_options.process_cmd += ' --formats=eps '
-        
-    if (global_options.format in (TEXINFO, LATEX)
-        and global_options.create_pdf):
-        global_options.process_cmd += "--pdf -dinclude-eps-fonts -dgs-load-fonts "
+        if global_options.create_pdf:
+            global_options.process_cmd += "--pdf -dinclude-eps-fonts -dgs-load-fonts "
     
     if global_options.verbose:
         global_options.process_cmd += " --verbose "
 
-    global_options.process_cmd += " -dread-file-list -deps-box-padding=-3 "
+    if global_options.padding_mm:
+        global_options.process_cmd += " -deps-box-padding=%f " % global_options.padding_mm
+        
+    global_options.process_cmd += " -dread-file-list "
 
     identify ()
 
@@ -1822,19 +1861,7 @@ def main ():
     except Compile_error:
         exit (1)
 
-    if global_options.format in (TEXINFO, LATEX):
-        psfonts_file = os.path.join (global_options.output_name, basename + '.psfonts')
-        output = os.path.join (global_options.output_name, basename +  '.dvi' )
-        
-        if not global_options.psfonts and not global_options.create_pdf:
-            warning (_ ("option --psfonts not used"))
-            warning (_ ("processing with dvips will have no fonts"))
-        else:
-            progress ('\n')
-            progress (_ ("DVIPS usage:"))
-            progress ('\n')
-            progress ("    dvips -h %(psfonts_file)s %(output)s" % vars ())
-            progress ('\n')
+    psfonts_warning (global_options, basename)
 
     inputs = note_input_file ('')
     inputs.pop ()