diff -r 1190503e3c7d mako/lexer.py --- a/mako/lexer.py Sat Jan 21 18:57:01 2012 -0500 +++ b/mako/lexer.py Tue Jan 31 14:29:30 2012 -0800 @@ -91,31 +91,32 @@ def parse_until_text(self, *text): startpos = self.match_position + text_re = r'|'.join(text) + brace_level = 0 while True: match = self.match(r'#.*\n') if match: continue - match = self.match(r'(\"\"\"|\'\'\'|\"|\')') + match = self.match(r'(\"\"\"|\'\'\'|\"|\')((? 0: + brace_level -= 1 + continue + return \ + self.text[startpos:self.match_position-len(match.group(1))],\ + match.group(1) + match = self.match(r"(.*?)(?=\"|\'|#|%s)" % text_re, re.S) + if match: + brace_level += match.group(1).count('{') + brace_level -= match.group(1).count('}') + continue + raise exceptions.SyntaxException( + "Expected: %s" % + ','.join(text), + **self.exception_kwargs) def append_node(self, nodecls, *args, **kwargs): kwargs.setdefault('source', self.text) diff -r 1190503e3c7d test/test_lexer.py --- a/test/test_lexer.py Sat Jan 21 18:57:01 2012 -0500 +++ b/test/test_lexer.py Tue Jan 31 14:29:30 2012 -0800 @@ -557,6 +557,23 @@ False, (1, 1)), Text(u" '''and now some text '''", (10,11))])) + def test_tricky_code_4(self): + template = \ + """<% foo = "\\"\\\\" %>""" + nodes = Lexer(template).parse() + self._compare(nodes, TemplateNode({}, + [Code(u"""foo = "\\"\\\\" \n""", + False, (1, 1))])) + + def test_tricky_code_5(self): + template = \ + """before ${ {'key': 'value'} } after""" + nodes = Lexer(template).parse() + self._compare(nodes, TemplateNode({}, + [Text(u'before ', (1, 1)), + Expression(u" {'key': 'value'} ", [], (1, 8)), + Text(u' after', (1, 29))])) + def test_control_lines(self): template = \ """