PageRenderTime 41ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 0ms

/pypy/doc/tool/mydot.py

https://bitbucket.org/kcr/pypy
Python | 78 lines | 75 code | 2 blank | 1 comment | 0 complexity | 7ae9fb5ca5d5e116356c46c2760b9b01 MD5 | raw file
Possible License(s): Apache-2.0
  1. #!/usr/bin/env python
  2. import py
  3. import string
  4. import re
  5. nonalpha = "".join([chr(i) for i in range(256) if not chr(i).isalpha()])
  6. replacement = (string.ascii_letters * (int(len(nonalpha) / len(string.ascii_letters)) + 1))[:len(nonalpha)]
  7. transtable = string.maketrans(nonalpha, replacement)
  8. del nonalpha
  9. del replacement
  10. def find_replacement(tex, used={}):
  11. replacement = tex.translate(transtable)
  12. while replacement in used:
  13. replacement += "a"
  14. used[replacement] = True
  15. return replacement
  16. def create_tex_eps(dot, temppath):
  17. result = ["\\documentclass{article}",
  18. "\\usepackage[dvips]{graphicx}",
  19. "\\usepackage{psfrag}",
  20. "\\pagestyle{empty}",
  21. "\\begin{document}",
  22. "\\onecolumn"]
  23. texre = re.compile("(\$.*?\$)")
  24. dotcontent = dot.read()
  25. def repl(match, already_seen={}):
  26. tex = match.group(1)
  27. if tex in already_seen:
  28. return already_seen[tex]
  29. r = find_replacement(tex)
  30. already_seen[tex] = r
  31. result.append("\\psfrag{%s}[cc][cc]{%s}" % (r, tex))
  32. return r
  33. tempdot = temppath.join(dot.basename)
  34. eps = tempdot.new(ext='eps')
  35. dotcontent = texre.sub(repl, dotcontent)
  36. result.append("\\includegraphics{%s}" % eps)
  37. result.append("\\end{document}")
  38. tempdot.write(dotcontent)
  39. tex = eps.new(ext="tex")
  40. texcontent = "\n".join(result)
  41. tex.write(texcontent)
  42. epscontent = py.process.cmdexec("dot -Tps %s" % (tempdot, ))
  43. eps.write(re.sub("\n\[.*\]\nxshow", "\nshow", epscontent))
  44. return tex, eps
  45. def process_dot(dot):
  46. temppath = py.test.ensuretemp("dot")
  47. tex, texcontent = create_tex_eps(dot, temppath)
  48. dvi = tex.new(ext="dvi")
  49. output = dvi.new(purebasename=dvi.purebasename + "out", ext="eps")
  50. oldpath = dot.dirpath()
  51. dvi.dirpath().chdir()
  52. py.process.cmdexec("latex %s" % (tex, ))
  53. py.process.cmdexec("dvips -E -o %s %s" % (output, dvi))
  54. oldpath.chdir()
  55. return output
  56. if __name__ == '__main__':
  57. import optparse
  58. parser = optparse.OptionParser()
  59. parser.add_option("-T", dest="format",
  60. help="output format")
  61. options, args = parser.parse_args()
  62. if len(args) != 1:
  63. raise ValueError, "need exactly one argument"
  64. epsfile = process_dot(py.path.local(args[0]))
  65. if options.format == "ps" or options.format == "eps":
  66. print epsfile.read()
  67. elif options.format == "png":
  68. png = epsfile.new(ext="png")
  69. py.process.cmdexec("convert %s %s" % (epsfile, png))
  70. print png.read()