It is possible to write a renderer with just a couple of methods: default and textDefault. The code below demonstrates how one might create a generic XML renderer that simply uses the node names as XML tag names. The text node renderer escapes the <, >, and & characters.
import string from plasTeX.Renderers import Renderer class Renderer(Renderer): def default(self, node): """ Rendering method for all non-text nodes """ s = [] # Handle characters like \&, \$, \%, etc. if len(node.nodeName) == 1 and node.nodeName not in string.letters: return self.textDefault(node.nodeName) # Start tag s.append('<%s>' % node.nodeName) # See if we have any attributes to render if node.hasAttributes(): s.append('<attributes>') for key, value in node.attributes.items(): # If the key is 'self', don't render it # these nodes are the same as the child nodes if key == 'self': continue s.append('<%s>%s</%s>' % (key, unicode(value), key)) s.append('</attributes>') # Invoke rendering on child nodes s.append(unicode(node)) # End tag s.append('</%s>' % node.nodeName) return u'\n'.join(s) def textDefault(self, node): """ Rendering method for all text nodes """ return node.replace('&','&').replace('<','<').replace('>','>')
To use the renderer, simply parse a LaTeX document and apply the renderer using the render method.
# Import renderer from previous code sample from MyRenderer import Renderer from plasTeX.TeX import TeX # Instantiate a TeX processor and parse the input text tex = TeX() tex.ownerDocument.config['files']['split-level'] = -100 tex.ownerDocument.config['files']['filename'] = 'test.xml' tex.input(r''' \documentclass{book} \begin{document} Previous paragraph. \section{My Section} \begin{center} Centered text with <, >, and \& charaters. \end{center} Next paragraph. \end{document} ''') document = tex.parse() # Render the document renderer = Renderer() renderer.render(document)
The output from the renderer, located in ‘test.xml’, looks like the following.
<document> <par> Previous paragraph. </par><section> <attributes> <toc>None</toc> <*modifier*>None</*modifier*> <title>My Section</title> </attributes> <par> <center> Centered text with <, >, and & charaters. </center> </par><par> Next paragraph. </par> </section> </document>