# 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('')