Index: markup/tests/template.py =================================================================== --- markup/tests/template.py (revision 76) +++ markup/tests/template.py (working copy) @@ -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('') Index: markup/template.py =================================================================== --- markup/template.py (revision 76) +++ markup/template.py (working copy) @@ -765,19 +765,20 @@ @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, [Template._FULL_EXPR_RE, + Template._SHORT_EXPR_RE]) + _interpolate = classmethod(_interpolate) def generate(self, ctxt=None):