OUTPUT = 'output'
OUTPUTIMAGE = 'outputimage'
PAPER = 'paper'
+PAPERSIZE = 'papersize'
PREAMBLE = 'preamble'
PRINTFILENAME = 'printfilename'
QUOTE = 'quote'
##
PAPER: {
+ PAPERSIZE: r'''#(set-paper-size "%(papersize)s")''',
INDENT: r'''indent = %(indent)s''',
LINE_WIDTH: r'''line-width = %(line-width)s''',
QUOTE: r'''line-width = %(line-width)s - 2.0 * %(exampleindent)s''',
elif relative > 0:
relative_quotes += "'" * relative
+ # put paper-size first, if it exists
+ for i,elem in enumerate(compose_dict[PAPER]):
+ if elem.startswith("#(set-paper-size"):
+ compose_dict[PAPER].insert(0, compose_dict[PAPER].pop(i))
+ break
+
paper_string = '\n '.join (compose_dict[PAPER]) % override
layout_string = '\n '.join (compose_dict[LAYOUT]) % override
notes_string = '\n '.join (compose_dict[NOTES]) % vars ()
os.makedirs (dst_path)
os.link (src, dst)
+ def additional_files_to_consider (self, base, full):
+ return []
+ def additional_files_required (self, base, full):
+ return []
+
def all_output_files (self, output_dir, output_dir_files):
"""Return all files generated in lily_output_dir, a set.
# UGH - junk self.global_options
skip_lily = self.global_options.skip_lilypond_run
- for required in [base + '.ly',
- base + '.txt']:
+ for required in [base + '.ly']:
require_file (required)
if not skip_lily:
require_file (base + '-systems.count')
if 'ddump-signature' in self.global_options.process_cmd:
consider_file (systemfile + '.signature')
+ map (consider_file, self.additional_files_to_consider (base, full))
+ map (require_file, self.additional_files_required (base, full))
return (result, missing)
"""Pass input through cmd, and return the result."""
if self.global_options.verbose:
- progress (_ ("Opening filter `%s'\n") % cmd)
+ progress (_ ("Running through filter `%s'\n") % cmd)
# TODO: Use Popen once we resolve the problem with msvcrt in Windows:
(stdin, stdout, stderr) = os.popen3 (cmd)
status = 0
output = stdout.read ()
status = stdout.close ()
- error = stderr.read ()
+ err = stderr.read ()
if not status:
status = 0
signal = 0x0f & status
- if status or (not output and error):
+ if status or (not output and err):
exit_status = status >> 8
ly.error (_ ("`%s' failed (%d)") % (cmd, exit_status))
ly.error (_ ("The error log is as follows:"))
- ly.stderr_write (error)
+ ly.stderr_write (err)
ly.stderr_write (stderr.read ())
exit (status)
class LilypondFileSnippet (LilypondSnippet):
def __init__ (self, type, match, formatter, line_number, global_options):
LilypondSnippet.__init__ (self, type, match, formatter, line_number, global_options)
- self.contents = file (BookBase.find_file (self.substring ('filename'), global_options.include_path)).read ()
+ self.filename = self.substring ('filename')
+ self.ext = os.path.splitext (os.path.basename (self.filename))[1]
+ self.contents = file (BookBase.find_file (self.filename, global_options.include_path)).read ()
def get_snippet_code (self):
return self.contents;
return s
def ly (self):
- name = self.substring ('filename')
+ name = self.filename
return ('\\sourcefilename \"%s\"\n\\sourcefileline 0\n%s'
% (name, self.contents))
def final_basename (self):
if self.global_options.use_source_file_names:
- base = os.path.splitext (os.path.basename (self.substring ('filename')))[0]
+ base = os.path.splitext (os.path.basename (self.filename))[0]
return base
else:
return self.basename ()
+class MusicXMLFileSnippet (LilypondFileSnippet):
+ def __init__ (self, type, match, formatter, line_number, global_options):
+ LilypondFileSnippet.__init__ (self, type, match, formatter, line_number, global_options)
+ self.compressed = False
+ self.converted_ly = None
+ self.musicxml_options_dict = {
+ 'verbose': '--verbose',
+ 'lxml': '--lxml',
+ 'compressed': '--compressed',
+ 'relative': '--relative',
+ 'absolute': '--absolute',
+ 'no-articulation-directions': '--no-articulation-directions',
+ 'no-rest-positions': '--no-rest-positions',
+ 'no-page-layout': '--no-page-layout',
+ 'no-beaming': '--no-beaming',
+ 'language': '--language',
+ }
+
+ def snippet_options (self):
+ return self.musicxml_options_dict.keys ()
+
+ def convert_from_musicxml (self):
+ name = self.filename
+ option_list = []
+ for (key, value) in self.option_dict.items ():
+ cmd_key = self.musicxml_options_dict.get (key, None)
+ if cmd_key == None:
+ continue
+ if value == None:
+ option_list.append (cmd_key)
+ else:
+ option_list.append (cmd_key + '=' + value)
+ if ('.mxl' in name) and ('--compressed' not in option_list):
+ option_list.append ('--compressed')
+ self.compressed = True
+ opts = " ".join (option_list)
+ progress (_ ("Converting MusicXML file `%s'...\n") % self.filename)
+
+ ly_code = self.filter_pipe (self.contents, 'musicxml2ly %s --out=- - ' % opts)
+ return ly_code
+
+ def ly (self):
+ if self.converted_ly == None:
+ self.converted_ly = self.convert_from_musicxml ()
+ name = self.filename
+ return ('\\sourcefilename \"%s\"\n\\sourcefileline 0\n%s'
+ % (name, self.converted_ly))
+
+ def additional_files_required (self, base, full):
+ result = [];
+ if self.compressed:
+ result.append (base + '.mxl')
+ else:
+ result.append (base + '.xml')
+ return result
+
+ def write_ly (self):
+ base = self.basename ()
+ path = os.path.join (self.global_options.lily_output_dir, base)
+ directory = os.path.split(path)[0]
+ if not os.path.isdir (directory):
+ os.makedirs (directory)
+
+ # First write the XML to a file (so we can link it!)
+ if self.compressed:
+ xmlfilename = path + '.mxl'
+ else:
+ xmlfilename = path + '.xml'
+ if os.path.exists (xmlfilename):
+ diff_against_existing = self.filter_pipe (self.contents, 'diff -u %s - ' % xmlfilename)
+ if diff_against_existing:
+ warning ("%s: duplicate filename but different contents of orginal file,\n\
+printing diff against existing file." % xmlfilename)
+ ly.stderr_write (diff_against_existing)
+ else:
+ out = file (xmlfilename, 'w')
+ out.write (self.contents)
+ out.close ()
+
+ # also write the converted lilypond
+ filename = path + '.ly'
+ if os.path.exists (filename):
+ diff_against_existing = self.filter_pipe (self.full_ly (), 'diff -u %s -' % filename)
+ if diff_against_existing:
+ warning ("%s: duplicate filename but different contents of converted lilypond file,\n\
+printing diff against existing file." % filename)
+ ly.stderr_write (diff_against_existing)
+ else:
+ out = file (filename, 'w')
+ out.write (self.full_ly ())
+ out.close ()
+
+
class LilyPondVersionString (Snippet):
"""A string that does not require extra memory."""
def __init__ (self, type, match, formatter, line_number, global_options):
'lilypond': LilypondSnippet,
'include': IncludeSnippet,
'lilypondversion': LilyPondVersionString,
+ 'musicxml_file': MusicXMLFileSnippet,
}