3 # mf-to-table.py -- convert spacing info in MF logs .afm and .tex
5 # source file of the GNU LilyPond music typesetter
7 # (c) 1997 Han-Wen Nienhuys <hanwen@cs.uu.nl>
16 (options, files) = getopt.getopt(
17 sys.argv[1:], 'a:d:hl:o:p:t:',
18 ['afm=', 'outdir=', 'dep=', 'tex=', 'debug', 'help', 'package='])
23 if o == '-p' or o == '--package':
33 print 'can\'t open file: ' + f + '\n'
37 print 'gulped empty file: ' + f + '\n'
43 postfixes = ['log', 'dvi', '2602gf', 'tfm']
47 def read_log_file (fn):
49 str = re.sub ('\n', '', str)
50 str = re.sub ('[\t ]+', ' ', str)
54 def include_func (match, d = deps):
55 d.append (match.group (1))
58 def auto_func (match, a = autolines):
59 a.append (match.group (1))
62 str = re.sub ('\(([a-zA-Z_0-9-]+\.mf)', include_func, str)
63 str = re.sub ('@{(.*?)@}', auto_func, str)
65 return (autolines, deps)
69 def print_dimen(self, f):
70 f = f * 1000 / self.fontsize
74 # try to mask rounding errors
75 if (dimstr == '-0.00'):
77 self.write( dimstr +' ');
79 def def_symbol (self, code, lily_id, tex_id, xdim, ydim):
80 xdim = map (string.atof, xdim)
81 ydim = map (string.atof, ydim)
83 wid = xdim[0] + xdim[1]
84 self.write ('C %s ; ' % code)
86 self.print_dimen (wid)
88 self.write (' ; N %s-%s ; B ' % (self.groupname, lily_id))
90 self.print_dimen(-xdim [0])
91 self.print_dimen(-ydim [0])
92 self.print_dimen(xdim [1])
93 self.print_dimen(ydim [1])
96 def write (self, str):
98 def __init__ (self, fn):
99 self.file = open (fn,'w')
101 self.write ('Start%s\n' % nm)
103 self.write ('End%s\n' % nm)
108 """Read logs, destill info, and put into output files"""
109 def output_label(self, line):
114 tags = string.split(line, '@:')
119 if tags[0] == 'font':
120 self.texfile.write("% name\n")
122 afm.write ('FontName %s\n' % name)
123 afm.start ('FontMetrics')
124 afm.start ('CharMetrics')
125 afm.fontsize = string.atof(tags[2])
126 elif label == "group":
127 self.texfile.write("% " + name + "\n")
129 elif label == "puorg":
130 self.texfile.write("\n")
131 elif label == "tnof":
132 afm.end ('CharMetrics')
133 afm.end('FontMetrics');
134 elif label == "char":
141 self.texfile.write("\\def\\feta%s{\\char%s}\n" % (texstr, code))
142 afm.def_symbol (code, id, texstr, xdim, ydim)
144 raise 'unknown label: ' + label
146 def writedeps (self, deps):
148 sys.stderr.write ('Huh, no main target??')
151 split = os.path.splitext(filename)
154 targets = map (lambda x,y = basename, z = self.outdir: z + '/' + y + '.' + x, postfixes)
155 depstring = reduce(lambda x,y: x + ' ' + y, deps)
156 dependencies = map (lambda x, y=depstring: x + ': ' + y, targets)
157 for x in dependencies:
158 self.depfile.write (x + '\n')
160 def do_file(self,filenm):
161 self.texfile.write ('\n% input from ' + filenm + '\n')
162 (autolines, deps) = read_log_file (filenm)
167 self.writedeps (deps)
169 def __init__(self, texfile_nm, depfile_nm, afmfile_nm):
170 self.texfile = open(texfile_nm, 'w')
171 self.depfile = open (depfile_nm, 'w')
172 self.afmfile = Afm_file (afmfile_nm)
173 headerstr = '%% Creator: %s\n%% Automatically generated on\n%% Do not edit' % \
176 self.texfile.write(headerstr)
177 self.depfile.write ('# automatically generated by %s\n' % program_id ())
181 self.depfile.close ()
187 return time.asctime(time.localtime(time.time()))
190 return 'mf-to-table.py version ' + version;
193 sys.stdout.write(program_id() + '\n')
196 sys.stdout.write(r"""Usage: mf-to-table [options] LOGFILEs
197 Generate feta metrics table from preparated feta log\n
199 -a, --afm=FILE .afm file
200 -d, --dep=FILE print dependency info to FILE
201 -h, --help print this help
202 -l, --ly=FILE name output table
203 -o, --outdir=DIR prefix for dependency info
204 -p, --package=DIR specify package
205 -t, --tex=FILE name output tex chardefs"""
220 if o == '--dep' or o == '-d':
222 elif o == '--outdir' or o == '-o':
224 elif o == '--tex' or o == '-t':
226 elif o== '--help' or o == '-h':
228 elif o=='--afm' or o == '-a':
232 elif o == '-p' or o == '--package':
238 log_reader = Log_reader( texfile_nm, depfile_nm, afmfile_nm)
239 log_reader.outdir = outdir_prefix
241 log_reader.do_file(filenm)