# HG changeset patch # User cmlenz # Date 1155828132 0 # Node ID 7888f4104cc07420a3a3224fe4ca6c9b4c0dd5c8 # Parent 718cba809cea4a985bd32878c565129b5e4fb57d Handle non-ASCII characters in expressions. Closes #29. Thanks to Arnar Birgisson for reporting the problem and comping up with a patch! diff --git a/markup/eval.py b/markup/eval.py --- 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, - '' % (str(source) or '?'), lineno, - code.co_lnotab, (), ()) + '' % (repr(source).replace("'", '"') or '?'), + lineno, code.co_lnotab, (), ()) def _lookup_name(data, name, locals_=None): val = None diff --git a/markup/tests/eval.py b/markup/tests/eval.py --- 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({}))