X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=scripts%2Flilypond-book.py;h=e9a133338e511b4a609acb71ce54f9839a0a7d75;hb=5467e9976c3c1ed7994b8939308cb0ab5decddb2;hp=5d1b35d46cbad88bade76ee48ed6f9c3c34fd044;hpb=ca2d0a9a20ea2aef0065c10b52319e520a680871;p=lilypond.git diff --git a/scripts/lilypond-book.py b/scripts/lilypond-book.py index 5d1b35d46c..e9a133338e 100644 --- a/scripts/lilypond-book.py +++ b/scripts/lilypond-book.py @@ -1,40 +1,54 @@ #!@PYTHON@ # vim: set noexpandtab: -# TODO: -# * junk --outdir for--output -# * Figure out clean set of options. -# * -# * texinfo: add support for @pagesize -# todo: dimension handling (all the x2y) is clumsy. (tca: Thats -# because the values are taken directly from texinfo.tex, -# geometry.sty and article.cls. Give me a hint, and I'll -# fix it.) +""" -# -# TODO: magnification support should also work for texinfo -> html: eg. add as option to dvips. -# + TODO: + * junk --outdir for--output + * Figure out clean set of options. + * + * texinfo: add support for @pagesize + todo: dimension handling (all the x2y) is clumsy. (tca: Thats + because the values are taken directly from texinfo.tex, + geometry.sty and article.cls. Give me a hint, and I'll + fix it.) -# -# This is a slightly hairy program. The general approach is as follows -# The input string is chopped up in chunks, i.e. , a list of tuples -# -# with the format (TAG_STR, MAIN_STR, OPTIONS, TODO, BASE) -# -# This list is build step by step: first ignore and verbatim commands are handled, -# delivering a list of chunks. -# -# then all chunks containing lilypnod commands are chopped up -# -# when all chunks have their final form, all bodies from lilypond blocks are -# extracted, and if applicable, written do disk and run through lilypond. -# + + TODO: magnification support should also work for texinfo -> html: eg. add as option to dvips. -# This is was the idea for handling of comments: + This is a slightly hairy program. The general approach is as follows + The input string is chopped up in chunks, i.e. , a list of tuples + with the format (TAG_STR, MAIN_STR, OPTIONS, TODO, BASE) + + This list is built step by step: first ignore and verbatim commands + are handled, delivering a list of chunks. + + then all chunks containing lilypond commands are chopped up + + when all chunks have their final form, all bodies from lilypond blocks are + extracted, and if applicable, written do disk and run through lilypond. + + +tags supported + + ignore + lilypond + input + verb + verbatim + multicols + numcols + + + + +""" + +# This is was the idea for handling of comments: # Multiline comments, @ignore .. @end ignore is scanned for # in read_doc_file, and the chunks are marked as 'ignore', so # lilypond-book will not touch them any more. The content of the @@ -364,9 +378,7 @@ output_dict= { ## inline music doesn't. ## possibly other center options? 'output-html': r''' - -[picture of music] -''', +%(pageimages)s''', }, @@ -413,7 +425,8 @@ output_dict= { 'texi' : { - 'output-filename' : r'''@ifnothtml + 'output-filename' : r''' +@ifnothtml @file{%s}:@* @end ifnothtml @ifhtml @@ -446,9 +459,8 @@ output_dict= { \catcode`\@=0 @end tex @html -

-[picture of music] -

+

%(htmlimages)s +

@end html ''', 'output-texi-quoted': r'''@quotation @@ -459,9 +471,8 @@ output_dict= { \catcode`\@=0 @end tex @html - -[picture of music] - +

%(htmlimages)s +

@end html @end quotation ''', @@ -892,7 +903,9 @@ def make_lilypond_file (m): (content, nm) = find_file (m.group ('filename')) options.append ("filename=%s" % nm) + return [('lilypond', content, options)] + def make_ly2dvi_block (m): ''' @@ -958,6 +971,12 @@ def chop_chunks (chunks, re_name, func, use_match=0): return newchunks def determine_format (str): + """ + + SIDE EFFECT! This sets FORMAT and PAPERGURU + + """ + global format if format == '': html = re.search ('(?i)<[dh]tml', str[:200]) @@ -1017,14 +1036,16 @@ def unique_file_name (body): def schedule_lilypond_block (chunk): '''Take the body and options from CHUNK, figure out how the - real .ly should look, and what should be left MAIN_STR (meant - for the main file). The .ly is written, and scheduled in + real .ly should look. The .ly is written, and scheduled in TODO. - Return: a chunk (TYPE_STR, MAIN_STR, OPTIONS, TODO, BASE) + Return: a single chunk. - TODO has format [basename, extension, extension, ... ] + The chunk pertaining to the lilypond output + has the format (TYPE_STR, MAIN_STR, OPTIONS, TODO, BASE), + where TODO has format [basename, extension, extension, ... ] ''' + (type, body, opts) = chunk assert type == 'lilypond' file_body = compose_full_body (body, opts) @@ -1066,8 +1087,28 @@ def schedule_lilypond_block (chunk): todo.append ('eps') if 'png' in needed_filetypes and f (pathbase, '.eps', '.png'): todo.append ('png') - newbody = '' + return ('lilypond', body, opts, todo, basename) + +def format_lilypond_block (chunk): + """ + + Figure out what should be left MAIN_STR (meant + for the main file) from a lilypond chunk: process + verbatim, and other options. Return: multiple chunks. + + + """ + + + return_chunks = [] + + (type, body, opts, todo, basename) = chunk + assert type == 'lilypond' + + + newbody = '' + filename_chunk = None if 'printfilename' in opts: for o in opts: m= re.match ("filename=(.*)", o) @@ -1078,14 +1119,14 @@ def schedule_lilypond_block (chunk): ## todo: include path, but strip ## first part of the path. - newbody = newbody + template % (human_base, b,human_base) + filename_chunk = ('input', template % (human_base, b,human_base)) break if 'smallverbatim' in opts: - newbody = newbody + output_verbatim (body, 1) + newbody += output_verbatim (body, 1) elif 'verbatim' in opts: - newbody = newbody + output_verbatim (body, 0) + newbody += output_verbatim (body, 0) for o in opts: m = re.search ('intertext="(.*?)"', o) @@ -1114,9 +1155,51 @@ def schedule_lilypond_block (chunk): s = 'output-texi-noquote' else: # format == 'html' s = 'output-html' - newbody = newbody + get_output (s) % {'fn': basename } - return ('lilypond', newbody, opts, todo, basename) + def html_pages (basename): + pat = os.path.join (g_outdir, "%s-page*.png"% basename) + + files = glob.glob (pat) + + + template = '''[picture of music]''' + + str = '' + if files == []: + files = [basename+'.png' ] + else: + files = map (os.path.basename, files) + + for f in files: + str += template % f + + str = '%s' % (basename, str) + + return str + + + newbody = newbody + get_output (s) % {'fn': basename, + 'htmlimages': html_pages(basename) + } + + if filename_chunk: + return_chunks += [filename_chunk] + + return_chunks += [('lilypond', newbody, opts, todo, basename)] + + return return_chunks + +def format_lilypond_output_bodies (chunks): + newchunks = [] + for c in chunks: + + if c[0] == 'lilypond': + newchunks += format_lilypond_block (c) + else: + newchunks.append (c) + + return newchunks @@ -1130,7 +1213,9 @@ def process_lilypond_blocks (chunks):#ugh rename paperguru.m_num_cols = c[2] elif c[0] == 'multicols': paperguru.m_multicols = c[2] + newchunks.append (c) + return newchunks def process_ly2dvi_blocks (chunks): @@ -1157,11 +1242,14 @@ linking to the menu. changed = update_file (content, outname) preview = base + ".png" - if changed or not os.path.isfile (preview): + preview_page = base + '-page1.png' + + if changed or not (os.path.isfile (preview) or + os.path.isfile (preview_page)): ly.system ('%s --preview --postscript --verbose %s ' % (ly2dvi_binary, base) ) - ly.make_page_images (base) + ly.make_ps_images (base) ly.system ('gzip -9 - < %s.ps > %s.ps.gz' % (base, base)) def size_str (fn): @@ -1243,6 +1331,7 @@ def compile_all_files (chunks): for c in chunks: if c[0] != 'lilypond': continue + base = c[4] exts = c[3] for e in exts: @@ -1302,7 +1391,7 @@ def compile_all_files (chunks): ly.system ("dvips -E -o %s.eps %s" % (file, file)) map (to_eps, eps) - map (ly.make_preview, png) + map (ly.make_ps_images, map (lambda x: x + '.eps', png)) os.chdir (d) @@ -1345,6 +1434,8 @@ def write_deps (fn, target, chunks): read_files = [] def check_texidoc (chunks): + ## TODO: put file name in front of texidoc. + ## n = [] for c in chunks: if c[0] == 'lilypond': @@ -1352,8 +1443,7 @@ def check_texidoc (chunks): pathbase = os.path.join (g_outdir, basename) if os.path.isfile (pathbase + '.texidoc') \ and 'notexidoc' not in opts: - body = '\n@include %s.texidoc\n' % basename + body - c = (type, body, opts, todo, basename) + n.append( ('input', '\n@include %s.texidoc\n' % basename)) n.append (c) return n @@ -1398,9 +1488,7 @@ def do_file (input_filename): chunks = chop_chunks (chunks, 'preamble-end', do_preamble_end) chunks = chop_chunks (chunks, 'numcols', do_columns) chunks = chop_chunks (chunks, 'multicols', do_multicols) - #print "-" * 50 - #for c in chunks: print "c:", c; - #sys.exit () + scan_preamble (chunks) chunks = process_lilypond_blocks (chunks) chunks = process_ly2dvi_blocks (chunks) @@ -1411,10 +1499,13 @@ def do_file (input_filename): compile_all_files (chunks) chunks = fix_epswidth (chunks) + + chunks = format_lilypond_output_bodies (chunks) global format if format == 'texi': chunks = check_texidoc (chunks) + x = 0 chunks = completize_preamble (chunks) @@ -1530,6 +1621,7 @@ if not files: ly.setup_environment () + for input_filename in files: do_file (input_filename)