import sys
import __main__
-outdir = 'out'
+
initfile = ''
program_version = '@TOPLEVEL_VERSION@'
cwd = os.getcwd ()
include_path = [cwd]
+dep_prefix = ''
# TODO: Figure out clean set of options.
('', 'M', 'dependencies', 'write dependencies'),
('', 'n', 'no-lily', 'don\'t run lilypond'),
('FILE', 'o', 'outname', 'prefix for filenames'),
- ('', 'v', 'version', 'print version information' )
+ ('', 'v', 'version', 'print version information' ),
+ ('PREF', '', 'dep-prefix', 'prepend PREF before each -M dependency')
]
format = ''
run_lilypond = 1
+use_hash = 1
no_match = 'a\ba'
# format specific strings, ie. regex-es for input, and % strings for output
}
>
\end{mudela}""",
- 'output-mudela':r"""\begin%s{mudela}
+ 'output-mudela':r"""\begin[%s]{mudela}
%s
\end{mudela}""",
'output-verbatim': r"""\begin{verbatim}%s\end{verbatim}""",
return get_output ('output-verbatim') % body
re_dict = {
- 'latex': {'input': '\\\\input{?([^}\t \n}]*)',
- 'include': '\\\\include{([^}]+)}',
+ 'latex': {'input': '\\\\mbinput{?([^}\t \n}]*)',
+ 'include': '\\\\mbinclude{([^}]+)}',
'comma-sep' : ', *',
'header': r"""\\documentclass(\[.*?\])?""",
'def-post-re': r"""\\def\\postMudelaExample""",
'def-pre-re': r"""\\def\\preMudelaExample""",
},
- 'texi': {'input': '@include[ \n\t]+([^\t \n]*)',
+
+ 'texi': {
+ 'input': '@mbinclude[ \n\t]+([^\t \n]*)',# disabled
'include': no_match,
'header': no_match,
'preamble-end': no_match,
'mudela-file': '@mudelafile(\[[^\\]]+\])?{([^}]+)}',
'mudela' : '@mudela(\[.*?\])?{(.*?)}',
'mudela-block': r"""(?s)@mudela(\[.*?\])?(.*?)@end mudela""",
- 'interesting-cs': r"""[\\@](node|mudelagraphic)""",
+ 'interesting-cs': r"""[\\@](chapter|section)""",
'comma-sep' : ', *',
}
}
fd = open(fname)
except IOError:
error ("Error opening `%s'" % fname)
- str = fd.read (-1)
+ str = fd.read ()
s = re.search('%%BoundingBox: ([0-9]+) ([0-9]+) ([0-9]+) ([0-9]+)', str)
if s:
return (int(s.group(3))-int(s.group(1)),
return (0,0)
+
+read_files = []
def find_file (name):
+ f = None
for a in include_path:
try:
nm = os.path.join (a, name)
f = open (nm)
- return nm
+ __main__.read_files.append (nm)
+ break
except IOError:
pass
- return ''
+
+
+ if f:
+ return f.read ()
+ else:
+ error ("File not found `%s'\n" % name)
+ return ''
def error (str):
sys.stderr.write (str + "\n Exiting ... \n\n")
latex_size = string.atoi (m.group (1))
+
if 'twocolumn' in opts:
cols = 2
# urg: breaks on \include of full score
# Use nofly option if you want to \include full score.
- if not 'nofly' in opts and not re.search ('\\\\score', body):
- opts.append ('fly')
+ if 'nofly' not in opts and not re.search ('\\\\score', body):
+ opts.append ('fragment')
- if 'fragment' in opts or 'singleline' in opts:
+ if 'fragment' in opts and 'nosingleline' not in opts:
+ opts.append ('singleline')
+
+ if 'singleline' in opts:
l = -1.0;
else:
l = latex_linewidths[cols][paper][latex_size]
- if 'fly' in opts:
+ if 'relative' in opts:
+ body = '\\relative c { %s }' % body
+
+
+ if 'fragment' in opts:
body = r"""\score {
- \notes\relative c {
- %s
- }
+ \notes { %s }
\paper { }
}""" % body
opts = uniq (opts)
optstring = string.join (opts, ' ')
optstring = re.sub ('\n', ' ', optstring)
-
+
body = r"""
%% Generated by mudela-book.py; options are %s
\include "paper%d.ly"
chunks.append (('input', str[: m.start (0)]))
chunks.append (('input', surround))
- chunks = chunks + read_doc_file (m.group (1))
+ chunks = chunks + read_doc_file (m.group (1))
+
chunks.append (('input', surround))
str = str [m.end (0):]
def read_doc_file (filename):
"""Read the input file, substituting for \input, \include, \mudela{} and \mudelafile"""
str = ''
- for ext in ['', '.tex', '.doc', '.tely']:
- try:
- f = open(filename+ ext)
- str = f.read (-1)
- except:
- pass
-
-
- if not str:
- error ("File not found `%s'\n" % filename)
-
- retdeps = [filename]
+ str = find_file(filename)
if __main__.format == '':
latex = re.search ('\\\\document', str[:200])
newchunks = []
for c in chunks:
if c[0] == 'input':
- ch = func (c[1])
- newchunks = newchunks + ch
+ newchunks = newchunks + func (c[1])
else:
newchunks.append (c)
chunks = newchunks
def find_verbatim_chunks (str):
"""Chop STR into a list of tagged chunks, ie. tuples of form
(TYPE_STR, CONTENT_STR), where TYPE_STR is one of 'input' and 'verbatim'
+
"""
chunks = []
str = str [m.end(0):]
- return chunks
+ return chunks
def find_verb_chunks (str):
def mudela_file (match):
"Find \mudelafile, and substitute appropriate \begin / \end blocks."
- d = [] #, d = retdeps
- full_path = find_file (match.group (2))
- if not full_path:
- error("error: can't find file `%s'\n" % match.group(2))
-
- d.append (full_path)
- f = open (full_path)
- str = f.read (-1)
+ str = find_file (match.group (2))
opts = match.group (1)
if opts:
- opts = re.split (',[ \n\t]*', opts[1:-1])
+ opts = opts[1:-1]
+ opts = re.split (',[ \n\t]*', opts)
else:
opts = []
opts .append ('nofly')
str_opts = string.join (opts, ',')
- if str_opts: str_opts = '[' + str_opts + ']'
-
str = ("%% copied from file `%s'\n" % full_path) + str
return get_output ('output-mudela') % (str_opts, str)
def find_mudela_chunks (str):
"""Find mudela blocks, while watching for verbatim. Returns
- (STR,MUDS) with \mudelagraphic substituted for the blocks in STR,
+ (STR,MUDS) with substituted for the blocks in STR,
and the blocks themselves MUDS"""
chunks = []
opts.append ('twocolumn')
elif g == 'onecolumn':
try:
- current_opts.remove ('twocolumn')
+ opts.remove ('twocolumn')
except IndexError:
pass
elif g == 'chapter':
(chapter, section, count) = (chapter + 1, 0, 0)
- elif g == 'section' or g == 'node':
+ elif g == 'section':
(section, count) = (section + 1, 0)
for the main file). The .ly is written, and scheduled in
TODO.
- Return: a chunk (TYPE_STR, MAIN_STR, OPTIONS, TODO)
+ Return: a chunk (TYPE_STR, MAIN_STR, OPTIONS, TODO, BASE)
TODO has format [basename, extension, extension, ... ]
newbody = output_verbatim (body)
file_body = compose_full_body (body, opts)
- updated = update_file (file_body, base + '.ly')
- todo = [base] # UGH.
+ basename = base
+ if __main__.use_hash:
+ basename = `abs(hash (file_body))`
+ updated = update_file (file_body, basename + '.ly')
+ todo = [basename] # UGH.
- if not os.path.isfile (base + '.tex') or updated:
+ if not os.path.isfile (basename + '.tex') or updated:
todo.append ('tex')
updated = 1
opts.append ('eps')
if 'eps' in opts and ('tex' in todo or
- not os.path.isfile (base + '.eps')):
+ not os.path.isfile (basename + '.eps')):
todo.append ('eps')
if 'png' in opts and ('eps' in todo or
- not os.path.isfile (base + '.png')):
+ not os.path.isfile (basename + '.png')):
todo.append ('png')
if format == 'latex':
if 'eps' in opts :
- newbody = newbody + get_output ('output-eps') % (base, base)
+ newbody = newbody + get_output ('output-eps') % (basename, basename)
else:
- newbody = newbody + get_output ('output-tex') % base
+ newbody = newbody + get_output ('output-tex') % basename
elif format == 'texi':
- newbody = newbody + get_output ('output-all') % (base, base)
+ newbody = newbody + get_output ('output-all') % (basename, basename)
+ return ('mudela', newbody, opts, todo, base)
-
- return ('mudela', newbody, opts, todo)
def find_eps_dims (match):
"Fill in dimensions of EPS files."
def transform_input_file (in_filename, out_filename):
"""Read the input, and deliver a list of chunks
ready for writing.
+
"""
chunks = read_doc_file (in_filename)
eps = []
tex = []
png = []
+ hash_dict = {}
for c in chunks:
if c[0] <> 'mudela':
elif e == 'png':
png.append (base)
+ if __main__.use_hash:
+ hash_dict[c[4]] = c[3][0]
+
if tex:
lilyopts = map (lambda x: '-I ' + x, include_path)
lilyopts = string.join (lilyopts, ' ' )
cmd = cmd % (g + '.eps', g + '.png')
system (cmd)
+ if __main__.use_hash:
+ name = ''
+ last_name = ''
+ f = 0
+ ks = hash_dict.keys ()
+ ks.sort ()
+ for i in ks:
+ name = re.sub ("(.*)-[0-9]+\.[0-9]+\.[0-9]+", "\\1", i)
+ name = name + '.mix'
+ if name != last_name:
+ if last_name:
+ f.close ()
+ f = open (name, 'w')
+ last_name = name
+ f.write ("%s:%s\n" % (i, hash_dict[i]))
+
def update_file (body, name):
same = 0
sys.exit (0)
-def write_deps (fn, target, deps):
+def write_deps (fn, target):
sys.stdout.write('writing `%s\'\n' % fn)
f = open (fn, 'w')
- target = target + '.latex'
- f.write ('%s: %s\n'% (target, string.join (deps, ' ')))
+ f.write ('%s%s: ' % (dep_prefix, target))
+ for d in __main__.read_files:
+ f.write ('%s ' % d)
+ f.write ('\n')
f.close ()
+ __main__.read_files = []
-
def identify():
sys.stdout.write ('mudela-book (GNU LilyPond) %s\n' % program_version)
""")
-def main():
- global outdir, initfile, defined_mudela_cmd, defined_mudela_cmd_re
- outname = ''
- try:
- (sh, long) = getopt_args (__main__.options)
- (options, files) = getopt.getopt(sys.argv[1:], sh, long)
- except getopt.error, msg:
- sys.stderr.write("error: %s" % msg)
- sys.exit(1)
-
- do_deps = 0
- for opt in options:
- o = opt[0]
- a = opt[1]
-
- if o == '--include' or o == '-I':
- include_path.append (a)
- elif o == '--version':
- print_version ()
- sys.exit (0)
-
- elif o == '--format' or o == '-o':
- __main__.format = a
- elif o == '--outname' or o == '-o':
- if len(files) > 1:
- #HACK
- sys.stderr.write("Mudela-book is confused by --outname on multiple files")
- sys.exit(1)
- outname = a
- elif o == '--outdir' or o == '-d':
- outdir = a
- elif o == '--help' or o == '-h':
- help ()
- elif o == '--no-lily' or o == '-n':
- __main__.run_lilypond = 0
- elif o == '--dependencies':
- do_deps = 1
- elif o == '--default-mudela-fontsize':
- default_music_fontsize = string.atoi (a)
- elif o == '--init':
- initfile = a
-
- identify()
-
- for input_filename in files:
- file_settings = {}
- if outname:
- my_outname = outname
- else:
- my_outname = os.path.basename(os.path.splitext(input_filename)[0])
- my_depname = my_outname + '.dep'
+outname = ''
+try:
+ (sh, long) = getopt_args (__main__.options)
+ (options, files) = getopt.getopt(sys.argv[1:], sh, long)
+except getopt.error, msg:
+ sys.stderr.write("error: %s" % msg)
+ sys.exit(1)
+
+do_deps = 0
+for opt in options:
+ o = opt[0]
+ a = opt[1]
+
+ if o == '--include' or o == '-I':
+ include_path.append (a)
+ elif o == '--version':
+ print_version ()
+ sys.exit (0)
+
+ elif o == '--format' or o == '-o':
+ __main__.format = a
+ elif o == '--outname' or o == '-o':
+ if len(files) > 1:
+ #HACK
+ sys.stderr.write("Mudela-book is confused by --outname on multiple files")
+ sys.exit(1)
+ outname = a
+ elif o == '--help' or o == '-h':
+ help ()
+ elif o == '--no-lily' or o == '-n':
+ __main__.run_lilypond = 0
+ elif o == '--dependencies':
+ do_deps = 1
+ elif o == '--default-mudela-fontsize':
+ default_music_fontsize = string.atoi (a)
+ elif o == '--init':
+ initfile = a
+ elif o == '--dep-prefix':
+ dep_prefix = a
+
+identify()
+
+for input_filename in files:
+ file_settings = {}
+ if outname:
+ my_outname = outname
+ else:
+ my_outname = os.path.basename(os.path.splitext(input_filename)[0])
+ my_depname = my_outname + '.dep'
- chunks = transform_input_file (input_filename, my_outname)
-
- foutn = my_outname + '.' + format
- sys.stderr.write ("Writing `%s'\n" % foutn)
- fout = open (foutn, 'w')
- for c in chunks:
- fout.write (c[1])
- fout.close ()
+ chunks = transform_input_file (input_filename, my_outname)
- if do_deps:
- # write_deps (my_depname, my_outname, deps)
- sys.stderr.write ("--dependencies broken")
+ foutn = my_outname + '.' + format
+ sys.stderr.write ("Writing `%s'\n" % foutn)
+ fout = open (foutn, 'w')
+ for c in chunks:
+ fout.write (c[1])
+ fout.close ()
-main()
+ if do_deps:
+ write_deps (my_depname, foutn)