From: fred Date: Sun, 24 Mar 2002 20:09:54 +0000 (+0000) Subject: lilypond-0.1.57 X-Git-Tag: release/1.5.59~3198 X-Git-Url: https://git.donarmstrong.com/?a=commitdiff_plain;h=bbb40d409b23a426c80c5fbf5c47a42616eea4aa;p=lilypond.git lilypond-0.1.57 --- diff --git a/bin/flower.py b/bin/flower.py index e88631d1a2..46dfe0faf3 100644 --- a/bin/flower.py +++ b/bin/flower.py @@ -8,6 +8,8 @@ # (c) 1997 Han-Wen Nienhuys # +import sys + class File: """silly wrapper for Python file object.""" def __init__ (self,nm, mode='r'): diff --git a/bin/mf-deps.py b/bin/mf-deps.py new file mode 100644 index 0000000000..b259b59748 --- /dev/null +++ b/bin/mf-deps.py @@ -0,0 +1,107 @@ +#!@PYTHON@ +# -*- python -*- + +# +# mf-deps.py -- dependencies for metafont +# +# source file of the GNU LilyPond music typesetter +# +# (c) 1997 Han-Wen Nienhuys +# + + +"""look into metafont source for dependencies. + + fixme: python path + fixme: error reporting + fixem: python sucks slightly: why doesn't it have closures? + +""" + +import sys +import os + +lilypath ='' +try: + lilypath = os.environ['LILYPOND_SOURCEDIR'] + '/' +except KeyError: + try: + lilypath = os.environ['top_srcdir'] + '/' + except KeyError: + print 'Please set LILYPOND_SOURCEDIR to the toplevel source, eg LILYPOND_SOURCEDIR=/home/foobar/lilypond-1.2.3/' + + sys.exit(1) + +lilypath = lilypath + '/bin/' +sys.path.append(lilypath) + +from regex import * ; +from regsub import * ; +import sys; +import os; + + +version = "0.2" +input_re = compile('^[ \t]*input *\([^;]+\);') +postfixes = ['log', 'dvi', '2602gf', 'tfm'] + +def identify (): + return "mf-deps.py %s" % version + + + +def print_one(x): + print x + +def line_concat(x,y): + return x + '\n' + y + +class Targetdeps: + """Dependencies for one toplevel sourcefile + + """ + + def __init__(self,nm): + split = os.path.splitext(nm) + self.basename=split[0]; + self.depfiles = [] + self.checkdep(nm) + + def checkdep(self, name): + split = os.path.splitext(name) + name = split[0] + '.mf'; + + if name not in self.depfiles: + self.get_filedeps(name) + + def get_filedeps(self,filename): +# print sys.stderr.write( 'checking ' + filename + '\n'); + try: + file = open(filename) + except IOError: +# print sys.stderr.write( 'can\'t open ' + filename + '\n') + return + + self.depfiles.append(filename) + lines = file.readlines() + file.close() + for line in lines: + if input_re.search (line) <> -1: + self.checkdep( input_re.group(1)) + + def target_string(self): + # ugh. Closures, anyone? +# targets = map (lambda x,y = self.basename: 'out/' + y + '.' + x, postfixes) + targets = map (lambda x,y = self.basename: y + '.' + x, postfixes) + depstring = reduce(lambda x,y: x + ' ' + y, self.depfiles) + dependencies = map (lambda x, y=depstring: x + ': ' + y, targets) + + return reduce(line_concat, dependencies) + +print "# Automatically generated by %s\n" % identify () + +for file in sys.argv[1:]: # skip programname + t = Targetdeps(file) + print t.target_string() + + diff --git a/bin/mf-to-table.py b/bin/mf-to-table.py new file mode 100644 index 0000000000..e3827346ca --- /dev/null +++ b/bin/mf-to-table.py @@ -0,0 +1,278 @@ +#!@PYTHON@ + +# +# mf-to-table.py -- convert spacing info in MF logs .ly and .tex +# +# source file of the GNU LilyPond music typesetter +# +# (c) 1997 Han-Wen Nienhuys +# + +import getopt +from string import * +import regex +import regsub +import os +import sys +import time + + + +lilypath ='' +try: + lilypath = os.environ['LILYPOND_SOURCEDIR'] + '/' +except KeyError: + try: + lilypath = os.environ['top_srcdir'] + '/' + except KeyError: + print 'Please set LILYPOND_SOURCEDIR to the toplevel source, eg LILYPOND_SOURCEDIR=/home/foobar/lilypond-1.2.3/' + + sys.exit(1) + +lilypath = lilypath + '/bin/' +sys.path.append(lilypath) + +from flower import * + +begin_autometric_re = regex.compile('@{') +end_autometric_re = regex.compile('@}') +include_re = regex.compile ('(\([a-zA-Z_0-9-]+\.mf\)') +autometric_re = regex.compile('@{\(.*\)@}') +version = '0.6' +postfixes = ['log', 'dvi', '2602gf', 'tfm'] + +class Feta_file(File): + """Read Feta metrics from a metafont log-file.""" + + def include_scan (self, line): + include_pos = include_re.search (line) + while include_pos <> -1: + self.dependencies.append (include_re.group (1)) + + line = line[include_pos + 1:] + include_pos = include_re.search (line) + + def read_autometricline(self): + line = '' + while end_autometric_re.search(line) == -1 and not self.eof(): + suf = File.readline(self) + self.include_scan (suf) + if begin_autometric_re.search(line) == -1: + line = '' + line = line + regsub.sub('\n','', suf) + + if self.eof(): + return '' + + return line; + def readline(self): + """return what is enclosed in one @{ @} pair""" + line = ''; + while autometric_re.search(line) == -1 and not self.eof(): + line = self.read_autometricline() + + if self.eof(): + return ''; + + return autometric_re.group(1); + def __init__(self, nm): + File.__init__(self, nm) + self.dependencies = [] + def do_file(infile_nm): + infile = readline(); + +# +# FIXME: should parse output for {} to do indenting. +# +class Indentable_file(File): + """Output file with support for indentation""" + def __init__(self,nm, mode): + File.__init__(self,nm,mode) + self.current_indent_ = 0 + self.delta_indent_ = 4 + def writeline (self, str): + File.write(self, str) + def writeeol(self): + File.write(self, '\n') + File.write(self, ' '* self.current_indent_) + + def indent(self): + self.current_indent_ = self.delta_indent_ + self.current_indent_; + def dedent(self): + self.current_indent_ = self.current_indent_ - self.delta_indent_; + if self.current_indent_ < 0: + raise 'Nesting!' + + def write(self, str): + lines = split(str, '\n') + for l in lines[:-1]: + self.writeline(l) + self.writeeol() + self.writeline (lines[-1]) + +class Ly_file(Indentable_file): + """extra provisions for mozarella quirks""" + def print_lit(self, str): + self.write('\"%s\"\t' % str) + + def print_f_dimen(self, f): + dimstr = '%.2f' % f + + # try to mask rounding errors + if (dimstr == '-0.00'): + dimstr = '0.00' + self.write( dimstr +'\\pt\t'); + + def print_dimen(self, str): + self.print_f_dimen(atof(str)) + + def neg_print_dimen(self, str): + self.print_f_dimen(-atof(str)); + + def def_symbol(self, lily_id, tex_id, dims): + self.print_lit(lily_id) + self.print_lit('\\\\' + tex_id) + + self.neg_print_dimen(dims [0]) + self.print_dimen(dims [1]) + self.neg_print_dimen(dims [2]) + self.print_dimen(dims [3]) + self.write('\n') + + +class Log_reader: + """Read logs, destill info, and put into output files""" + def output_label(self, line): + + if not line: + return; + tags = split(line, '@:') + label = tags[0] + name = tags[1] + ly = self.lyfile + if tags[0] == 'font': + ly.indent() + ly.write("% name=\\symboltables {\n") + self.texfile.write("% name\n") + elif label == "group": + ly.indent() + ly.print_lit(name) + ly.write(' = \\table {\n') + self.texfile.write("% " + name + "\n") + elif label == "puorg": + ly.dedent() + ly.write("}\n") + self.texfile.write("\n") + elif label == "tnof": + ly.dedent() + ly.write("% } % $name\n") + elif label == "char": + code = tags[2] + id = tags [7] + texstr = tags [8] + + ly.def_symbol(id, texstr, tags[3:7]) + + self.texfile.write("\\fetdef\\%s{%s}\n" % (texstr, code)) + else: + raise 'unknown label: ' + label + + def writedeps (self, deps): + + filename = deps[0] + split = os.path.splitext(filename) + basename=split[0]; + + targets = map (lambda x,y = basename, z = self.outdir: z + '/' + y + '.' + x, postfixes) + depstring = reduce(lambda x,y: x + ' ' + y, deps) + dependencies = map (lambda x, y=depstring: x + ': ' + y, targets) + for x in dependencies: + self.depfile.write (x + '\n') + + def do_file(self,filenm): + self.lyfile.write ('\n% input from ' + filenm + '\n') + self.texfile.write ('\n% input from ' + filenm + '\n') + feta = Feta_file(filenm) + while not feta.eof(): + line = feta.readline() + self.output_label(line) + feta.close() + + self.writedeps (feta.dependencies) + + def __init__(self, lyfile_nm, texfile_nm, depfile_nm): + self.lyfile = Ly_file(lyfile_nm, 'w') + self.texfile = Indentable_file(texfile_nm, 'w') + self.depfile = File (depfile_nm, 'w') + + headerstr = '%% Creator: %s\n%% Automatically generated on\n%% Do not edit' % \ + (program_id() ) + + self.lyfile.write(headerstr) + self.texfile.write(headerstr) + self.depfile.write ('# automatically generated by %s\n' % program_id ()) + + def close(self): + self.lyfile.close() + self.texfile.close() + self.depfile.close () + + def __del__(self): + self.close() + +def today_str(): + return time.asctime(time.localtime(time.time())) + +def program_id(): + return 'mf-to-table.py version ' + version; + +def identify(): + sys.stdout.write(program_id() + '\n') + +def help(): + sys.stdout.write("Usage: mf-to-table [options] LOGFILEs\n" + + "Generate mozarella metrics table from preparated feta log\n\n" + + "Options:\n" + + " -h, --help print this help\n" + + " -l, --ly=FILE name output table\n" + + " -d, --dep=FILE print dependency info to FILE\n" + + " -o, --outdir=DIR prefix for dependency info\n" + + " -t, --tex=FILE name output tex chardefs\n") + sys.exit (0) + + +def main(): + identify() + (options, files) = getopt.getopt( + sys.argv[1:], 'ho:l:t:d:', ['outdir=', 'dep=', 'ly=', 'tex=', 'debug', 'help']) + + lyfile_nm = texfile_nm = ''; + depfile_nm = '' + outdir_prefix = '.' + for opt in options: + o = opt[0] + a = opt[1] + if o == '--dep' or o == '-d': + depfile_nm = a + elif o == '--outdir' or o == '-o': + outdir_prefix = a + elif o == '--ly' or o == '-l': + lyfile_nm = a + elif o == '--tex' or o == '-t': + texfile_nm = a + elif o== '--help' or o == '-h': + help() + elif o == '--debug': + debug_b = 1 + else: + print o + raise getopt.error + + log_reader = Log_reader(lyfile_nm, texfile_nm, depfile_nm) + log_reader.outdir = outdir_prefix + for filenm in files: + log_reader.do_file(filenm) + log_reader.close() + + +main()