diff options
-rw-r--r-- | CHANGES | 6 | ||||
-rw-r--r-- | MANIFEST.in | 2 | ||||
-rw-r--r-- | cheetah/Filters.py | 35 | ||||
-rw-r--r-- | cheetah/Template.py | 25 | ||||
-rw-r--r-- | cheetah/Tests/Unicode.py | 16 |
5 files changed, 52 insertions, 32 deletions
@@ -1,13 +1,15 @@ -2.4.0 (October 15th, 2009) +2.4.0 (October 24th, 2009) - Fix a major performance regression in Template.__init__() - More graceful handling of unicode when calling .respond() to render a template - Minor code updates + - Update the default filter (thanks mikeb!) -2.3.0 (October 15th, 2009) (loosely equivalent to 2.4.0) +2.3.0 (October 24th, 2009) (loosely equivalent to 2.4.0) - Fix a major performance regression in Template.__init__() - More graceful handling of unicode when calling .respond() to render a template - Minor code updates + - Update the default filter (thanks mikeb!) 2.2.2 (September 10th, 2009) - Prevent _namemapper.c from segfaulting when PyImport_ImportModule fails for some reason (Bogdano Arendartchuk <debogdano@gmail.com>) diff --git a/MANIFEST.in b/MANIFEST.in index 266004d..f1d1938 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,4 +1,4 @@ -include MANIFEST.in *.py *.cfg TODO CHANGES LICENSE README examples docs bin +include MANIFEST.in *.py *.cfg TODO CHANGES LICENSE README.markdown examples docs bin recursive-include cheetah *.py *.tmpl *.txt recursive-include bin * recursive-include docs * diff --git a/cheetah/Filters.py b/cheetah/Filters.py index dd65f28..d452439 100644 --- a/cheetah/Filters.py +++ b/cheetah/Filters.py @@ -29,40 +29,19 @@ class Filter(object): if val is None: return u'' if isinstance(val, unicode): - if encoding: - return val.encode(encoding) - else: - return val + # ignore the encoding and return the unicode object + return val else: try: - return str(val) - except UnicodeEncodeError: return unicode(val) - return u'' + except UnicodeDecodeError: + # we could put more fallbacks here, but we'll just pass the str + # on and let DummyTransaction worry about it + return str(val) RawOrEncodedUnicode = Filter -class EncodeUnicode(Filter): - def filter(self, val, - encoding='utf8', - str=str, - **kw): - """Encode Unicode strings, by default in UTF-8. - - >>> import Cheetah.Template - >>> t = Cheetah.Template.Template(''' - ... $myvar - ... ${myvar, encoding='utf16'} - ... ''', searchList=[{'myvar': u'Asni\xe8res'}], - ... filter='EncodeUnicode') - >>> print t - """ - if isinstance(val, unicode): - return val.encode(encoding) - if val is None: - return '' - return str(val) - +EncodeUnicode = Filter class Markdown(EncodeUnicode): ''' diff --git a/cheetah/Template.py b/cheetah/Template.py index a8889d2..ec92208 100644 --- a/cheetah/Template.py +++ b/cheetah/Template.py @@ -994,22 +994,45 @@ class Template(Servlet): mainMethName = getattr(concreteTemplateClass,mainMethNameAttr, None) if mainMethName: def __str__(self): + rc = getattr(self, mainMethName)() + if isinstance(rc, unicode): + return rc.encode('utf-8') + return rc + def __unicode__(self): return getattr(self, mainMethName)() elif (hasattr(concreteTemplateClass, 'respond') and concreteTemplateClass.respond!=Servlet.respond): def __str__(self): + rc = self.respond() + if isinstance(rc, unicode): + return rc.encode('utf-8') + return rc + def __unicode__(self): return self.respond() else: def __str__(self): + rc = None + if hasattr(self, mainMethNameAttr): + rc = getattr(self,mainMethNameAttr)() + elif hasattr(self, 'respond'): + rc = self.respond() + else: + rc = super(self.__class__, self).__str__() + if isinstance(rc, unicode): + return rc.encode('utf-8') + return rc + def __unicode__(self): if hasattr(self, mainMethNameAttr): return getattr(self,mainMethNameAttr)() elif hasattr(self, 'respond'): return self.respond() else: - return super(self.__class__, self).__str__() + return super(self.__class__, self).__unicode__() __str__ = new.instancemethod(__str__, None, concreteTemplateClass) + __unicode__ = new.instancemethod(__unicode__, None, concreteTemplateClass) setattr(concreteTemplateClass, '__str__', __str__) + setattr(concreteTemplateClass, '__unicode__', __unicode__) _addCheetahPlumbingCodeToClass = classmethod(_addCheetahPlumbingCodeToClass) diff --git a/cheetah/Tests/Unicode.py b/cheetah/Tests/Unicode.py index d627503..12c00ac 100644 --- a/cheetah/Tests/Unicode.py +++ b/cheetah/Tests/Unicode.py @@ -150,6 +150,22 @@ $someUnicodeString""" a = unicode(template).encode("utf-8") self.assertEquals("Bébé", a) +class EncodeUnicodeCompatTest(unittest.TestCase): + """ + Taken initially from Red Hat's bugzilla #529332 + https://bugzilla.redhat.com/show_bug.cgi?id=529332 + """ + def runTest(self): + t = Template("""Foo ${var}""", filter='EncodeUnicode') + t.var = u"Text with some non-ascii characters: åäö" + + rc = t.respond() + assert isinstance(rc, unicode), ('Template.respond() should return unicode', rc) + + rc = str(t) + assert isinstance(rc, str), ('Template.__str__() should return a UTF-8 encoded string', rc) + + class Unicode_in_SearchList_Test(CommandLineTest): def test_BasicASCII(self): source = '''This is $adjective''' |