X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scripts%2Flilypond-book.py;h=23db86898596e024d27ebf73901e40ae26725240;hb=2f996385b21b9d5006c7369c2c496ccbee001e97;hp=459900124169d8109192904393938e8c4b0f1c13;hpb=b718ddc0c9e7f4bbdec5ee7b57ffb84ac82ad59e;p=lilypond.git diff --git a/scripts/lilypond-book.py b/scripts/lilypond-book.py index 4599001241..23db868985 100644 --- a/scripts/lilypond-book.py +++ b/scripts/lilypond-book.py @@ -29,13 +29,13 @@ TODO: ''' import stat -import string import tempfile import commands import os import sys import re import md5 +import operator """ @relocate-preamble@ @@ -69,32 +69,31 @@ authors = ('Jan Nieuwenhuizen ', ################################################################ def exit (i): if global_options.verbose: - raise _ ('Exiting (%d)...') % i + raise Exception (_ ('Exiting (%d)...') % i) else: 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) m = re.search ('\n%%Pages: ([0-9]+)', header) if m: - return string.atoi (m.group (1)) + return int (m.group (1)) return 0 def warranty (): identify () - sys.stdout.write (''' + ly.encoded_write (sys.stdout, ''' %s %s @@ -108,27 +107,39 @@ def warranty (): def get_option_parser (): p = ly.get_option_parser (usage=_ ("%s [OPTION]... FILE") % 'lilypond-book', - version="@TOPLEVEL_VERSION@", - description=help_summary) + description=help_summary, + add_help_option=False) p.add_option ('-F', '--filter', metavar=_ ("FILTER"), action="store", dest="filter_cmd", help=_ ("pipe snippets through FILTER [convert-ly -n -]"), default=None) + p.add_option ('-f', '--format', help=_ ("use output format FORMAT (texi [default], texi-html, latex, html, docbook)"), action='store') - + + p.add_option("-h", "--help", + action="help", + help=_ ("show this help and exit")) + p.add_option ("-I", '--include', help=_ ("add DIR to include path"), 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"), + 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) @@ -141,23 +152,32 @@ def get_option_parser (): help = _ ("process ly_files using COMMAND FILE..."), action='store', 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 must use this with dvips -h INPUT.psfonts'''), default=None) + p.add_option ('-V', '--verbose', help=_ ("be verbose"), action="store_true", default=False, dest="verbose") + + p.version = "@TOPLEVEL_VERSION@" + p.add_option("--version", + action="version", + help=_ ("show version number and exit")) + p.add_option ('-w', '--warranty', help=_ ("show warranty and copyright"), action='store_true') - p.add_option_group ('bugs', + p.add_option_group (ly.display_encode (_ ('Bugs')), description=(_ ("Report bugs via") + ''' http://post.gmane.org/post.php''' '''?group=gmane.comp.gnu.lilypond.bugs\n''')) @@ -188,6 +208,7 @@ INDENT = 'indent' LATEX = 'latex' LAYOUT = 'layout' LINE_WIDTH = 'line-width' +LILYQUOTE = 'lilyquote' NOFRAGMENT = 'nofragment' NOINDENT = 'noindent' NOQUOTE = 'noquote' @@ -248,9 +269,6 @@ snippet_res = { (?P <(?P(inline)?)mediaobject>\s*\s*.*?\.ly)"\s*(role="(?P.*?)")?\s*(/>|>\s*)\s*\s*)''', - 'lilypond_version': - no_match, - 'multiline_comment': r'''(?smx) (?P @@ -266,6 +284,7 @@ snippet_res = { 'verbatim': no_match, + }, ## HTML: { @@ -298,9 +317,6 @@ snippet_res = { \s*(?P.*?)\s* )''', - 'lilypond_version': - r'''(?mx)(?P)''', - 'multiline_comment': r'''(?smx) (?P @@ -367,9 +383,6 @@ snippet_res = { (?P\S+?) })''', - 'lilypond_version': - r'''(?P\\lilypond_version)''', - 'multiline_comment': no_match, @@ -438,9 +451,6 @@ snippet_res = { (?P\S+) })''', - 'lilypond_version': - r'''(?mx)(?P@lilypondversion)''', - 'multiline_comment': r'''(?smx) ^(?P @@ -521,6 +531,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''', @@ -636,7 +648,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

@@ -767,14 +779,15 @@ def classic_lilypond_book_compatibility (key, value): return (None, None) -def find_file (name): +def find_file (name, raise_error=True): for i in global_options.include_path: full = os.path.join (i, name) if os.path.exists (full): return full - error (_ ("file not found: %s") % name + '\n') - exit (1) + if raise_error: + error (_ ("file not found: %s") % name + '\n') + exit (1) return '' def verbatim_html (s): @@ -883,6 +896,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' @@ -991,7 +1007,7 @@ class Lilypond_snippet (Snippet): option_list.append (key) else: option_list.append (key + '=' + value) - option_string = string.join (option_list, ',') + option_string = ','.join (option_list) compose_dict = {} compose_types = [NOTES, PREAMBLE, LAYOUT, PAPER] @@ -1047,14 +1063,10 @@ class Lilypond_snippet (Snippet): elif relative > 0: relative_quotes += "'" * relative - paper_string = string.join (compose_dict[PAPER], - '\n ') % override - layout_string = string.join (compose_dict[LAYOUT], - '\n ') % override - notes_string = string.join (compose_dict[NOTES], - '\n ') % vars () - preamble_string = string.join (compose_dict[PREAMBLE], - '\n ') % override + paper_string = '\n '.join (compose_dict[PAPER]) % override + layout_string = '\n '.join (compose_dict[LAYOUT]) % override + notes_string = '\n '.join (compose_dict[NOTES]) % vars () + preamble_string = '\n '.join (compose_dict[PREAMBLE]) % override padding_mm = global_options.padding_mm font_dump_setting = '' if FONTLOAD in self.option_dict: @@ -1086,14 +1098,13 @@ 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 () - ly_file = base + '.ly' - tex_file = base + '.tex' - eps_file = base + '.eps' - systems_file = base + '-systems.tex' + ly_file = find_file (base + '.ly', raise_error=False) + tex_file = find_file (base + '.tex', raise_error=False) + systems_file = find_file (base + '-systems.tex', raise_error=False) if (os.path.exists (ly_file) and os.path.exists (systems_file) @@ -1108,33 +1119,26 @@ class Lilypond_snippet (Snippet): def png_is_outdated (self): base = self.basename () - # FIXME: refactor stupid OK stuff - ok = not self.ly_is_outdated () - if global_options.format in (HTML, TEXINFO): - ok = ok and os.path.exists (base + '.eps') - - page_count = 0 - if ok: - page_count = ps_page_count (base + '.eps') - - if page_count <= 1: - ok = ok and os.path.exists (base + '.png') - - elif page_count > 1: - for a in range (1, page_count + 1): - ok = ok and os.path.exists (base + '-page%d.png' % a) - - return not ok + eps_file = find_file (base + '.eps', raise_error=False) + png_file = find_file (base + '.png', raise_error=False) + if not self.ly_is_outdated () and global_options.format in (HTML, TEXINFO): + if os.path.exists (eps_file): + page_count = ps_page_count (eps_file) + if page_count <= 1: + return not os.path.exists (png_file) + else: + return not reduce (operator.or_, + [find_file (base + '-page%d.png' % a, raise_error=False) + for a in range (1, page_count + 1)]) + return True def texstr_is_outdated (self): if backend == 'ps': return 0 - # FIXME: refactor stupid OK stuff base = self.basename () - ok = self.ly_is_outdated () - ok = ok and (os.path.exists (base + '.texstr')) - return not ok + return not (self.ly_is_outdated () + and find_file (base + '.texstr', raise_error=False)) def filter_text (self): code = self.substring ('code') @@ -1177,7 +1181,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 @@ -1187,7 +1191,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 () @@ -1209,6 +1213,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 () @@ -1221,7 +1226,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 ()) @@ -1259,13 +1264,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') @@ -1279,21 +1287,29 @@ 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)) -class Version_snippet (Snippet): - def replacement_text (self): - return (program_version) snippet_type_to_class = { 'lilypond_file': Lilypond_file_snippet, 'lilypond_block': Lilypond_snippet, - 'lilypond_version': Version_snippet, 'lilypond': Lilypond_snippet, 'include': Include_snippet, } @@ -1411,8 +1427,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: @@ -1456,16 +1472,16 @@ def process_snippets (cmd, ly_snippets, texstr_snippets, png_snippets): # the --process=CMD switch is a bad idea # it is too generic for lilypond-book. if texstr_names: - my_system (string.join ([cmd, '--backend texstr', - 'snippet-map.ly'] + texstr_names)) + my_system (' '.join ([cmd, '--backend texstr', + 'snippet-map.ly'] + texstr_names)) for l in texstr_names: my_system ('latex %s.texstr' % l) if ly_names: open ('snippet-names', 'wb').write ('\n'.join (['snippet-map.ly'] - + ly_names)) + + ly_names)) - my_system (string.join ([cmd, 'snippet-names'])) + my_system (' '.join ([cmd, 'snippet-names'])) LATEX_INSPECTION_DOCUMENT = r''' @@ -1621,7 +1637,7 @@ def write_if_updated (file_name, lines): try: f = open (file_name) oldstr = f.read () - new_str = string.join (lines, '') + new_str = ''.join (lines) if oldstr == new_str: progress (_ ("%s is up to date.") % file_name) progress ('\n') @@ -1704,7 +1720,6 @@ def do_file (input_filename): # 'verb', 'singleline_comment', 'lilypond_file', - 'lilypond_version', 'include', 'lilypond', ) @@ -1811,7 +1826,7 @@ def main (): + ' --formats=%s --backend eps ' % formats) if global_options.process_cmd: - global_options.process_cmd += string.join ([(' -I %s' % ly.mkarg (p)) + global_options.process_cmd += ' '.join ([(' -I %s' % ly.mkarg (p)) for p in global_options.include_path]) if global_options.format in (TEXINFO, LATEX):