# HG changeset patch # User cmlenz # Date 1152733513 0 # Node ID d54b5fd60b52b5df0dde90074419d071aa8c9d49 # Parent 1da51d718391e8b97b7feecf36142f5d0307be5c Fix expression interpolation where both shorthand notation and full notation are used inside a single text node. Thanks Jonas. diff --git a/markup/template.py b/markup/template.py --- a/markup/template.py +++ b/markup/template.py @@ -765,19 +765,18 @@ @param offset: the column number at which the text starts in the source (optional) """ - patterns = [Template._FULL_EXPR_RE, Template._SHORT_EXPR_RE] - def _interpolate(text): + def _interpolate(text, patterns): for idx, group in enumerate(patterns.pop(0).split(text)): if idx % 2: yield EXPR, Expression(group), (lineno, offset) elif group: if patterns: - for result in _interpolate(group): + for result in _interpolate(group, patterns[:]): yield result else: yield TEXT, group.replace('$$', '$'), (filename, lineno, offset) - return _interpolate(text) + return _interpolate(text, [cls._FULL_EXPR_RE, cls._SHORT_EXPR_RE]) _interpolate = classmethod(_interpolate) def generate(self, ctxt=None): diff --git a/markup/tests/template.py b/markup/tests/template.py --- a/markup/tests/template.py +++ b/markup/tests/template.py @@ -411,6 +411,11 @@ self.assertEqual(Stream.TEXT, parts[2][0]) self.assertEqual(' baz', parts[2][1]) + def test_interpolate_mixed3(self): + ctxt = Context(var=42) + tmpl = Template(' ${var} $var') + self.assertEqual(' 42 42', str(tmpl.generate(ctxt))) + def test_interpolate_non_string_attrs(self): ctxt = Context() tmpl = Template('')