From 758daeeaabb19a483c5fafcf1421795bda31f6b3 Mon Sep 17 00:00:00 2001 From: Max Podolskii Date: Wed, 19 Dec 2018 23:13:06 -0800 Subject: [PATCH] Fixed issue #159: autoescaped values for both str and unicode. --- docxtpl/__init__.py | 6 +++--- tests/escape_auto.py | 29 ++++++++++++++++++++------- tests/templates/escape_tpl_auto.docx | Bin 17961 -> 18082 bytes 3 files changed, 25 insertions(+), 10 deletions(-) diff --git a/docxtpl/__init__.py b/docxtpl/__init__.py index 1f57b24..23f622d 100644 --- a/docxtpl/__init__.py +++ b/docxtpl/__init__.py @@ -267,9 +267,9 @@ class DocxTemplate(object): identities.add(identity) escape_recursively(v, identities) else: - # Avoid dict, Listing, InlineImage, RichText, etc. classes - # by comparing `v` to `str`. Do not use try-except. - if isinstance(v, str): + # Avoid dict, Listing, InlineImage, RichText, etc classes + # Do not use try-except. + if isinstance(v, six.string_types): # Unescape at first to avoid secondary escaping d[k] = escape(unescape(v)) diff --git a/tests/escape_auto.py b/tests/escape_auto.py index 7fea908..bafbfc2 100644 --- a/tests/escape_auto.py +++ b/tests/escape_auto.py @@ -1,13 +1,28 @@ -from docxtpl import * +""" +@author: Max Podolskii +""" + +import os +from unicodedata import name + +from six import iteritems, text_type + +from docxtpl import DocxTemplate + + +XML_RESERVED = """<"&'>""" tpl = DocxTemplate('templates/escape_tpl_auto.docx') -context = {'myvar': R('"less than" must be escaped : <, this can be done with RichText() or R()'), - 'myescvar': 'It can be escaped with a "|e" jinja filter in the template too : < ', - 'nlnp': R('Here is a multiple\nlines\nstring\aand some\aother\aparagraphs\aNOTE: the current character styling is removed'), - 'mylisting': Listing('the listing\nwith\nsome\nlines\nand special chars : <>&'), - 'autoescape': """<, >, &, ", and '.""" +context = {'nested_dict': {name(text_type(c)): c for c in XML_RESERVED}, + 'autoescape': 'Escaped "str & ing"!', + 'autoescape_unicode': u'This is an escaped example \u4f60 & \u6211', + 'iteritems': iteritems, } tpl.render(context, autoescape=True) -tpl.save('output/escape_auto.docx') + +OUTPUT = 'output' +if not os.path.exists(OUTPUT): + os.makedirs(OUTPUT) +tpl.save(OUTPUT + '/escape_auto.docx') diff --git a/tests/templates/escape_tpl_auto.docx b/tests/templates/escape_tpl_auto.docx index 4d59e552da4a46f7d66c5e3c35976437ebc5761f..df5f361a46a6fd5b714e317bb4e51a2985863255 100644 GIT binary patch delta 6153 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 V!2kF3dDS8X2~}c1wUYh2`#-+b2DAVG