#!/usr/bin/env python # pretty-print a formula in docbook or HTML format # std modules import sys import os import re # kid import elementtree.ElementTree from elementtree.ElementTree import Element import kid kid.enable_import() #kid templates import frm_docbook # PLY import lex # my code import fractlexer def output_frm(toks,outbase, nfrms): if toks != []: outfile = open("%s%03d.xml" % (outbase, nfrms),"w") k = frm_docbook.Template(tokens=toks) print >>outfile, k.serialize() # map from token types -> docbook element types element_types = { "FORM_ID" : '', "SECT_SET" : '', "SECT_PARMS" : '', "SECT_STM" : '', "NUMBER" : '', "COMMENT" : '' } # array of words to highlight for each formula in the tutorial highlights = [ {}, {}, {"#zwpixel": ''}, {"@myfunc": '', "@factor": ''} ] myfrm = re.compile('MyFormula\d+') def processToken(tok, specialdict): element_type = element_types.get(tok.type) special_type = specialdict.get(tok.value) if special_type: val = elementtree.ElementTree.XML(special_type) val.text = tok.value elif element_type: val = elementtree.ElementTree.XML(element_type) val.text = tok.value else: val = tok.value return val def main(infile,outbase): fractlexer.keep_all = True fractlexer.t_ignore = "" flex = lex.lex(fractlexer) flex.input(open(infile).read()) # Tokenize toks = [] nfrms = 0 while 1: tok = flex.token() if not tok: break # No more input #element.text = tok.value if tok.type == "FORM_ID": output_frm(toks,outbase,nfrms) toks = [] nfrms += 1 # special case for processing tutorial tok.value = myfrm.sub('MyFormula',tok.value) toks.append(processToken(tok, highlights[nfrms])) # print last formula output_frm(toks,outbase,nfrms) if __name__ == '__main__': if len(sys.argv) < 2: print "Usage: ppfrm.py foo.frm outbase" sys.exit(1) if(len(sys.argv) > 2): main(sys.argv[1], sys.argv[2]) else: main(sys.argv[1])