# HG changeset patch # User cmlenz # Date 1161699382 0 # Node ID caafc67d2d0fa246fe061cb011de69fa5cecf123 # Parent 7e743338a799e90bb5bd0aafab25dc6350656a1d Handle expressions containing non-ASCII strings as arguments for `py:with`, `py:def`, and `py:for`. diff --git a/genshi/eval.py b/genshi/eval.py --- a/genshi/eval.py +++ b/genshi/eval.py @@ -75,10 +75,8 @@ """ if isinstance(source, basestring): self.source = 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) + self.code = _compile(_parse(source), self.source, filename=filename, + lineno=lineno) else: assert isinstance(source, ast.Node) self.source = '?' @@ -163,6 +161,11 @@ raise NameError('Variable "%s" is not defined' % self._name) +def _parse(source, mode='eval'): + if isinstance(source, unicode): + source = '\xef\xbb\xbf' + source.encode('utf-8') + return parse(source, mode) + def _compile(node, source=None, filename=None, lineno=-1): tree = ExpressionASTTransformer().visit(node) if isinstance(filename, unicode): diff --git a/genshi/template.py b/genshi/template.py --- a/genshi/template.py +++ b/genshi/template.py @@ -31,7 +31,7 @@ from genshi.core import Attrs, Namespace, Stream, StreamEventKind, _ensure from genshi.core import START, END, START_NS, END_NS, TEXT, COMMENT -from genshi.eval import Expression +from genshi.eval import Expression, _parse from genshi.input import XMLParser from genshi.path import Path from genshi.util import LRUCache @@ -359,7 +359,7 @@ def __init__(self, args, namespaces=None, filename=None, lineno=-1, offset=-1): Directive.__init__(self, None, namespaces, filename, lineno, offset) - ast = compiler.parse(args, 'eval').node + ast = _parse(args).node self.args = [] self.defaults = {} if isinstance(ast, compiler.ast.CallFunc): @@ -432,7 +432,7 @@ raise TemplateSyntaxError('"in" keyword missing in "for" directive', filename, lineno, offset) assign, value = value.split(' in ', 1) - ast = compiler.parse(assign, 'exec') + ast = _parse(assign, 'exec') self.assign = _assignment(ast.node.nodes[0].expr) self.filename = filename Directive.__init__(self, value.strip(), namespaces, filename, lineno, @@ -744,7 +744,7 @@ self.vars = [] value = value.strip() try: - ast = compiler.parse(value, 'exec').node + ast = _parse(value, 'exec').node for node in ast.nodes: if isinstance(node, compiler.ast.Discard): continue diff --git a/genshi/tests/output.py b/genshi/tests/output.py --- a/genshi/tests/output.py +++ b/genshi/tests/output.py @@ -80,6 +80,24 @@ output = stream.render(XMLSerializer) self.assertEqual('', output) + def test_nested_default_namespaces(self): + xml = XML("""