Make ajustments in PR #15. For now leaving #16 open. This fixes #14, and closes #15.

This commit is contained in:
Christopher Ramírez 2015-04-29 11:54:35 -06:00
parent 1cffe9f224
commit d6abc37ccb

View file

@ -26,6 +26,7 @@ from os import path
from mimetypes import guess_type, guess_extension from mimetypes import guess_type, guess_extension
from uuid import uuid4 from uuid import uuid4
from xml.dom.minidom import parseString from xml.dom.minidom import parseString
from xml.parsers.expat import ExpatError
from jinja2 import Environment, Undefined from jinja2 import Environment, Undefined
# Test python versions and normalize calls to basestring, unicode, etc. # Test python versions and normalize calls to basestring, unicode, etc.
@ -313,18 +314,16 @@ class Renderer(object):
and unescapes HTML codes for >, <, & and " and unescapes HTML codes for >, <, & and "
""" """
unescape_rules = { unescape_rules = {
r'(?is)({[{|%].*)(<.?text:s.*?>)(.*[%|}]})': r'\1\3',
r'(?is)({[{|%].*)(&gt;)(.*[%|}]})': r'\1>\3', r'(?is)({[{|%].*)(&gt;)(.*[%|}]})': r'\1>\3',
r'(?is)({[{|%].*)(&lt;)(.*[%|}]})': r'\1<\3', r'(?is)({[{|%].*)(&lt;)(.*[%|}]})': r'\1<\3',
r'(?is)({[{|%].*)(&amp;)(.*[%|}]})': r'\1&\3', r'(?is)({[{|%].*)(&amp;)(.*[%|}]})': r'\1&\3',
r'(?is)({[{|%].*)(&quot;)(.*[%|}]})': r'\1"\3' r'(?is)({[{|%].*)(&quot;)(.*[%|}]})': r'\1"\3'
} }
for p, r in unescape_rules.items(): for regexp, replacement in unescape_rules.items():
count = None subs_made = True
while count != 0: while subs_made:
xml_text, count = re.subn(p, r, xml_text) xml_text, subs_made = re.subn(regexp, replacement, xml_text)
return xml_text return xml_text
@ -451,17 +450,21 @@ class Renderer(object):
try: try:
self.template_images = dict() self.template_images = dict()
self._prepare_template_tags(xml_document) self._prepare_template_tags(xml_document)
template_string = Renderer._unescape_entities(xml_document.toxml()) template_string = self._unescape_entities(xml_document.toxml())
jinja_template = self.environment.from_string(template_string) jinja_template = self.environment.from_string(template_string)
result = jinja_template.render(**kwargs) result = jinja_template.render(**kwargs)
result = Renderer._encode_escape_chars(result) result = self._encode_escape_chars(result)
final_xml = parseString(result.encode('ascii', 'xmlcharrefreplace')) final_xml = parseString(result.encode('ascii', 'xmlcharrefreplace'))
if self.template_images: if self.template_images:
self.replace_images(final_xml) self.replace_images(final_xml)
return final_xml return final_xml
except ExpatError as e:
near = result.split('\n')[e.lineno -1][e.offset-50:e.offset+50]
raise ExpatError('ExpatError at line %d, column %d\nNear of: "[...]%s[...]"' % \
(e.lineno, e.offset, near))
except: except:
self.log.error('Error rendering template:\n%s', self.log.error('Error rendering template:\n%s',
xml_document.toprettyxml(), exc_info=True) xml_document.toprettyxml(), exc_info=True)