changeset 732:8825ac5014b1 trunk

Fix expression interpolation for expression containing triple-quoted multiline strings. Thanks to Armin Ronacher for reporting the issue and providing a patch.
author cmlenz
date Tue, 03 Jun 2008 20:22:33 +0000
parents 01bdf155db95
children 43147cbc9ea3
files genshi/template/interpolation.py genshi/template/tests/interpolation.py
diffstat 2 files changed, 13 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/genshi/template/interpolation.py
+++ b/genshi/template/interpolation.py
@@ -17,7 +17,8 @@
 
 from itertools import chain
 import os
-from tokenize import tokenprog
+import re
+from tokenize import PseudoToken
 
 from genshi.core import TEXT
 from genshi.template.base import TemplateSyntaxError, EXPR
@@ -30,6 +31,11 @@
 NAMECHARS = NAMESTART + '.0123456789'
 PREFIX = '$'
 
+token_re = re.compile('%s|%s(?s)' % (
+    r'[uU]?[rR]?("""|\'\'\')((?<!\\)\\\1|.)*?\1',
+    PseudoToken
+))
+
 def interpolate(text, filepath=None, lineno=-1, offset=0, lookup='strict'):
     """Parse the given string and extract expressions.
     
@@ -106,7 +112,7 @@
             pos = offset + 2
             level = 1
             while level:
-                match = tokenprog.match(text, pos)
+                match = token_re.match(text, pos)
                 if match is None:
                     raise TemplateSyntaxError('invalid syntax',  filepath,
                                               *textpos[1:])
--- a/genshi/template/tests/interpolation.py
+++ b/genshi/template/tests/interpolation.py
@@ -186,6 +186,11 @@
         self.assertEqual(TEXT, parts[2][0])
         self.assertEqual(' baz', parts[2][1])
 
+    def test_interpolate_triplequoted(self):
+        parts = list(interpolate('${"""foo\nbar"""}'))
+        self.assertEqual(1, len(parts))
+        self.assertEqual('"""foo\nbar"""', parts[0][1].source)
+
 
 def suite():
     suite = unittest.TestSuite()
Copyright (C) 2012-2017 Edgewall Software