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