[Checkins] SVN: Sandbox/malthe/chameleon.zpt/ Fixed translation pragma issue; fixed string escape issue.

Malthe Borch mborch at gmail.com
Sun Nov 16 20:57:13 EST 2008


Log message for revision 93030:
  Fixed translation pragma issue; fixed string escape issue.

Changed:
  U   Sandbox/malthe/chameleon.zpt/CHANGES.txt
  U   Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/expressions.py

-=-
Modified: Sandbox/malthe/chameleon.zpt/CHANGES.txt
===================================================================
--- Sandbox/malthe/chameleon.zpt/CHANGES.txt	2008-11-17 01:34:38 UTC (rev 93029)
+++ Sandbox/malthe/chameleon.zpt/CHANGES.txt	2008-11-17 01:57:13 UTC (rev 93030)
@@ -4,6 +4,11 @@
 Head
 ~~~~
 
+- Fixed string escape issue. [malthe]
+
+- Fixed issue where translation pragma would be reset if a
+  non-matching pragma was found. [malthe]
+
 - Fixed bug that would parse global defines incorrectly. [malthe]
 
 - TAL- and METAL-elements now subclass the XHTML-element class; this

Modified: Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/expressions.py
===================================================================
--- Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/expressions.py	2008-11-17 01:34:38 UTC (rev 93029)
+++ Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/expressions.py	2008-11-17 01:57:13 UTC (rev 93030)
@@ -330,13 +330,12 @@
             match = self.re_pragma.match(string[i:])
             if match is not None:
                 pragma = match.group('pragma')
-                translator = self.pragma(pragma)
-                if translator is not None:
+                new_translator = self.pragma(pragma)
+                if new_translator is not None:
+                    translator = new_translator
                     i += match.end()
                     continue
 
-                translator = self
-
             j = string.find('|', j + 1)
             if j == -1:
                 j = len(string)
@@ -391,13 +390,12 @@
     
     re_interpolation = re.compile(r'(?P<prefix>[^\\]\$|^\$)({((?P<expression>.*)})?|'
                                   '(?P<variable>[A-Za-z][A-Za-z0-9_]*))')
-    
+
     def __init__(self, translator):
         self.translator = translator
 
     def translate(self, string, escape=None):
         parts = self.split(string)
-        
         if escape is not None:
             parts = map(
                 lambda part: isinstance(part, types.expression) and \
@@ -411,25 +409,33 @@
         
         >>> unescape('string:Hello World', ';')
         'string:Hello World'
+
+        >>> unescape('string:Hello World;', ';')
+        'string:Hello World;'
+
+        >>> unescape('string:Hello World;;', ';')
+        'string:Hello World;'
         
         >>> unescape('; string:Hello World', ';')
         Traceback (most recent call last):
          ...
         SyntaxError: Must escape symbol ';'.
 
+        >>> unescape('; string:Hello World;', ';')
+        Traceback (most recent call last):
+         ...
+        SyntaxError: Must escape symbol ';'.
+
+        >>> unescape('string:Hello; World', ';')
+        Traceback (most recent call last):
+         ...
+        SyntaxError: Must escape symbol ';'.
+
         >>> unescape(';; string:Hello World', ';')
         '; string:Hello World'
-
-        >>> unescape('string:Hello World;', ';')
-        'string:Hello World;'
         """
 
-        i = string.rfind(symbol)
-        if i < 0 or i == len(string) - 1:
-            return string
-        
-        j = string.rfind(symbol+symbol)
-        if j < 0 or i != j + 1:
+        if re.search("([^%s]|^)%s[^%s]" % (symbol, symbol, symbol), string):
             raise SyntaxError(
                 "Must escape symbol %s." % repr(symbol))
         



More information about the Checkins mailing list