OLD | NEW |
| (Empty) |
1 # Copyright (c) 2001-2004 Twisted Matrix Laboratories. | |
2 # See LICENSE for details. | |
3 | |
4 # | |
5 from __future__ import nested_scopes | |
6 | |
7 import os, tempfile | |
8 from twisted.web import domhelpers, microdom | |
9 import latex, tree, lint, default | |
10 | |
11 class MathLatexSpitter(latex.LatexSpitter): | |
12 | |
13 start_html = '\\documentclass{amsart}\n' | |
14 | |
15 def visitNode_div_latexmacros(self, node): | |
16 self.writer(domhelpers.getNodeText(node)) | |
17 | |
18 def visitNode_span_latexformula(self, node): | |
19 self.writer('\[') | |
20 self.writer(domhelpers.getNodeText(node)) | |
21 self.writer('\]') | |
22 | |
23 def formulaeToImages(document, dir): | |
24 # gather all macros | |
25 macros = '' | |
26 for node in domhelpers.findElementsWithAttribute(document, 'class', | |
27 'latexmacros'): | |
28 macros += domhelpers.getNodeText(node) | |
29 node.parentNode.removeChild(node) | |
30 i = 0 | |
31 for node in domhelpers.findElementsWithAttribute(document, 'class', | |
32 'latexformula'): | |
33 latexText='''\\documentclass[12pt]{amsart}%s | |
34 \\begin{document}\[%s\] | |
35 \\end{document}''' % (macros, domhelpers.getNodeText(node)) | |
36 file = tempfile.mktemp() | |
37 open(file+'.tex', 'w').write(latexText) | |
38 os.system('latex %s.tex' % file) | |
39 os.system('dvips %s.dvi -o %s.ps' % (os.path.basename(file), file)) | |
40 baseimgname = 'latexformula%d.png' % i | |
41 imgname = os.path.join(dir, baseimgname) | |
42 i += 1 | |
43 os.system('pstoimg -type png -crop a -trans -interlace -out ' | |
44 '%s %s.ps' % (imgname, file)) | |
45 newNode = microdom.parseString('<span><br /><img src="%s" /><br /></span
>' % | |
46 baseimgname) | |
47 node.parentNode.replaceChild(newNode, node) | |
48 | |
49 | |
50 def doFile(fn, docsdir, ext, url, templ, linkrel='', d=None): | |
51 d = d or {} | |
52 doc = tree.parseFileAndReport(fn) | |
53 formulaeToImages(doc, os.path.dirname(fn)) | |
54 cn = templ.cloneNode(1) | |
55 tree.munge(doc, cn, linkrel, docsdir, fn, ext, url, d) | |
56 cn.writexml(open(os.path.splitext(fn)[0]+ext, 'wb')) | |
57 | |
58 | |
59 class ProcessingFunctionFactory(default.ProcessingFunctionFactory): | |
60 | |
61 latexSpitters = {None: MathLatexSpitter} | |
62 | |
63 def getDoFile(self): | |
64 return doFile | |
65 | |
66 def getLintChecker(self): | |
67 checker = lint.getDefaultChecker() | |
68 checker.allowedClasses = checker.allowedClasses.copy() | |
69 oldDiv = checker.allowedClasses['div'] | |
70 oldSpan = checker.allowedClasses['span'] | |
71 checker.allowedClasses['div'] = lambda x:oldDiv(x) or x=='latexmacros' | |
72 checker.allowedClasses['span'] = (lambda x:oldSpan(x) or | |
73 x=='latexformula') | |
74 return checker | |
75 | |
76 factory = ProcessingFunctionFactory() | |
OLD | NEW |