X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=buildscripts%2Fmf-to-table.py;h=f6629328ce3c6ff712cb0b267b2ecdb401d79ae8;hb=41e45dd730c075e78065dfa78e5e54be664d905e;hp=4722fea6cd90ebd30abe716843521238b38ff836;hpb=0a92b605eb18b62d171c97f354c2101109d9e071;p=lilypond.git diff --git a/buildscripts/mf-to-table.py b/buildscripts/mf-to-table.py old mode 100755 new mode 100644 index 4722fea6cd..f6629328ce --- a/buildscripts/mf-to-table.py +++ b/buildscripts/mf-to-table.py @@ -1,10 +1,10 @@ #!@PYTHON@ -# mf-to-table.py -- convert spacing info in MF logs .afm and .tex -# +# mf-to-table.py -- convert spacing info in MF logs . +# # source file of the GNU LilyPond music typesetter -# -# (c) 1997 Han-Wen Nienhuys +# +# (c) 1997--2007 Han-Wen Nienhuys import os import sys @@ -13,233 +13,236 @@ import string import re import time -(options, files) = getopt.getopt( - sys.argv[1:], 'a:d:hl:o:p:t:', - ['afm=', 'outdir=', 'dep=', 'tex=', 'debug', 'help', 'package=']) +def read_log_file (fn): + str = open (fn).read () + str = re.sub ('\n', '', str) + str = re.sub ('[\t ]+', ' ', str) -for opt in options: - o = opt[0] - a = opt[1] - if o == '-p' or o == '--package': - topdir = a - -def gulp_file(f): - try: - i = open(f) - i.seek (0, 2) - n = i.tell () - i.seek (0,0) - except: - print 'can\'t open file: ' + f + '\n' - return '' - s = i.read (n) - if len (s) <= 0: - print 'gulped empty file: ' + f + '\n' - i.close () - return s - -version = '0.9' - -postfixes = ['log', 'dvi', '2602gf', 'tfm'] - -print re + deps = [] + autolines = [] + def include_func (match, d = deps): + d.append (match.group (1)) + return '' -def read_log_file (fn): - str = gulp_file (fn) - str = re.sub ('\n', '', str) - str = re.sub ('[\t ]+', ' ', str) + def auto_func (match, a = autolines): + a.append (match.group (1)) + return '' - deps = [] - autolines = [] - def include_func (match, d = deps): - d.append (match.group (1)) - return '' + str = re.sub ('\\(([/a-z.A-Z_0-9-]+\\.mf)', include_func, str) + str = re.sub ('@{(.*?)@}', auto_func, str) - def auto_func (match, a = autolines): - a.append (match.group (1)) - return '' + return (autolines, deps) - str = re.sub ('\(([a-zA-Z_0-9-]+\.mf)', include_func, str) - str = re.sub ('@{(.*?)@}', auto_func, str) - return (autolines, deps) +class Char_metric: + def __init__ (self): + pass +font_family = 'feta' -class Afm_file: - def print_dimen(self, f): - f = f * 1000 / self.fontsize +def parse_logfile (fn): + (autolines, deps) = read_log_file (fn) + charmetrics = [] - dimstr = '%.2f' % f - - # try to mask rounding errors - if (dimstr == '-0.00'): - dimstr = '0.00' - self.write( dimstr +' '); - - def def_symbol (self, code, lily_id, tex_id, xdim, ydim): - xdim = map (string.atof, xdim) - ydim = map (string.atof, ydim) - - wid = xdim[0] + xdim[1] - self.write ('C %s ; ' % code) - self.write ('WX ') - self.print_dimen (wid) - - self.write (' ; N %s-%s ; B ' % (self.groupname, lily_id)) - - self.print_dimen(-xdim [0]) - self.print_dimen(-ydim [0]) - self.print_dimen(xdim [1]) - self.print_dimen(ydim [1]) - - self.write (' ;\n'); - def write (self, str): - self.file.write (str) - def __init__ (self, fn): - self.file = open (fn,'w') - def start (self,nm): - self.write ('Start%s\n' % nm) - def end (self,nm): - self.write ('End%s\n' % nm) - - - -class Log_reader: - """Read logs, destill info, and put into output files""" - def output_label(self, line): - - if not line: - return; - - tags = string.split(line, '@:') - label = tags[0] - name = tags[1] - afm = self.afmfile - - if tags[0] == 'font': - self.texfile.write("% name\n") - - afm.write ('FontName %s\n' % name) - afm.start ('FontMetrics') - afm.start ('CharMetrics') - afm.fontsize = string.atof(tags[2]) - elif label == "group": - self.texfile.write("% " + name + "\n") - afm.groupname = name - elif label == "puorg": - self.texfile.write("\n") - elif label == "tnof": - afm.end ('CharMetrics') - afm.end('FontMetrics'); - elif label == "char": - code = tags[2] - id = tags [7] - texstr = tags [8] - xdim = tags[3:5] - ydim = tags[5:7] - - self.texfile.write("\\def\\feta%s{\\char%s}\n" % (texstr, code)) - afm.def_symbol (code, id, texstr, xdim, ydim) - else: - raise 'unknown label: ' + label - - def writedeps (self, deps): - if not len (deps): - sys.stderr.write ('Huh, no main target??') - return - 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.texfile.write ('\n% input from ' + filenm + '\n') - (autolines, deps) = read_log_file (filenm) - - for a in autolines: - self.output_label(a) - - self.writedeps (deps) - - def __init__(self, texfile_nm, depfile_nm, afmfile_nm): - self.texfile = open(texfile_nm, 'w') - self.depfile = open (depfile_nm, 'w') - self.afmfile = Afm_file (afmfile_nm) - headerstr = '%% Creator: %s\n%% Automatically generated on\n%% Do not edit' % \ - (program_id() ) - - self.texfile.write(headerstr) - self.depfile.write ('# automatically generated by %s\n' % program_id ()) - - def close(self): - 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') + global_info = { + 'filename' : os.path.splitext (os.path.basename (fn))[0] + } + group = '' + + for l in autolines: + tags = string.split (l, '@:') + if tags[0] == 'group': + group = tags[1] + elif tags[0] == 'puorg': + group = '' + elif tags[0] == 'char': + name = tags[9] + + if group: + name = group + '.' + name + m = { + 'description': tags[1], + 'name': name, + 'code': string.atoi (tags[2]), + 'breapth': string.atof (tags[3]), + 'width': string.atof (tags[4]), + 'depth': string.atof (tags[5]), + 'height': string.atof (tags[6]), + 'wx': string.atof (tags[7]), + 'wy': string.atof (tags[8]), + } + charmetrics.append (m) + elif tags[0] == 'font': + global font_family + font_family = (tags[3]) + # To omit 'GNU' (foundry) from font name proper: + # name = tags[2:] + #urg + if 0: # testing + tags.append ('Regular') + + encoding = re.sub (' ','-', tags[5]) + tags = tags[:-1] + name = tags[1:] + global_info['design_size'] = string.atof (tags[4]) + global_info['FontName'] = string.join (name, '-') + global_info['FullName'] = string.join (name,' ') + global_info['FamilyName'] = string.join (name[1:-1], + '-') + if 1: + global_info['Weight'] = tags[4] + else: # testing + global_info['Weight'] = tags[-1] + + global_info['FontBBox'] = '0 0 1000 1000' + global_info['Ascender'] = '0' + global_info['Descender'] = '0' + global_info['EncodingScheme'] = encoding + + elif tags[0] == 'parameter': + global_info[tags[1]] = tags[2]; + + return (global_info, charmetrics, deps) + + + + + +def character_lisp_table (global_info, charmetrics): + + def conv_char_metric (charmetric): + f = 1.0 + s = """(%s . +((bbox . (%f %f %f %f)) +(subfont . "%s") +(subfont-index . %d) +(attachment . (%f . %f)))) +""" %(charmetric['name'], + -charmetric['breapth'] * f, + -charmetric['depth'] * f, + charmetric['width'] * f, + charmetric['height'] * f, + global_info['filename'], + charmetric['code'], + charmetric['wx'], + charmetric['wy']) + + return s + + s = '' + for c in charmetrics: + s += conv_char_metric (c) + + return s + + +def global_lisp_table (global_info): + str = '' + + keys = ['staffsize', 'stafflinethickness', 'staff_space', + 'linethickness', 'black_notehead_width', 'ledgerlinethickness', + 'design_size', + 'blot_diameter' + ] + for k in keys: + if global_info.has_key (k): + str = str + "(%s . %s)\n" % (k,global_info[k]) + + return str + -def help(): - sys.stdout.write(r"""Usage: mf-to-table [options] LOGFILEs -Generate feta metrics table from preparated feta log\n +def ps_encoding (name, global_info, charmetrics): + encs = ['.notdef'] * 256 + for m in charmetrics: + encs[m['code']] = m['name'] + + + s = ('/%s [\n' % name) + for m in range (0, 256): + s += (' /%s %% %d\n' % (encs[m], m)) + s += ('] def\n') + return s + +def get_deps (deps, targets): + s = '' + for t in targets: + t = re.sub ( '^\\./', '', t) + s += ('%s '% t) + s += (": ") + for d in deps: + s += ('%s ' % d) + s += ('\n') + return s + +def help (): + sys.stdout.write(r"""Usage: mf-to-table [OPTIONS] LOGFILEs + +Generate feta metrics table from preparated feta log. + Options: - -a, --afm=FILE .afm file - -d, --dep=FILE print dependency info to FILE - -h, --help print this help - -l, --ly=FILE name output table - -o, --outdir=DIR prefix for dependency info - -p, --package=DIR specify package - -t, --tex=FILE name output tex chardefs""" -) + -d, --dep=FILE print dependency info to FILE + -h, --help print this help + -l, --ly=FILE name output table + -o, --outdir=DIR prefix for dependency info + -p, --package=DIR specify package + + """) sys.exit (0) -def main(): - identify() - - texfile_nm = ''; - depfile_nm = '' - afmfile_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 == '--tex' or o == '-t': - texfile_nm = a - elif o== '--help' or o == '-h': - help() - elif o=='--afm' or o == '-a': - afmfile_nm = a - elif o == '--debug': - debug_b = 1 - elif o == '-p' or o == '--package': - topdir = a - else: - print o - raise getopt.error - - log_reader = Log_reader( texfile_nm, depfile_nm, afmfile_nm) - log_reader.outdir = outdir_prefix - for filenm in files: - log_reader.do_file(filenm) - log_reader.close() - - -main() +(options, files) = \ + getopt.getopt (sys.argv[1:], + 'a:d:ho:p:t:', + ['enc=', 'outdir=', 'dep=', 'lisp=', + 'global-lisp=', + 'debug', 'help', 'package=']) + +global_lisp_nm = '' +char_lisp_nm = '' +enc_nm = '' +depfile_nm = '' +lyfile_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 == '--lisp': + char_lisp_nm = a + elif o == '--global-lisp': + global_lisp_nm = a + elif o == '--enc': + enc_nm = a + elif o== '--help' or o == '-h': + help() + elif o == '--debug': + debug_b = 1 + else: + print o + raise getopt.error + +base = os.path.splitext (lyfile_nm)[0] + +for filenm in files: + (g, m, deps) = parse_logfile (filenm) + + enc_name = 'FetaEncoding' + if re.search ('parmesan', filenm): + enc_name = 'ParmesanEncoding' + elif re.search ('feta-brace', filenm): + enc_name = 'FetaBraceEncoding' + elif re.search ('feta-alphabet', filenm): + enc_name = 'FetaAlphabetEncoding'; + + open (enc_nm, 'w').write (ps_encoding (enc_name, g, m)) + open (char_lisp_nm, 'w').write (character_lisp_table (g, m)) + open (global_lisp_nm, 'w').write (global_lisp_table (g)) + if depfile_nm: + open (depfile_nm, 'wb').write (get_deps (deps, + [base + '.log', base + '.dvi', base + '.pfa', + depfile_nm, + base + '.pfb']))