[Checkins] SVN: z3c.pt/trunk/ The 'not' pragma acts recursively.

Malthe Borch mborch at gmail.com
Wed Dec 17 09:57:57 EST 2008


Log message for revision 94148:
  The 'not' pragma acts recursively.

Changed:
  U   z3c.pt/trunk/CHANGES.txt
  U   z3c.pt/trunk/src/z3c/pt/configure.zcml
  U   z3c.pt/trunk/src/z3c/pt/expressions.py

-=-
Modified: z3c.pt/trunk/CHANGES.txt
===================================================================
--- z3c.pt/trunk/CHANGES.txt	2008-12-17 14:14:57 UTC (rev 94147)
+++ z3c.pt/trunk/CHANGES.txt	2008-12-17 14:57:56 UTC (rev 94148)
@@ -1,6 +1,10 @@
 Changelog
 ---------
 
+In next release
+
+- The 'not' pragma acts recursively. [malthe]
+
 Version 1.0b5 - December 15, 2008
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 

Modified: z3c.pt/trunk/src/z3c/pt/configure.zcml
===================================================================
--- z3c.pt/trunk/src/z3c/pt/configure.zcml	2008-12-17 14:14:57 UTC (rev 94147)
+++ z3c.pt/trunk/src/z3c/pt/configure.zcml	2008-12-17 14:57:56 UTC (rev 94148)
@@ -10,9 +10,9 @@
      name="path"
      component=".expressions.path_translator" />
 
-  <utility
+  <adapter
      name="not"
-     component=".expressions.not_translator" />
+     factory=".expressions.NotTranslator" />
 
   <utility
      name="provider"

Modified: z3c.pt/trunk/src/z3c/pt/expressions.py
===================================================================
--- z3c.pt/trunk/src/z3c/pt/expressions.py	2008-12-17 14:14:57 UTC (rev 94147)
+++ z3c.pt/trunk/src/z3c/pt/expressions.py	2008-12-17 14:57:56 UTC (rev 94148)
@@ -106,9 +106,6 @@
         >>> translate("nocall: context/@@view")
         value("_path(context, request, False, '@@view')")
 
-        >>> translate("not: context/@@view")
-        value("not(_path(context, request, True, '@@view'))")
-
         >>> translate("context/?view")
         value("_path(context, request, True, '%s' % (view,))")
 
@@ -123,7 +120,6 @@
             raise SyntaxError("Not a valid path-expression: %s." % string)
 
         nocall = False
-        negate = False
 
         while string:
             m = self.re_pragma.match(string)
@@ -135,8 +131,6 @@
 
             if pragma == 'nocall':
                 nocall = True
-            elif pragma == 'not':
-                negate = True
             else:
                 raise ValueError("Invalid pragma: %s" % pragma)
 
@@ -176,25 +170,54 @@
             '%s(%s, %s, %s, %s)' % \
             (self.symbol, base, self.scope, not nocall, ', '.join(components)))
 
-        if negate:
-            value = types.value('not(%s)' % value)
-
         value.symbol_mapping[self.symbol] = self.path_traverse
 
         return value
 
-class NotTranslator(PathTranslator):
-    symbol = '_path_not'
+class NotTranslator(expressions.ExpressionTranslator):
+    zope.component.adapts(IExpressionTranslator)
 
-    def translate(self, string, escape=None):
-        path_translator = zope.component.getUtility(
-            IExpressionTranslator, name='path')
-        value = path_translator.translate(string, escape=escape)
-        symbol_mapping = value.symbol_mapping
-        value = types.value("not(%s)" % value)
-        value.symbol_mapping = symbol_mapping
-        return value
+    recursive = True
+    
+    def __init__(self, translator):
+        self.translator = translator
 
+    def tales(self, string, escape=None):
+        """
+        >>> tales = NotTranslator(path_translator).tales
+        
+        >>> tales("abc/def/ghi")
+        value("not(_path(abc, request, True, 'def', 'ghi'))")
+        
+        >>> tales("abc | def")
+        parts(value('not(_path(abc, request, True, ))'),
+              value('not(_path(def, request, True, ))'))
+
+        >>> tales("abc | not: def")
+        parts(value('not(_path(abc, request, True, ))'),
+              value('not(not(_path(def, request, True, )))'))
+
+        >>> tales("abc | not: def | ghi")
+        parts(value('not(_path(abc, request, True, ))'),
+              value('not(not(_path(def, request, True, )))'),
+              value('not(not(_path(ghi, request, True, )))'))
+        """
+
+        value = self.translator.tales(string, escape=escape)
+        if isinstance(value, types.value):
+            value = (value,)
+            
+        parts = []
+        for part in value:
+            factory = type(part)
+            parts.append(
+                factory("not(%s)" % part))
+
+        if len(parts) == 1:
+            return parts[0]
+        
+        return types.parts(parts)
+
 class ProviderTranslator(expressions.ExpressionTranslator):
     provider_regex = re.compile(r'^[A-Za-z][A-Za-z0-9_\.-]*$')
     
@@ -220,6 +243,5 @@
 
 exists_translator = ExistsTranslator()
 path_translator = PathTranslator()
-not_translator = NotTranslator()    
 provider_translator = ProviderTranslator()
 



More information about the Checkins mailing list