Created
January 31, 2012 22:37
-
-
Save eevee/1713508 to your computer and use it in GitHub Desktop.
fix for mako lexing bugs: embedded escaped quotes and dict literals
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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'(\"\"\"|\'\'\'|\"|\')((?<!\\)\\\1|.)*?\1', re.S) | |
if match: | |
- m = self.match(r'.*?%s' % match.group(1), re.S) | |
- if not m: | |
- raise exceptions.SyntaxException( | |
- "Unmatched '%s'" % | |
- match.group(1), | |
- **self.exception_kwargs) | |
- else: | |
- match = self.match(r'(%s)' % r'|'.join(text)) | |
- if match: | |
- return \ | |
- self.text[startpos:self.match_position-len(match.group(1))],\ | |
- match.group(1) | |
- else: | |
- match = self.match(r".*?(?=\"|\'|#|%s)" % r'|'.join(text), re.S) | |
- if not match: | |
- raise exceptions.SyntaxException( | |
- "Expected: %s" % | |
- ','.join(text), | |
- **self.exception_kwargs) | |
+ continue | |
+ match = self.match(r'(%s)' % text_re) | |
+ if match: | |
+ if match.group(1) == '}' and brace_level > 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 = \ | |
""" |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment