1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
|
#!/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()
|