X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scripts%2Flilypond-book.py;h=bdb0637d17ee418424e1d1e83eb5fc91f96315e7;hb=ece2e45d587f63565e81af44e1937ebe1f5e47a8;hp=340c1f0e442910a7ffbf932c50675c0314da2c7f;hpb=cc18fd6f82df460cc31695c4c31f47f45b7e434e;p=lilypond.git diff --git a/scripts/lilypond-book.py b/scripts/lilypond-book.py index 340c1f0e44..bdb0637d17 100644 --- a/scripts/lilypond-book.py +++ b/scripts/lilypond-book.py @@ -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 @@ -88,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) @@ -108,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,12 +124,18 @@ def get_option_parser (): 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"), + metavar=_ ("PAD"), dest="padding_mm", - help="Pad left side of music to align music inspite of uneven bar numbers. (in mm)", + help=_ ("pad left side of music to align music inspite of uneven bar numbers (in mm)"), type="float", - default=-3.0) + default=3.0) p.add_option ("-o", '--output', help=_ ("write output to DIR"), metavar=_ ("DIR"), @@ -154,11 +145,11 @@ def get_option_parser (): p.add_option ('-P', '--process', metavar=_ ("COMMAND"), help = _ ("process ly_files using COMMAND FILE..."), action='store', - dest='process_cmd', default='lilypond -b 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 @@ -171,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''')) @@ -202,6 +193,7 @@ INDENT = 'indent' LATEX = 'latex' LAYOUT = 'layout' LINE_WIDTH = 'line-width' +LILYQUOTE = 'lilyquote' NOFRAGMENT = 'nofragment' NOINDENT = 'noindent' NOQUOTE = 'noquote' @@ -524,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''', @@ -639,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

@@ -690,17 +684,14 @@ 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 @@ -889,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' @@ -1092,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 () @@ -1109,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): @@ -1184,7 +1177,7 @@ class Lilypond_snippet (Snippet): else: str = '' + str + '' 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 @@ -1194,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 () @@ -1216,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 () @@ -1228,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 ()) @@ -1266,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') @@ -1286,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, @@ -1413,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: @@ -1448,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. @@ -1563,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: @@ -1575,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__,