| 1 |
|
|---|
| 2 |
|
|---|
| 3 |
|
|---|
| 4 |
|
|---|
| 5 |
|
|---|
| 6 |
from cStringIO import StringIO |
|---|
| 7 |
import os, re |
|---|
| 8 |
from twisted.python import text |
|---|
| 9 |
from twisted.web import domhelpers |
|---|
| 10 |
import latex, tree |
|---|
| 11 |
|
|---|
| 12 |
spaceRe = re.compile('\s+') |
|---|
| 13 |
|
|---|
| 14 |
def texiEscape(text): |
|---|
| 15 |
return spaceRe.sub(text, ' ') |
|---|
| 16 |
|
|---|
| 17 |
entities = latex.entities.copy() |
|---|
| 18 |
entities['copy'] = '@copyright{}' |
|---|
| 19 |
|
|---|
| 20 |
class TexiSpitter(latex.BaseLatexSpitter): |
|---|
| 21 |
|
|---|
| 22 |
baseLevel = 1 |
|---|
| 23 |
|
|---|
| 24 |
def writeNodeData(self, node): |
|---|
| 25 |
buf = StringIO() |
|---|
| 26 |
latex.getLatexText(node, self.writer, texiEscape, entities) |
|---|
| 27 |
|
|---|
| 28 |
def visitNode_title(self, node): |
|---|
| 29 |
self.writer('@node ') |
|---|
| 30 |
self.visitNodeDefault(node) |
|---|
| 31 |
self.writer('\n') |
|---|
| 32 |
self.writer('@section ') |
|---|
| 33 |
self.visitNodeDefault(node) |
|---|
| 34 |
self.writer('\n') |
|---|
| 35 |
headers = tree.getHeaders(domhelpers.getParents(node)[-1]) |
|---|
| 36 |
if not headers: |
|---|
| 37 |
return |
|---|
| 38 |
self.writer('@menu\n') |
|---|
| 39 |
for header in headers: |
|---|
| 40 |
self.writer('* %s::\n' % domhelpers.getNodeText(header)) |
|---|
| 41 |
self.writer('@end menu\n') |
|---|
| 42 |
|
|---|
| 43 |
def visitNode_pre(self, node): |
|---|
| 44 |
self.writer('@verbatim\n') |
|---|
| 45 |
buf = StringIO() |
|---|
| 46 |
latex.getLatexText(node, buf.write, entities=entities) |
|---|
| 47 |
self.writer(text.removeLeadingTrailingBlanks(buf.getvalue())) |
|---|
| 48 |
self.writer('@end verbatim\n') |
|---|
| 49 |
|
|---|
| 50 |
def visitNode_code(self, node): |
|---|
| 51 |
fout = StringIO() |
|---|
| 52 |
latex.getLatexText(node, fout.write, texiEscape, entities) |
|---|
| 53 |
self.writer('@code{'+fout.getvalue()+'}') |
|---|
| 54 |
|
|---|
| 55 |
def visitNodeHeader(self, node): |
|---|
| 56 |
self.writer('\n\n@node ') |
|---|
| 57 |
self.visitNodeDefault(node) |
|---|
| 58 |
self.writer('\n') |
|---|
| 59 |
level = (int(node.tagName[1])-2)+self.baseLevel |
|---|
| 60 |
self.writer('\n\n@'+level*'sub'+'section ') |
|---|
| 61 |
self.visitNodeDefault(node) |
|---|
| 62 |
self.writer('\n') |
|---|
| 63 |
|
|---|
| 64 |
def visitNode_a_listing(self, node): |
|---|
| 65 |
fileName = os.path.join(self.currDir, node.getAttribute('href')) |
|---|
| 66 |
self.writer('@verbatim\n') |
|---|
| 67 |
self.writer(open(fileName).read()) |
|---|
| 68 |
self.writer('@end verbatim') |
|---|
| 69 |
|
|---|
| 70 |
|
|---|
| 71 |
def visitNode_a_href(self, node): |
|---|
| 72 |
self.visitNodeDefault(node) |
|---|
| 73 |
|
|---|
| 74 |
def visitNode_a_name(self, node): |
|---|
| 75 |
self.visitNodeDefault(node) |
|---|
| 76 |
|
|---|
| 77 |
visitNode_h2 = visitNode_h3 = visitNode_h4 = visitNodeHeader |
|---|
| 78 |
|
|---|
| 79 |
start_dl = '@itemize\n' |
|---|
| 80 |
end_dl = '@end itemize\n' |
|---|
| 81 |
start_ul = '@itemize\n' |
|---|
| 82 |
end_ul = '@end itemize\n' |
|---|
| 83 |
|
|---|
| 84 |
start_ol = '@enumerate\n' |
|---|
| 85 |
end_ol = '@end enumerate\n' |
|---|
| 86 |
|
|---|
| 87 |
start_li = '@item\n' |
|---|
| 88 |
end_li = '\n' |
|---|
| 89 |
|
|---|
| 90 |
start_dt = '@item\n' |
|---|
| 91 |
end_dt = ': ' |
|---|
| 92 |
end_dd = '\n' |
|---|
| 93 |
|
|---|
| 94 |
start_p = '\n\n' |
|---|
| 95 |
|
|---|
| 96 |
start_strong = start_em = '@emph{' |
|---|
| 97 |
end_strong = end_em = '}' |
|---|
| 98 |
|
|---|
| 99 |
start_q = "``" |
|---|
| 100 |
end_q = "''" |
|---|
| 101 |
|
|---|
| 102 |
start_span_footnote = '@footnote{' |
|---|
| 103 |
end_span_footnote = '}' |
|---|
| 104 |
|
|---|
| 105 |
start_div_note = '@quotation\n@strong{Note:}' |
|---|
| 106 |
end_div_note = '@end quotation\n' |
|---|
| 107 |
|
|---|
| 108 |
start_th = '@strong{' |
|---|
| 109 |
end_th = '}' |
|---|