[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