| Index: third_party/twisted_8_1/twisted/lore/latex.py
|
| diff --git a/third_party/twisted_8_1/twisted/lore/latex.py b/third_party/twisted_8_1/twisted/lore/latex.py
|
| deleted file mode 100644
|
| index ee27cb133cc08a512e06dba9ca23e0884dd4630c..0000000000000000000000000000000000000000
|
| --- a/third_party/twisted_8_1/twisted/lore/latex.py
|
| +++ /dev/null
|
| @@ -1,455 +0,0 @@
|
| -# Copyright (c) 2001-2004 Twisted Matrix Laboratories.
|
| -# See LICENSE for details.
|
| -
|
| -#
|
| -
|
| -from twisted.web import microdom, domhelpers
|
| -from twisted.python import text, procutils
|
| -import os, os.path, re, string
|
| -from cStringIO import StringIO
|
| -
|
| -import urlparse
|
| -
|
| -import tree
|
| -
|
| -escapingRE = re.compile(r'([\[\]#$%&_{}^~\\])')
|
| -lowerUpperRE = re.compile(r'([a-z])([A-Z])')
|
| -
|
| -def _escapeMatch(match):
|
| - c = match.group()
|
| - if c == '\\':
|
| - return '$\\backslash$'
|
| - elif c == '~':
|
| - return '\\~{}'
|
| - elif c == '^':
|
| - return '\\^{}'
|
| - elif c in '[]':
|
| - return '{'+c+'}'
|
| - else:
|
| - return '\\' + c
|
| -
|
| -def latexEscape(text):
|
| - text = escapingRE.sub(_escapeMatch, text)
|
| - return text.replace('\n', ' ')
|
| -
|
| -entities = {'amp': '\&', 'gt': '>', 'lt': '<', 'quot': '"',
|
| - 'copy': '\\copyright', 'mdash': '---', 'rdquo': '``',
|
| - 'ldquo': "''"}
|
| -
|
| -
|
| -def realpath(path):
|
| - # Normalise path
|
| - cwd = os.getcwd()
|
| - path = os.path.normpath(os.path.join(cwd, path))
|
| - if path.startswith(cwd + '/'):
|
| - path = path[len(cwd)+1:]
|
| - return path.replace('\\', '/') # windows slashes make LaTeX blow up
|
| -
|
| -
|
| -def getLatexText(node, writer, filter=lambda x:x, entities=entities):
|
| - if hasattr(node, 'eref'):
|
| - return writer(entities.get(node.eref, ''))
|
| - if hasattr(node, 'data'):
|
| - return writer(filter(node.data))
|
| - for child in node.childNodes:
|
| - getLatexText(child, writer, filter, entities)
|
| -
|
| -class BaseLatexSpitter:
|
| -
|
| - def __init__(self, writer, currDir='.', filename=''):
|
| - self.writer = writer
|
| - self.currDir = currDir
|
| - self.filename = filename
|
| -
|
| - def visitNode(self, node):
|
| - if isinstance(node, microdom.Comment):
|
| - return
|
| - if not hasattr(node, 'tagName'):
|
| - self.writeNodeData(node)
|
| - return
|
| - getattr(self, 'visitNode_'+node.tagName, self.visitNodeDefault)(node)
|
| -
|
| - def visitNodeDefault(self, node):
|
| - self.writer(getattr(self, 'start_'+node.tagName, ''))
|
| - for child in node.childNodes:
|
| - self.visitNode(child)
|
| - self.writer(getattr(self, 'end_'+node.tagName, ''))
|
| -
|
| - def visitNode_a(self, node):
|
| - if node.hasAttribute('class'):
|
| - if node.getAttribute('class').endswith('listing'):
|
| - return self.visitNode_a_listing(node)
|
| - if node.hasAttribute('href'):
|
| - return self.visitNode_a_href(node)
|
| - if node.hasAttribute('name'):
|
| - return self.visitNode_a_name(node)
|
| - self.visitNodeDefault(node)
|
| -
|
| - def visitNode_span(self, node):
|
| - if not node.hasAttribute('class'):
|
| - return self.visitNodeDefault(node)
|
| - node.tagName += '_'+node.getAttribute('class')
|
| - self.visitNode(node)
|
| -
|
| - visitNode_div = visitNode_span
|
| -
|
| - def visitNode_h1(self, node):
|
| - pass
|
| -
|
| - def visitNode_style(self, node):
|
| - pass
|
| -
|
| -
|
| -class LatexSpitter(BaseLatexSpitter):
|
| -
|
| - baseLevel = 0
|
| - diaHack = bool(procutils.which("dia"))
|
| -
|
| - def writeNodeData(self, node):
|
| - buf = StringIO()
|
| - getLatexText(node, buf.write, latexEscape)
|
| - self.writer(buf.getvalue().replace('<', '$<$').replace('>', '$>$'))
|
| -
|
| - def visitNode_head(self, node):
|
| - authorNodes = domhelpers.findElementsWithAttribute(node, 'rel', 'author')
|
| - authorNodes = [n for n in authorNodes if n.tagName == 'link']
|
| -
|
| - if authorNodes:
|
| - self.writer('\\author{')
|
| - authors = []
|
| - for aNode in authorNodes:
|
| - name = aNode.getAttribute('title', '')
|
| - href = aNode.getAttribute('href', '')
|
| - if href.startswith('mailto:'):
|
| - href = href[7:]
|
| - if href:
|
| - if name:
|
| - name += ' '
|
| - name += '$<$' + href + '$>$'
|
| - if name:
|
| - authors.append(name)
|
| -
|
| - self.writer(' \\and '.join(authors))
|
| - self.writer('}')
|
| -
|
| - self.visitNodeDefault(node)
|
| -
|
| - def visitNode_pre(self, node):
|
| - self.writer('\\begin{verbatim}\n')
|
| - buf = StringIO()
|
| - getLatexText(node, buf.write)
|
| - self.writer(text.removeLeadingTrailingBlanks(buf.getvalue()))
|
| - self.writer('\\end{verbatim}\n')
|
| -
|
| - def visitNode_code(self, node):
|
| - fout = StringIO()
|
| - getLatexText(node, fout.write, latexEscape)
|
| - data = lowerUpperRE.sub(r'\1\\linebreak[1]\2', fout.getvalue())
|
| - data = data[:1] + data[1:].replace('.', '.\\linebreak[1]')
|
| - self.writer('\\texttt{'+data+'}')
|
| -
|
| - def visitNode_img(self, node):
|
| - fileName = os.path.join(self.currDir, node.getAttribute('src'))
|
| - target, ext = os.path.splitext(fileName)
|
| - if self.diaHack and os.access(target + '.dia', os.R_OK):
|
| - ext = '.dia'
|
| - fileName = target + ext
|
| - f = getattr(self, 'convert_'+ext[1:], None)
|
| - if not f:
|
| - return
|
| - target = os.path.join(self.currDir, os.path.basename(target)+'.eps')
|
| - f(fileName, target)
|
| - target = os.path.basename(target)
|
| - self._write_img(target)
|
| -
|
| - def _write_img(self, target):
|
| - """Write LaTeX for image."""
|
| - self.writer('\\begin{center}\\includegraphics[%%\n'
|
| - 'width=1.0\n'
|
| - '\\textwidth,height=1.0\\textheight,\nkeepaspectratio]'
|
| - '{%s}\\end{center}\n' % target)
|
| -
|
| - def convert_png(self, src, target):
|
| - # XXX there's a *reason* Python comes with the pipes module -
|
| - # someone fix this to use it.
|
| - r = os.system('pngtopnm "%s" | pnmtops -noturn > "%s"' % (src, target))
|
| - if r != 0:
|
| - raise OSError(r)
|
| -
|
| - def convert_dia(self, src, target):
|
| - # EVIL DISGUSTING HACK
|
| - data = os.popen("gunzip -dc %s" % (src)).read()
|
| - pre = '<dia:attribute name="scaling">\n <dia:real val="1"/>'
|
| - post = '<dia:attribute name="scaling">\n <dia:real val="0.5"/>'
|
| - open('%s_hacked.dia' % (src), 'wb').write(data.replace(pre, post))
|
| - os.system('gzip %s_hacked.dia' % (src,))
|
| - os.system('mv %s_hacked.dia.gz %s_hacked.dia' % (src,src))
|
| - # Let's pretend we never saw that.
|
| -
|
| - # Silly dia needs an X server, even though it doesn't display anything.
|
| - # If this is a problem for you, try using Xvfb.
|
| - os.system("dia %s_hacked.dia -n -e %s" % (src, target))
|
| -
|
| - def visitNodeHeader(self, node):
|
| - level = (int(node.tagName[1])-2)+self.baseLevel
|
| - self.writer('\n\n\\'+level*'sub'+'section{')
|
| - spitter = HeadingLatexSpitter(self.writer, self.currDir, self.filename)
|
| - spitter.visitNodeDefault(node)
|
| - self.writer('}\n')
|
| -
|
| - def visitNode_a_listing(self, node):
|
| - fileName = os.path.join(self.currDir, node.getAttribute('href'))
|
| - self.writer('\\begin{verbatim}\n')
|
| - lines = map(string.rstrip, open(fileName).readlines())
|
| - lines = lines[int(node.getAttribute('skipLines', 0)):]
|
| - self.writer(text.removeLeadingTrailingBlanks('\n'.join(lines)))
|
| - self.writer('\\end{verbatim}')
|
| -
|
| - # Write a caption for this source listing
|
| - fileName = os.path.basename(fileName)
|
| - caption = domhelpers.getNodeText(node)
|
| - if caption == fileName:
|
| - caption = 'Source listing'
|
| - self.writer('\parbox[b]{\linewidth}{\\begin{center}%s --- '
|
| - '\\begin{em}%s\\end{em}\\end{center}}'
|
| - % (latexEscape(caption), latexEscape(fileName)))
|
| -
|
| - def visitNode_a_href(self, node):
|
| - supported_schemes=['http', 'https', 'ftp', 'mailto']
|
| - href = node.getAttribute('href')
|
| - if urlparse.urlparse(href)[0] in supported_schemes:
|
| - text = domhelpers.getNodeText(node)
|
| - self.visitNodeDefault(node)
|
| - if text != href:
|
| - self.writer('\\footnote{%s}' % latexEscape(href))
|
| - else:
|
| - path, fragid = (href.split('#', 1) + [None])[:2]
|
| - if path == '':
|
| - path = self.filename
|
| - else:
|
| - path = os.path.join(os.path.dirname(self.filename), path)
|
| - #if path == '':
|
| - #path = os.path.basename(self.filename)
|
| - #else:
|
| - # # Hack for linking to man pages from howtos, i.e.
|
| - # # ../doc/foo-man.html -> foo-man.html
|
| - # path = os.path.basename(path)
|
| -
|
| - path = realpath(path)
|
| -
|
| - if fragid:
|
| - ref = path + 'HASH' + fragid
|
| - else:
|
| - ref = path
|
| - self.writer('\\textit{')
|
| - self.visitNodeDefault(node)
|
| - self.writer('}')
|
| - self.writer('\\loreref{%s}' % ref)
|
| -
|
| - def visitNode_a_name(self, node):
|
| - #self.writer('\\label{%sHASH%s}' % (os.path.basename(self.filename),
|
| - # node.getAttribute('name')))
|
| - self.writer('\\label{%sHASH%s}' % (realpath(self.filename),
|
| - node.getAttribute('name')))
|
| - self.visitNodeDefault(node)
|
| -
|
| - def visitNode_table(self, node):
|
| - rows = [[col for col in row.childNodes
|
| - if getattr(col, 'tagName', None) in ('th', 'td')]
|
| - for row in node.childNodes if getattr(row, 'tagName', None)=='tr']
|
| - numCols = 1+max([len(row) for row in rows])
|
| - self.writer('\\begin{table}[ht]\\begin{center}')
|
| - self.writer('\\begin{tabular}{@{}'+'l'*numCols+'@{}}')
|
| - for row in rows:
|
| - th = 0
|
| - for col in row:
|
| - self.visitNode(col)
|
| - self.writer('&')
|
| - if col.tagName == 'th':
|
| - th = 1
|
| - self.writer('\\\\\n') #\\ ends lines
|
| - if th:
|
| - self.writer('\\hline\n')
|
| - self.writer('\\end{tabular}\n')
|
| - if node.hasAttribute('title'):
|
| - self.writer('\\caption{%s}'
|
| - % latexEscape(node.getAttribute('title')))
|
| - self.writer('\\end{center}\\end{table}\n')
|
| -
|
| - def visitNode_span_footnote(self, node):
|
| - self.writer('\\footnote{')
|
| - spitter = FootnoteLatexSpitter(self.writer, self.currDir, self.filename)
|
| - spitter.visitNodeDefault(node)
|
| - self.writer('}')
|
| -
|
| - def visitNode_span_index(self, node):
|
| - self.writer('\\index{%s}\n' % node.getAttribute('value'))
|
| - self.visitNodeDefault(node)
|
| -
|
| - visitNode_h2 = visitNode_h3 = visitNode_h4 = visitNodeHeader
|
| -
|
| - start_title = '\\title{'
|
| - end_title = '}\n'
|
| -
|
| - start_sub = '$_{'
|
| - end_sub = '}$'
|
| -
|
| - start_sup = '$^{'
|
| - end_sup = '}$'
|
| -
|
| - start_html = '''\\documentclass{article}
|
| - \\newcommand{\\loreref}[1]{%
|
| - \\ifthenelse{\\value{page}=\\pageref{#1}}%
|
| - { (this page)}%
|
| - { (page \\pageref{#1})}%
|
| - }'''
|
| -
|
| - start_body = '\\begin{document}\n\\maketitle\n'
|
| - end_body = '\\end{document}'
|
| -
|
| - start_dl = '\\begin{description}\n'
|
| - end_dl = '\\end{description}\n'
|
| - start_ul = '\\begin{itemize}\n'
|
| - end_ul = '\\end{itemize}\n'
|
| -
|
| - start_ol = '\\begin{enumerate}\n'
|
| - end_ol = '\\end{enumerate}\n'
|
| -
|
| - start_li = '\\item '
|
| - end_li = '\n'
|
| -
|
| - start_dt = '\\item['
|
| - end_dt = ']'
|
| - end_dd = '\n'
|
| -
|
| - start_p = '\n\n'
|
| -
|
| - start_strong = start_em = '\\begin{em}'
|
| - end_strong = end_em = '\\end{em}'
|
| -
|
| - start_q = "``"
|
| - end_q = "''"
|
| -
|
| - start_div_note = '\\begin{quotation}\\textbf{Note:}'
|
| - end_div_note = '\\end{quotation}'
|
| -
|
| - start_th = '\\textbf{'
|
| - end_th = '}'
|
| -
|
| -
|
| -class SectionLatexSpitter(LatexSpitter):
|
| -
|
| - baseLevel = 1
|
| -
|
| - start_title = '\\section{'
|
| -
|
| - def visitNode_title(self, node):
|
| - self.visitNodeDefault(node)
|
| - #self.writer('\\label{%s}}\n' % os.path.basename(self.filename))
|
| - self.writer('\\label{%s}}\n' % realpath(self.filename))
|
| -
|
| - end_title = end_body = start_body = start_html = ''
|
| -
|
| -
|
| -class ChapterLatexSpitter(SectionLatexSpitter):
|
| - baseLevel = 0
|
| - start_title = '\\chapter{'
|
| -
|
| -
|
| -class HeadingLatexSpitter(BaseLatexSpitter):
|
| - start_q = "``"
|
| - end_q = "''"
|
| -
|
| - writeNodeData = LatexSpitter.writeNodeData.im_func
|
| -
|
| -
|
| -class FootnoteLatexSpitter(LatexSpitter):
|
| - """For multi-paragraph footnotes, this avoids having an empty leading
|
| - paragraph."""
|
| -
|
| - start_p = ''
|
| -
|
| - def visitNode_span_footnote(self, node):
|
| - self.visitNodeDefault(node)
|
| -
|
| - def visitNode_p(self, node):
|
| - self.visitNodeDefault(node)
|
| - self.start_p = LatexSpitter.start_p
|
| -
|
| -class BookLatexSpitter(LatexSpitter):
|
| - def visitNode_body(self, node):
|
| - tocs=domhelpers.locateNodes([node], 'class', 'toc')
|
| - domhelpers.clearNode(node)
|
| - if len(tocs):
|
| - toc=tocs[0]
|
| - node.appendChild(toc)
|
| - self.visitNodeDefault(node)
|
| -
|
| - def visitNode_link(self, node):
|
| - if not node.hasAttribute('rel'):
|
| - return self.visitNodeDefault(node)
|
| - node.tagName += '_'+node.getAttribute('rel')
|
| - self.visitNode(node)
|
| -
|
| - def visitNode_link_author(self, node):
|
| - self.writer('\\author{%s}\n' % node.getAttribute('text'))
|
| -
|
| - def visitNode_link_stylesheet(self, node):
|
| - if node.hasAttribute('type') and node.hasAttribute('href'):
|
| - if node.getAttribute('type')=='application/x-latex':
|
| - packagename=node.getAttribute('href')
|
| - packagebase,ext=os.path.splitext(packagename)
|
| - self.writer('\\usepackage{%s}\n' % packagebase)
|
| -
|
| - start_html = r'''\documentclass[oneside]{book}
|
| -\usepackage{graphicx}
|
| -\usepackage{times,mathptmx}
|
| -'''
|
| -
|
| - start_body = r'''\begin{document}
|
| -\maketitle
|
| -\tableofcontents
|
| -'''
|
| -
|
| - start_li=''
|
| - end_li=''
|
| - start_ul=''
|
| - end_ul=''
|
| -
|
| -
|
| - def visitNode_a(self, node):
|
| - if node.hasAttribute('class'):
|
| - a_class=node.getAttribute('class')
|
| - if a_class.endswith('listing'):
|
| - return self.visitNode_a_listing(node)
|
| - else:
|
| - return getattr(self, 'visitNode_a_%s' % a_class)(node)
|
| - if node.hasAttribute('href'):
|
| - return self.visitNode_a_href(node)
|
| - if node.hasAttribute('name'):
|
| - return self.visitNode_a_name(node)
|
| - self.visitNodeDefault(node)
|
| -
|
| - def visitNode_a_chapter(self, node):
|
| - self.writer('\\chapter{')
|
| - self.visitNodeDefault(node)
|
| - self.writer('}\n')
|
| -
|
| - def visitNode_a_sect(self, node):
|
| - base,ext=os.path.splitext(node.getAttribute('href'))
|
| - self.writer('\\input{%s}\n' % base)
|
| -
|
| -
|
| -
|
| -def processFile(spitter, fin):
|
| - dom = microdom.parse(fin).documentElement
|
| - spitter.visitNode(dom)
|
| -
|
| -
|
| -def convertFile(filename, spitterClass):
|
| - fout = open(os.path.splitext(filename)[0]+".tex", 'w')
|
| - spitter = spitterClass(fout.write, os.path.dirname(filename), filename)
|
| - fin = open(filename)
|
| - processFile(spitter, fin)
|
| - fin.close()
|
| - fout.close()
|
|
|