[Checkins] SVN: Sandbox/malthe/chameleon.zpt/ Genshi interpolation expressions are now supported outside tags.

Malthe Borch mborch at gmail.com
Mon Sep 22 12:12:44 EDT 2008


Log message for revision 91356:
  Genshi interpolation expressions are now supported outside tags.

Changed:
  U   Sandbox/malthe/chameleon.zpt/README.txt
  U   Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/expressions.py
  U   Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/language.py
  U   Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/language.txt
  U   Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/template.txt

-=-
Modified: Sandbox/malthe/chameleon.zpt/README.txt
===================================================================
--- Sandbox/malthe/chameleon.zpt/README.txt	2008-09-22 16:09:24 UTC (rev 91355)
+++ Sandbox/malthe/chameleon.zpt/README.txt	2008-09-22 16:12:44 UTC (rev 91356)
@@ -43,6 +43,13 @@
 
 4. The default expression type is Python.
 
+5. Genshi expression interpolation syntax is supported outside tags, e.g.
+
+      <span>
+         Hello, ${'world'}!
+      </span>
+
+      
 .. _TAL: http://wiki.zope.org/ZPT/TALSpecification14
 
 

Modified: Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/expressions.py
===================================================================
--- Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/expressions.py	2008-09-22 16:09:24 UTC (rev 91355)
+++ Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/expressions.py	2008-09-22 16:12:44 UTC (rev 91356)
@@ -18,7 +18,10 @@
     re_method = re.compile(r'^(?P<name>[A-Za-z0-9_]+)'
                            '(\((?P<args>[A-Za-z0-9_]+\s*(,\s*[A-Za-z0-9_]+)*)\))?')
 
-    def translator(self, name):
+    def __init__(self):
+        self.translator = self
+    
+    def pragma(self, name):
         return component.queryUtility(
             interfaces.IExpressionTranslator, name=name) or \
             component.queryAdapter(
@@ -327,7 +330,7 @@
                 match = self.re_pragma.match(string[i:])
                 if match is not None:
                     pragma = match.group('pragma')
-                    translator = self.translator(pragma)
+                    translator = self.pragma(pragma)
                     if translator is not None:
                         i += match.end()
                         continue
@@ -360,45 +363,8 @@
 
         return types.parts(parts)
 
-class PythonTranslator(ExpressionTranslator):
-    """Implements Python expression translation."""
-    
-    def validate(self, string):
-        """We use the ``parser`` module to determine if
-        an expression is a valid python expression."""
-
-        if isinstance(string, unicode):
-            string = string.encode('utf-8')
-            
-        parser.expr(string.strip())
-
-    def translate(self, string):
-        if isinstance(string, str):
-            string = string.decode('utf-8')
-
-        return types.value(string.strip())
-
-python_translator = PythonTranslator()
-
-class StringTranslator(ExpressionTranslator):
-    """Implements string translation expression."""
-
-    component.adapts(interfaces.IExpressionTranslator)
-    
-    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 validate(self, string):
-        self.split(string)
-            
-    def translate(self, string):
-        return types.join(self.split(string))
-            
     def split(self, string):
-        parts = parsing.interpolate(string, self._translator.tales)
+        parts = parsing.interpolate(string, self.translator.tales)
         if parts is not None:
             return map(
                 lambda part: isinstance(part, types.expression) and \
@@ -434,3 +400,40 @@
                 "Semi-colons in string-expressions must be escaped.")
         
         return string.replace(';;', ';')
+
+class PythonTranslator(ExpressionTranslator):
+    """Implements Python expression translation."""
+    
+    def validate(self, string):
+        """We use the ``parser`` module to determine if
+        an expression is a valid python expression."""
+
+        if isinstance(string, unicode):
+            string = string.encode('utf-8')
+            
+        parser.expr(string.strip())
+
+    def translate(self, string):
+        if isinstance(string, str):
+            string = string.decode('utf-8')
+
+        return types.value(string.strip())
+
+python_translator = PythonTranslator()
+
+class StringTranslator(ExpressionTranslator):
+    """Implements string translation expression."""
+
+    component.adapts(interfaces.IExpressionTranslator)
+    
+    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 validate(self, string):
+        self.split(string)
+            
+    def translate(self, string):
+        return types.join(self.split(string))            

Modified: Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/language.py
===================================================================
--- Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/language.py	2008-09-22 16:09:24 UTC (rev 91355)
+++ Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/language.py	2008-09-22 16:12:44 UTC (rev 91356)
@@ -97,6 +97,18 @@
         def cdata(self):
             return self.element.meta_cdata
 
+        @property
+        def text(self):
+            if self.element.text is not None:
+                return self.element.translator.split(self.element.text)
+            return ()
+
+        @property
+        def tail(self):
+            if self.element.tail is not None:
+                return self.element.translator.split(self.element.tail)
+            return ()
+
     node = property(node)
 
     @property

Modified: Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/language.txt
===================================================================
--- Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/language.txt	2008-09-22 16:09:24 UTC (rev 91355)
+++ Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/language.txt	2008-09-22 16:12:44 UTC (rev 91356)
@@ -288,3 +288,18 @@
     </div>
   <BLANKLINE>
   </div>
+
+Expression interpolation
+------------------------
+
+The ``chameleon.zpt`` parser supports Genshi interpolation
+expressions.
+
+  >>> print render("""\
+  ... <div xmlns="http://www.w3.org/1999/xhtml"
+  ...      xmlns:tal="http://xml.zope.org/namespaces/tal">
+  ...   Interpolation ${'expressions'} are ${'convenient'}.
+  ... </div>""")
+  <div>
+    Interpolation expressions are convenient.
+  </div>

Modified: Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/template.txt
===================================================================
--- Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/template.txt	2008-09-22 16:09:24 UTC (rev 91355)
+++ Sandbox/malthe/chameleon.zpt/src/chameleon/zpt/template.txt	2008-09-22 16:12:44 UTC (rev 91356)
@@ -93,3 +93,13 @@
     ...
   TypeError: range expected at least 1 arguments, got 0
 
+Exception while evaluating interpolation:
+
+  >>> PageTemplate("""\
+  ... <div xmlns="http://www.w3.org/1999/xhtml"
+  ...      xmlns:tal="http://xml.zope.org/namespaces/tal">
+  ...   <span>${range()}</span>
+  ... </div>""").render()
+  Traceback (most recent call last):
+    ...
+  TypeError: range expected at least 1 arguments, got 0



More information about the Checkins mailing list