Mercurial > genshi > mirror
comparison markup/eval.py @ 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 | 54a4be707664 |
children | 061491fb4ea8 |
comparison
equal
deleted
inserted
replaced
166:d43f50402cf2 | 167:1999291f7a30 |
---|---|
65 __slots__ = ['source', 'code'] | 65 __slots__ = ['source', 'code'] |
66 | 66 |
67 def __init__(self, source, filename=None, lineno=-1): | 67 def __init__(self, source, filename=None, lineno=-1): |
68 if isinstance(source, basestring): | 68 if isinstance(source, basestring): |
69 self.source = source | 69 self.source = source |
70 self.code = _compile(parse(source, 'eval'), source, | 70 if isinstance(source, unicode): |
71 source = '\xef\xbb\xbf' + source.encode('utf-8') | |
72 self.code = _compile(parse(source, 'eval'), self.source, | |
71 filename=filename, lineno=lineno) | 73 filename=filename, lineno=lineno) |
72 else: | 74 else: |
73 assert isinstance(source, ast.Node) | 75 assert isinstance(source, ast.Node) |
74 self.source = '?' | 76 self.source = '?' |
75 self.code = _compile(ast.Expression(source), filename=filename, | 77 self.code = _compile(ast.Expression(source), filename=filename, |
113 # We'd like to just set co_firstlineno, but it's readonly. So we need to | 115 # We'd like to just set co_firstlineno, but it's readonly. So we need to |
114 # clone the code object while adjusting the line number | 116 # clone the code object while adjusting the line number |
115 return new.code(0, code.co_nlocals, code.co_stacksize, | 117 return new.code(0, code.co_nlocals, code.co_stacksize, |
116 code.co_flags | 0x0040, code.co_code, code.co_consts, | 118 code.co_flags | 0x0040, code.co_code, code.co_consts, |
117 code.co_names, code.co_varnames, filename, | 119 code.co_names, code.co_varnames, filename, |
118 '<Expression "%s">' % (str(source) or '?'), lineno, | 120 '<Expression %s>' % (repr(source).replace("'", '"') or '?'), |
119 code.co_lnotab, (), ()) | 121 lineno, code.co_lnotab, (), ()) |
120 | 122 |
121 def _lookup_name(data, name, locals_=None): | 123 def _lookup_name(data, name, locals_=None): |
122 val = None | 124 val = None |
123 if locals_: | 125 if locals_: |
124 val = locals_.get(name) | 126 val = locals_.get(name) |