[Checkins] SVN: z3c.pt/trunk/ Added support for the question-mark operator in path-expressions.

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


Log message for revision 93028:
  Added support for the question-mark operator in path-expressions.

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

-=-
Modified: z3c.pt/trunk/CHANGES.txt
===================================================================
--- z3c.pt/trunk/CHANGES.txt	2008-11-17 00:49:58 UTC (rev 93027)
+++ z3c.pt/trunk/CHANGES.txt	2008-11-17 01:16:28 UTC (rev 93028)
@@ -4,6 +4,8 @@
 Head
 ~~~~
 
+- Added support for the question-mark operator in path-expressions. [malthe]
+
 - Updated expressions to recent API changes. [malthe]
 
 - Added 'exists' and 'not' translators. [malthe]

Modified: z3c.pt/trunk/src/z3c/pt/expressions.py
===================================================================
--- z3c.pt/trunk/src/z3c/pt/expressions.py	2008-11-17 00:49:58 UTC (rev 93027)
+++ z3c.pt/trunk/src/z3c/pt/expressions.py	2008-11-17 01:16:28 UTC (rev 93028)
@@ -74,8 +74,11 @@
 class PathTranslator(expressions.ExpressionTranslator):
     path_regex = re.compile(
         r'^((nocall|not):\s*)*([A-Za-z_][A-Za-z0-9_]*)'+
-        r'(/[A-Za-z_@\-+][A-Za-z0-9_@\-\.+/]*)*$')
+        r'(/[?A-Za-z_@\-+][?A-Za-z0-9_@\-\.+/]*)*$')
 
+    interpolation_regex = re.compile(
+        r'\?[A-Za-z][A-Za-z0-9_]+')
+
     path_traverse = ZopeTraverser()
 
     symbol = '_path'
@@ -101,6 +104,11 @@
         >>> translate("not: context/@@view")
         value("not(_path(context, request, True, '@@view'))")
 
+        >>> translate("context/?view")
+        value("_path(context, request, True, '%s' % (view,))")
+
+        >>> translate("context/@@?view")
+        value("_path(context, request, True, '@@%s' % (view,))")
         """
 
         if not self.path_regex.match(string.strip()):
@@ -129,12 +137,33 @@
         # map 'nothing' to 'None'
         parts = map(lambda part: part == 'nothing' and 'None' or part, parts)
 
-        base = parts[0]
-        components = [repr(part) for part in parts[1:]]
+        components = []
+        for part in parts[1:]:
+            interpolation_args = []
 
+            def replace(match):
+                start, end = match.span()
+                interpolation_args.append(
+                    part[start+1:end])
+                return "%s"
+
+            while True:
+                part, count = self.interpolation_regex.subn(replace, part)
+                if count == 0:
+                    break
+
+            if len(interpolation_args):
+                component = "%s %% (%s,)" % (
+                    repr(part), ", ".join(interpolation_args))
+            else:
+                component = repr(part)
+
+            components.append(component)
+            
         if not components:
             components = ()
 
+        base = parts[0]
         value = types.value(
             '%s(%s, request, %s, %s)' % \
             (self.symbol, base, not nocall, ', '.join(components)))



More information about the Checkins mailing list