/pypy/doc/tool/mydot.py
Python | 78 lines | 75 code | 2 blank | 1 comment | 0 complexity | 7ae9fb5ca5d5e116356c46c2760b9b01 MD5 | raw file
- #!/usr/bin/env python
- import py
- import string
- import re
- nonalpha = "".join([chr(i) for i in range(256) if not chr(i).isalpha()])
- replacement = (string.ascii_letters * (int(len(nonalpha) / len(string.ascii_letters)) + 1))[:len(nonalpha)]
- transtable = string.maketrans(nonalpha, replacement)
- del nonalpha
- del replacement
- def find_replacement(tex, used={}):
- replacement = tex.translate(transtable)
- while replacement in used:
- replacement += "a"
- used[replacement] = True
- return replacement
- def create_tex_eps(dot, temppath):
- result = ["\\documentclass{article}",
- "\\usepackage[dvips]{graphicx}",
- "\\usepackage{psfrag}",
- "\\pagestyle{empty}",
- "\\begin{document}",
- "\\onecolumn"]
- texre = re.compile("(\$.*?\$)")
- dotcontent = dot.read()
- def repl(match, already_seen={}):
- tex = match.group(1)
- if tex in already_seen:
- return already_seen[tex]
- r = find_replacement(tex)
- already_seen[tex] = r
- result.append("\\psfrag{%s}[cc][cc]{%s}" % (r, tex))
- return r
- tempdot = temppath.join(dot.basename)
- eps = tempdot.new(ext='eps')
- dotcontent = texre.sub(repl, dotcontent)
- result.append("\\includegraphics{%s}" % eps)
- result.append("\\end{document}")
- tempdot.write(dotcontent)
- tex = eps.new(ext="tex")
- texcontent = "\n".join(result)
- tex.write(texcontent)
- epscontent = py.process.cmdexec("dot -Tps %s" % (tempdot, ))
- eps.write(re.sub("\n\[.*\]\nxshow", "\nshow", epscontent))
- return tex, eps
-
- def process_dot(dot):
- temppath = py.test.ensuretemp("dot")
- tex, texcontent = create_tex_eps(dot, temppath)
- dvi = tex.new(ext="dvi")
- output = dvi.new(purebasename=dvi.purebasename + "out", ext="eps")
- oldpath = dot.dirpath()
- dvi.dirpath().chdir()
- py.process.cmdexec("latex %s" % (tex, ))
- py.process.cmdexec("dvips -E -o %s %s" % (output, dvi))
- oldpath.chdir()
- return output
- if __name__ == '__main__':
- import optparse
- parser = optparse.OptionParser()
- parser.add_option("-T", dest="format",
- help="output format")
- options, args = parser.parse_args()
- if len(args) != 1:
- raise ValueError, "need exactly one argument"
- epsfile = process_dot(py.path.local(args[0]))
- if options.format == "ps" or options.format == "eps":
- print epsfile.read()
- elif options.format == "png":
- png = epsfile.new(ext="png")
- py.process.cmdexec("convert %s %s" % (epsfile, png))
- print png.read()