Implemented {% paragraph_tag %} tag. When this tag is present in a paragraph, the XML source of the paragraph will be replaced with an additional tag ex. {% if varname %} in the same paragraph.
This commit is contained in:
parent
374a6fcb40
commit
394867c694
2 changed files with 122 additions and 39 deletions
159
renders.py
159
renders.py
|
|
@ -34,58 +34,141 @@ import re
|
|||
import os
|
||||
import zipfile
|
||||
import xml.dom.minidom
|
||||
from jinja2 import Template as TemplateEngine
|
||||
|
||||
|
||||
try:
|
||||
from jinja2 import Template as TemplateEngine
|
||||
except ImportError:
|
||||
from django.template import Template as TemplateEngine
|
||||
|
||||
|
||||
PARAGRAPH_TAG = '{% paragraph_tag %}'
|
||||
|
||||
class BaseRender():
|
||||
"""
|
||||
Prapares a XML string or file to be processed by a templating system.
|
||||
|
||||
Use example:
|
||||
render = BaseRender('content/xml', var1, var2.. varN)
|
||||
render.render
|
||||
"""
|
||||
"""
|
||||
Prapares a XML string or file to be processed by a templating system.
|
||||
|
||||
Use example:
|
||||
render = BaseRender('content/xml', var1, var2.. varN)
|
||||
render.render
|
||||
"""
|
||||
|
||||
def __init__(self, xml_doc, **template_args):
|
||||
self.template_vars = template_args
|
||||
self.xml_document = xml.dom.minidom.parse(xml_doc)
|
||||
body = self.xml_document.getElementsByTagName('office:body')
|
||||
self.content_body = body and body[0]
|
||||
def __init__(self, xml_doc, **template_args):
|
||||
self.template_vars = template_args
|
||||
self.xml_document = xml.dom.minidom.parse(xml_doc)
|
||||
body = self.xml_document.getElementsByTagName('office:body')
|
||||
self.content_body = body and body[0]
|
||||
|
||||
# ------------------------------------------------------------------------@
|
||||
|
||||
def render_with_engine(self):
|
||||
"""
|
||||
Once the XML have been prepared, this routine is called
|
||||
to do the actual rendering.
|
||||
"""
|
||||
template = TemplateEngine(self.content_body.toxml())
|
||||
return template.render(**self.template_vars)
|
||||
# ------------------------------------------------------------------------@
|
||||
|
||||
|
||||
def render(self):
|
||||
"""
|
||||
render prepares the XML and the call render_with_engine
|
||||
to parse template engine tags
|
||||
"""
|
||||
# TODO:
|
||||
# Prepare {% blocks|if|for|etc %} for rendering
|
||||
return self.render_with_engine()
|
||||
def get_paragraph_parent(self, node):
|
||||
"""
|
||||
Returns the first node's parent with name "text:p"
|
||||
If parent "text:p" is not found, returns None.
|
||||
"""
|
||||
|
||||
if hasattr(node, 'parentNode'):
|
||||
if node.parentNode.nodeName.lower() == 'text:p':
|
||||
return node.parentNode
|
||||
else:
|
||||
return get_paragraph_parent(node.parentNode)
|
||||
else:
|
||||
return None
|
||||
|
||||
# ------------------------------------------------------------------------@
|
||||
|
||||
|
||||
def render_with_engine(self):
|
||||
"""
|
||||
Once the XML have been prepared, this routine is called
|
||||
to do the actual rendering.
|
||||
"""
|
||||
template = TemplateEngine(self.xml_document.toxml())
|
||||
return template.render(**self.template_vars)
|
||||
|
||||
# -----------------------------------------------------------------------
|
||||
|
||||
|
||||
def scan_child_nodes(self, nodes):
|
||||
"""
|
||||
|
||||
"""
|
||||
if nodes.hasChildNodes():
|
||||
child_nodes = nodes.childNodes
|
||||
|
||||
for node in child_nodes:
|
||||
if node.nodeType == node.TEXT_NODE:
|
||||
node_text = node.data.lower()
|
||||
|
||||
# replace a paragraph node with contained tags
|
||||
# if tag PARAGRAPH_TAG is in paragraph content.
|
||||
|
||||
if node_text.find(PARAGRAPH_TAG) > -1:
|
||||
# Get this node text:p parent
|
||||
paragraph_node = self.get_paragraph_parent(node)
|
||||
paragraph_parent = paragraph_node.parentNode
|
||||
|
||||
|
||||
# Discar PARAGRAPH_TAG
|
||||
pgraph_node_text = \
|
||||
paragraph_node.toxml().replace(PARAGRAPH_TAG, '')
|
||||
|
||||
# replace text:p node's XML with its contained templates tags.
|
||||
new_node_text = \
|
||||
' '.join(re.findall('(\{.*?\})', pgraph_node_text))
|
||||
|
||||
new_node = xml_document.createTextNode(new_node_text)
|
||||
paragraph_parent.replaceChild(new_node, paragraph_node)
|
||||
|
||||
else:
|
||||
if node.hasChildNodes():
|
||||
scan_child_nodes(node)
|
||||
|
||||
# -----------------------------------------------------------------------
|
||||
|
||||
|
||||
def handle_special_tags(self):
|
||||
"""
|
||||
|
||||
"""
|
||||
paragraphs = self.content_body.getElementsByTagName('text:p')
|
||||
for paragraph in paragraphs:
|
||||
self.scan_child_nodes(paragraph)
|
||||
|
||||
# -----------------------------------------------------------------------
|
||||
|
||||
|
||||
def render(self):
|
||||
"""
|
||||
render prepares the XML and the call render_with_engine
|
||||
to parse template engine tags
|
||||
"""
|
||||
|
||||
self.handle_special_tags()
|
||||
|
||||
return self.render_with_engine()
|
||||
|
||||
# -----------------------------------------------------------------------
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
print 'Testing with content.xml\n'
|
||||
|
||||
render = BaseRender('content.xml', name='Christopher')
|
||||
print render.render()
|
||||
data = {
|
||||
'name': u'Christopher Ramirez',
|
||||
'country': 'Nicaragua'
|
||||
}
|
||||
|
||||
# xml_document = xml.dom.minidom.parse('content.xml')
|
||||
# doc_body = xml_document.getElementsByTagName('office:body')
|
||||
# doc_body = doc_body and doc_body[0]
|
||||
render = BaseRender('content.xml', record=data)
|
||||
print render.render()
|
||||
|
||||
# template = Template(doc_body.toprettyxml())
|
||||
# xml_document = xml.dom.minidom.parse('content.xml')
|
||||
# doc_body = xml_document.getElementsByTagName('office:body')
|
||||
# doc_body = doc_body and doc_body[0]
|
||||
|
||||
# print template.render( name='Christopher :)' )
|
||||
# template = Template(doc_body.toprettyxml())
|
||||
|
||||
# print template.render( name='Christopher :)' )
|
||||
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue