X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scripts%2Flilypond-book.py;h=7667d4c30231849f9e267c6dae6d4dd0f4c520d6;hb=1416542b6affdd5ca52a63072aaceee2efdc6c6c;hp=7f8a8f4fb4106f983a1a89285a0a6f752e9c27fb;hpb=d2178c2c4a3c8650cefe886e2574b38912749764;p=lilypond.git diff --git a/scripts/lilypond-book.py b/scripts/lilypond-book.py index 7f8a8f4fb4..7667d4c302 100644 --- a/scripts/lilypond-book.py +++ b/scripts/lilypond-book.py @@ -17,7 +17,7 @@ TODO: * this script is too complex. Modularize. * ly-options: intertext? - * --linewidth? + * --line-width? * eps in latex / eps by lilypond -b ps? * check latex parameters, twocolumn, multicolumn? * use --png --ps --pdf for making images? @@ -140,7 +140,7 @@ HTML = 'html' INDENT = 'indent' LATEX = 'latex' LAYOUT = 'layout' -LINEWIDTH = 'linewidth' +LINE_WIDTH = 'line-width' NOFRAGMENT = 'nofragment' NOINDENT = 'noindent' NOQUOTE = 'noquote' @@ -153,7 +153,7 @@ PAPER = 'paper' PREAMBLE = 'preamble' PRINTFILENAME = 'printfilename' QUOTE = 'quote' -RAGGEDRIGHT = 'raggedright' +RAGGED_RIGHT = 'ragged-right' RELATIVE = 'relative' STAFFSIZE = 'staffsize' TEXIDOC = 'texidoc' @@ -415,11 +415,11 @@ ly_options = { PAPER: { INDENT: r'''indent = %(indent)s''', - LINEWIDTH: r'''linewidth = %(linewidth)s''', + LINE_WIDTH: r'''line-width = %(line-width)s''', - QUOTE: r'''linewidth = %(linewidth)s - 2.0 * %(exampleindent)s''', + QUOTE: r'''line-width = %(line-width)s - 2.0 * %(exampleindent)s''', - RAGGEDRIGHT: r'''raggedright = ##t''', + RAGGED_RIGHT: r'''ragged-right = ##t''', PACKED: r'''packed = ##t''', }, @@ -475,21 +475,21 @@ output = { ## LATEX: { - OUTPUT: r'''{ -\parindent 0pt -\catcode`\@=12 -\ifx\preLilyPondExample \undefined - \relax -\else - \preLilyPondExample -\fi -\def\lilypondbook{} -\input %(base)s-systems.tex -\ifx\postLilyPondExample \undefined - \relax -\else - \postLilyPondExample -\fi + OUTPUT: r'''{%% +\parindent 0pt%% +\catcode`\@=12%% +\ifx\preLilyPondExample \undefined%% + \relax%% +\else%% + \preLilyPondExample%% +\fi%% +\def\lilypondbook{}%% +\input %(base)s-systems.tex%% +\ifx\postLilyPondExample \undefined%% + \relax%% +\else%% + \postLilyPondExample%% +\fi%% }''', PRINTFILENAME: '''\\texttt{%(filename)s} @@ -550,13 +550,15 @@ output = { }, } -PREAMBLE_LY = r'''%%%% Generated by %(program_name)s +PREAMBLE_LY = '''%%%% Generated by %(program_name)s %%%% Options: [%(option_string)s] #(set! toplevel-score-handler print-score-with-defaults) -#(set! toplevel-music-handler (lambda (p m) - (print-score-with-defaults - p (scorify-music m p)))) +#(set! toplevel-music-handler + (lambda (p m) + (if (not (eq? (ly:music-property m \'void) #t)) + (print-score-with-defaults + p (scorify-music m p))))) #(ly:set-option (quote no-point-and-click)) #(define inside-lilypond-book #t) @@ -614,7 +616,7 @@ FULL_LY = ''' %% **************************************************************** ''' -texinfo_linewidths = { +texinfo_line_widths = { '@afourpaper': '160\\mm', '@afourwide': '6.5\\in', '@afourlatex': '150\\mm', @@ -624,7 +626,7 @@ texinfo_linewidths = { def classic_lilypond_book_compatibility (key, value): if key == 'singleline' and value == None: - return (RAGGEDRIGHT, None) + return (RAGGED_RIGHT, None) m = re.search ('relative\s*([-0-9])', key) if m: @@ -634,7 +636,7 @@ def classic_lilypond_book_compatibility (key, value): if m: return ('staffsize', m.group (1)) - if key == 'indent' or key == 'linewidth': + if key == 'indent' or key == 'line-width': m = re.match ('([-.0-9]+)(cm|in|mm|pt|staffspace)', value) if m: f = float (m.group (1)) @@ -673,18 +675,15 @@ def split_options (option_string): option_string) return [] -def invokes_lilypond (): - return re.search ('^[\'\"0-9A-Za-z/]*lilypond', process_cmd) - def set_default_options (source): global default_ly_options - if not default_ly_options.has_key (LINEWIDTH): + if not default_ly_options.has_key (LINE_WIDTH): if format == LATEX: textwidth = get_latex_textwidth (source) - default_ly_options[LINEWIDTH] = \ + default_ly_options[LINE_WIDTH] = \ '''%.0f\\pt''' % textwidth elif format == TEXINFO: - for (k, v) in texinfo_linewidths.items (): + for (k, v) in texinfo_line_widths.items (): # FIXME: @layout is usually not in # chunk #0: # @@ -694,7 +693,7 @@ def set_default_options (source): # source. # s = chunks[0].replacement_text () if re.search (k, source[:1024]): - default_ly_options[LINEWIDTH] = v + default_ly_options[LINE_WIDTH] = v break class Chunk: @@ -790,42 +789,42 @@ class Lilypond_snippet (Snippet): else: self.option_dict[i] = None - has_linewidth = self.option_dict.has_key (LINEWIDTH) - no_linewidth_value = 0 + has_line_width = self.option_dict.has_key (LINE_WIDTH) + no_line_width_value = 0 - # If LINEWIDTH is used without parameter, set it to default. - if has_linewidth and self.option_dict[LINEWIDTH] == None: - no_linewidth_value = 1 - del self.option_dict[LINEWIDTH] + # If LINE_WIDTH is used without parameter, set it to default. + if has_line_width and self.option_dict[LINE_WIDTH] == None: + no_line_width_value = 1 + del self.option_dict[LINE_WIDTH] for i in default_ly_options.keys (): if i not in self.option_dict.keys (): self.option_dict[i] = default_ly_options[i] - if not has_linewidth: + if not has_line_width: if type == 'lilypond' or FRAGMENT in self.option_dict.keys (): - self.option_dict[RAGGEDRIGHT] = None + self.option_dict[RAGGED_RIGHT] = None if type == 'lilypond': - if LINEWIDTH in self.option_dict.keys (): - del self.option_dict[LINEWIDTH] + if LINE_WIDTH in self.option_dict.keys (): + del self.option_dict[LINE_WIDTH] else: - if RAGGEDRIGHT in self.option_dict.keys (): - if LINEWIDTH in self.option_dict.keys (): - del self.option_dict[LINEWIDTH] + if RAGGED_RIGHT in self.option_dict.keys (): + if LINE_WIDTH in self.option_dict.keys (): + del self.option_dict[LINE_WIDTH] if QUOTE in self.option_dict.keys () or type == 'lilypond': - if LINEWIDTH in self.option_dict.keys (): - del self.option_dict[LINEWIDTH] + if LINE_WIDTH in self.option_dict.keys (): + del self.option_dict[LINE_WIDTH] if not INDENT in self.option_dict.keys (): self.option_dict[INDENT] = '0\\mm' - # The QUOTE pattern from ly_options only emits the `linewidth' + # The QUOTE pattern from ly_options only emits the `line-width' # keyword. - if has_linewidth and QUOTE in self.option_dict.keys (): - if no_linewidth_value: - del self.option_dict[LINEWIDTH] + if has_line_width and QUOTE in self.option_dict.keys (): + if no_line_width_value: + del self.option_dict[LINE_WIDTH] else: del self.option_dict[QUOTE] @@ -862,7 +861,7 @@ class Lilypond_snippet (Snippet): # To set @exampleindent locally to zero, we use the @format # environment for non-quoted snippets. override[EXAMPLEINDENT] = r'0.4\in' - override[LINEWIDTH] = texinfo_linewidths['@smallbook'] + override[LINE_WIDTH] = texinfo_line_widths['@smallbook'] override.update (default_ly_options) option_list = [] @@ -1081,8 +1080,8 @@ class Lilypond_snippet (Snippet): verb = self.substring ('code') str += (output[LATEX][VERBATIM] % vars ()) elif srcltx_p: - breaks = self.substring ('code').count ("\n") - str += "".ljust (breaks, "\n").replace("\n","%\n") + breaks = self.ly ().count ("\n") + str += "".ljust (breaks, "\n").replace ("\n","%\n") str += (output[LATEX][OUTPUT] % vars ()) if QUOTE in self.option_dict: str = output[LATEX][QUOTE] % vars () @@ -1135,7 +1134,7 @@ class Lilypond_snippet (Snippet): class Lilypond_file_snippet (Lilypond_snippet): def ly (self): name = self.substring ('filename') - return '\\renameinput \"%s\"\n%s' \ + return '\\sourcefilename \"%s\"\n%s' \ % (name, open (find_file (name)).read ()) snippet_type_to_class = { @@ -1301,7 +1300,7 @@ def process_snippets (cmd, ly_snippets, texstr_snippets, png_snippets): # UGH # the --process=CMD switch is a bad idea # it is too generic for lilypond-book. - if texstr_names and invokes_lilypond: + if texstr_names: my_system (string.join ([cmd, '--backend texstr', 'snippet-map.ly'] + texstr_names)) for l in texstr_names: @@ -1465,6 +1464,10 @@ def write_if_updated (file_name, lines): open (file_name, 'w').writelines (lines) ly.progress ('\n') +def note_input_file (name, inputs=[]): + inputs.append (name) + return inputs + def do_file (input_filename): # Ugh. if not input_filename or input_filename == '-': @@ -1479,6 +1482,8 @@ def do_file (input_filename): + input_filename)[:-1] else: input_fullname = find_file (input_filename) + + note_input_file (input_fullname) in_handle = open (input_fullname) if input_filename == '-': @@ -1656,7 +1661,7 @@ def main (): try: chunks = do_file (file) - if psfonts_p and invokes_lilypond (): + if psfonts_p: fontextract.verbose = verbose_p snippet_chunks = filter (lambda x: is_derived_class (x.__class__, Lilypond_snippet), @@ -1688,5 +1693,15 @@ def main (): ly.progress (" dvips -h %(psfonts_file)s %(output)s" % vars ()) ly.progress ('\n') + inputs = note_input_file ('') + inputs.pop () + dep_file = os.path.join (output_name, os.path.splitext (file)[0] + '.dep') + final_output_file = os.path.join (output_name, + os.path.splitext (os.path.basename (file))[0] + + '.%s' % format) + + os.chdir (original_dir) + open (dep_file, 'w').write ('%s: %s' % (final_output_file, ' '.join (inputs))) + if __name__ == '__main__': main ()