From b1c4f2d170e7e12ebfae7817f884fa3648bca600 Mon Sep 17 00:00:00 2001 From: Mike Bayer <mike_mp@zzzcomputing.com> Date: Sat, 3 May 2008 15:52:41 +0000 Subject: [PATCH] - some refinements to FastEncodingBuffer re: unicode - fixed buffering when disable_unicode is used --- lib/mako/codegen.py | 7 ++----- lib/mako/runtime.py | 7 +++---- lib/mako/util.py | 11 ++++++++--- test/template.py | 5 +++-- test_htdocs/chs_utf8.html | 6 ++++++ 5 files changed, 22 insertions(+), 14 deletions(-) diff --git a/lib/mako/codegen.py b/lib/mako/codegen.py index e6b5476..3600b3d 100644 --- a/lib/mako/codegen.py +++ b/lib/mako/codegen.py @@ -16,11 +16,8 @@ MAGIC_NUMBER = 2 def compile(node, uri, filename=None, default_filters=None, buffer_filters=None, imports=None, source_encoding=None, generate_unicode=True): """generate module source code given a parsetree node, uri, and optional source filename""" - - if generate_unicode: - buf = util.FastEncodingBuffer() # creates Unicode - else: - buf = util.StringIO() # returns whatever was passed in + + buf = util.FastEncodingBuffer(unicode=generate_unicode) printer = PythonPrinter(buf) _GenerateRenderMethod(printer, _CompileContext(uri, filename, default_filters, buffer_filters, imports, source_encoding, generate_unicode), node) diff --git a/lib/mako/runtime.py b/lib/mako/runtime.py index e124b6b..7704a95 100644 --- a/lib/mako/runtime.py +++ b/lib/mako/runtime.py @@ -321,10 +321,9 @@ def _populate_self_namespace(context, template, self_ns=None): def _render(template, callable_, args, data, as_unicode=False): """create a Context and return the string output of the given template and template callable.""" - if as_unicode: - buf = util.FastEncodingBuffer() - elif not template.disable_unicode and template.output_encoding: - buf = util.FastEncodingBuffer(template.output_encoding, template.encoding_errors) + + if as_unicode or template.output_encoding: + buf = util.FastEncodingBuffer(unicode=as_unicode, encoding=template.output_encoding, errors=template.encoding_errors) else: buf = util.StringIO() context = Context(buf, **data) diff --git a/lib/mako/util.py b/lib/mako/util.py index ac8ac2c..e582792 100644 --- a/lib/mako/util.py +++ b/lib/mako/util.py @@ -56,17 +56,22 @@ class SetLikeDict(dict): class FastEncodingBuffer(object): """a very rudimentary buffer that is faster than StringIO, but doesnt crash on unicode data like cStringIO.""" - def __init__(self, encoding=None, errors='strict'): + def __init__(self, encoding=None, errors='strict', unicode=False): self.data = [] self.encoding = encoding + if unicode: + self.delim = u'' + else: + self.delim = '' + self.unicode = unicode self.errors = errors self.write = self.data.append def getvalue(self): if self.encoding: - return u''.join(self.data).encode(self.encoding, self.errors) + return self.delim.join(self.data).encode(self.encoding, self.errors) else: - return u''.join(self.data) + return self.delim.join(self.data) class LRUCache(dict): """A dictionary-like object that stores a limited number of items, discarding diff --git a/test/template.py b/test/template.py index 4ad8c21..123bfdf 100644 --- a/test/template.py +++ b/test/template.py @@ -168,11 +168,12 @@ class EncodingTest(unittest.TestCase): def test_bytestring_passthru(self): lookup = TemplateLookup(directories=['./test_htdocs'], default_filters=[], disable_unicode=True) template = lookup.get_template('/chs_utf8.html') - self.assertEquals(flatten_result(template.render(name='毛泽东')), '毛泽东 是 æ–°ä¸å›½çš„主å¸<br/> Welcome ä½ to 北京.') + self.assertEquals(flatten_result(template.render(name='毛泽东')), '毛泽东 是 æ–°ä¸å›½çš„主å¸<br/> Welcome ä½ to 北京. Welcome ä½ to 北京.') lookup = TemplateLookup(directories=['./test_htdocs'], disable_unicode=True) template = lookup.get_template('/chs_utf8.html') - self.assertEquals(flatten_result(template.render(name='毛泽东')), '毛泽东 是 æ–°ä¸å›½çš„主å¸<br/> Welcome ä½ to 北京.') + self.assertEquals(flatten_result(template.render(name='毛泽东')), '毛泽东 是 æ–°ä¸å›½çš„主å¸<br/> Welcome ä½ to 北京. Welcome ä½ to 北京.') + self.assertRaises(UnicodeDecodeError, template.render_unicode, name='毛泽东') template = Template("""${'Alors vous imaginez ma surprise, au lever du jour, quand une drôle de petit voix m’a réveillé. Elle disait: « S’il vous plaît… dessine-moi un mouton! »'}""", disable_unicode=True, input_encoding='utf-8') diff --git a/test_htdocs/chs_utf8.html b/test_htdocs/chs_utf8.html index 35b888d..f9a7035 100644 --- a/test_htdocs/chs_utf8.html +++ b/test_htdocs/chs_utf8.html @@ -7,5 +7,11 @@ Welcome ${who} to ${place}. </%def> +<%def name="welcome_buffered(who, place='北京')" buffered="True"> +Welcome ${who} to ${place}. +</%def> + ${name} 是 ${msg}<br/> ${welcome('ä½ ')} +${welcome_buffered('ä½ ')} + -- GitLab