10 begin_autometric_re = regex.compile('@{')
11 end_autometric_re = regex.compile('@}')
12 autometric_re = regex.compile('@{\([^@]*\)@}')
16 """silly wrapper for Python file object."""
17 def __init__(self,nm, mode='r'):
19 self.file_ = open(nm, mode);
21 self.file_ = sys.stdout
23 self.file_ = sys.stdin
27 l= self.file_.readline();
40 class Feta_file(File):
41 """Read Feta metrics from a metafont log-file."""
42 def read_autometricline(self):
44 while end_autometric_re.search(line) == -1 and not self.eof():
45 suf = File.readline(self)
46 if begin_autometric_re.search(line) == -1:
48 line = line + regsub.sub('\n','', suf)
55 """return what is enclosed in one @{ @} pair"""
57 while autometric_re.match(line) == -1 and not self.eof():
58 line = self.read_autometricline()
61 return autometric_re.group(1);
62 def __init__(self, nm):
63 File.__init__(self, nm)
64 def do_file(infile_nm):
68 # FIXME: should parse output for {} to do indenting.
70 class Indentable_file(File):
71 """Output file with support for indentation"""
72 def __init__(self,nm, mode):
73 File.__init__(self,nm,mode)
74 self.current_indent_ = 0
75 self.delta_indent_ = 4
76 def writeline (self, str):
79 File.write(self, '\n')
80 File.write(self, ' '* self.current_indent_)
83 self.current_indent_ = self.delta_indent_ + self.current_indent_;
85 self.current_indent_ = self.current_indent_ - self.delta_indent_;
86 if self.current_indent_ < 0:
90 lines = split(str, '\n')
94 self.writeline (lines[-1])
96 class Ly_file(Indentable_file):
97 """extra provisions for mozarella quirks"""
98 def print_lit(self, str):
99 self.write('\"' + str + '\" ')
101 def print_dimen(self, str):
102 self.write( '%.2f' % atof(str) + '\\pt ');
104 def neg_print_dimen(self, str):
105 self.write( '%.2f' % -atof(str) + '\\pt ');
106 def def_symbol(self, lily_id, tex_id, dims):
107 self.print_lit(lily_id)
108 self.print_lit('\\' + tex_id)
110 self.neg_print_dimen(dims [0])
111 self.print_dimen(dims [1])
112 self.neg_print_dimen(dims [2])
113 self.print_dimen(dims [3])
118 """Read logs, destill info, and put into output files"""
119 def output_label(self, line):
122 tags = split(line, ':')
126 if tags[0] == 'font':
128 ly.write("% name=\\symboltables {\n")
129 self.texfile.write("% name\n")
130 elif label == "group":
133 ly.write(' = \\table {\n')
134 self.texfile.write("% " + name + "\n")
135 elif label == "puorg":
138 self.texfile.write("\n")
139 elif label == "tnof":
141 ly.write("% } % $name\n")
142 elif label == "char":
147 ly.def_symbol(id, texstr, tags[3:7])
149 self.texfile.write("\\fetdef\\" + texstr + '{' + code + '}\n')
151 raise 'unknown label: ' + label
154 def do_file(self,filenm):
155 self.lyfile.write('\n% input from ' + filenm + '\n')
156 self.texfile.write('\n% input from ' + filenm + '\n')
157 feta = Feta_file(filenm)
158 while not feta.eof():
159 line = feta.readline()
160 self.output_label(line)
163 def __init__(self, lyfile_nm, texfile_nm):
164 self.lyfile = Ly_file(lyfile_nm, 'w')
165 self.texfile = Indentable_file(texfile_nm, 'w')
167 headerstr = '% generated automatically by ' + program_id()
168 headerstr = headerstr + '\n% on ' + today_str()
169 headerstr = headerstr + '\n% Do not edit\n'
171 self.lyfile.write(headerstr)
172 self.texfile.write(headerstr)
182 return time.asctime(time.localtime(time.time()))
185 return 'mf-to-table.py version ' + version;
188 sys.stdout.write(program_id() + '\n')
191 sys.stdout.write("Usage: mf-to-table [options] LOGFILEs\n"
192 + "Generate mozarella metrics table from preparated feta log\n\n"
194 + " -h, --help print this help\n"
195 + " -l, --ly=FILE name output table\n"
196 + " -t, --tex=FILE name output tex chardefs\n")
201 (options, files) = getopt.getopt(
202 sys.argv[1:], 'hl:t:', ['ly=', 'tex=', 'debug', 'help'])
204 lyfile_nm = texfile_nm = '';
208 if o == '--ly' or o == '-l':
210 elif o == '--tex' or o == '-t':
212 elif o== '--help' or o == '-h':
219 log_reader = Log_reader(lyfile_nm, texfile_nm)
221 log_reader.do_file(filenm)