changeset 167:1999291f7a30 trunk

Handle non-ASCII characters in expressions. Closes #29. Thanks to Arnar Birgisson for reporting the problem and comping up with a patch!
author cmlenz
date Thu, 17 Aug 2006 15:22:12 +0000
parents d43f50402cf2
children 5f538e761701
files markup/eval.py markup/tests/eval.py
diffstat 2 files changed, 11 insertions(+), 3 deletions(-) [+]
line wrap: on
line diff
--- a/markup/eval.py
+++ b/markup/eval.py
@@ -67,7 +67,9 @@
     def __init__(self, source, filename=None, lineno=-1):
         if isinstance(source, basestring):
             self.source = source
-            self.code = _compile(parse(source, 'eval'), source,
+            if isinstance(source, unicode):
+                source = '\xef\xbb\xbf' + source.encode('utf-8')
+            self.code = _compile(parse(source, 'eval'), self.source,
                                  filename=filename, lineno=lineno)
         else:
             assert isinstance(source, ast.Node)
@@ -115,8 +117,8 @@
     return new.code(0, code.co_nlocals, code.co_stacksize,
                     code.co_flags | 0x0040, code.co_code, code.co_consts,
                     code.co_names, code.co_varnames, filename,
-                    '<Expression "%s">' % (str(source) or '?'), lineno,
-                    code.co_lnotab, (), ())
+                    '<Expression %s>' % (repr(source).replace("'", '"') or '?'),
+                    lineno, code.co_lnotab, (), ())
 
 def _lookup_name(data, name, locals_=None):
     val = None
--- a/markup/tests/eval.py
+++ b/markup/tests/eval.py
@@ -28,6 +28,12 @@
         self.assertEqual('foo', Expression("u'foo'").evaluate({}))
         self.assertEqual('foo', Expression("r'foo'").evaluate({}))
 
+    def test_str_literal_non_ascii(self):
+        expr = Expression(u"u'\xfe'")
+        self.assertEqual(u'þ', expr.evaluate({}))
+        expr = Expression("u'\xfe'")
+        self.assertEqual(u'þ', expr.evaluate({}))
+
     def test_num_literal(self):
         self.assertEqual(42, Expression("42").evaluate({}))
         self.assertEqual(42L, Expression("42L").evaluate({}))
Copyright (C) 2012-2017 Edgewall Software