[Zope-Checkins] SVN: Products.Five/trunk/browser/pagetemplatefile.py moved custom traverser into Five

Andreas Jung andreas at andreas-jung.com
Wed Mar 1 11:53:38 EST 2006


Log message for revision 65673:
  moved custom traverser into Five
  

Changed:
  U   Products.Five/trunk/browser/pagetemplatefile.py

-=-
Modified: Products.Five/trunk/browser/pagetemplatefile.py
===================================================================
--- Products.Five/trunk/browser/pagetemplatefile.py	2006-03-01 16:53:06 UTC (rev 65672)
+++ Products.Five/trunk/browser/pagetemplatefile.py	2006-03-01 16:53:37 UTC (rev 65673)
@@ -18,8 +18,6 @@
 import os, sys
 
 from Globals import package_home
-from AccessControl import getSecurityManager
-from Shared.DC.Scripts.Bindings import Unauthorized, UnauthorizedBinding
 from Products.PageTemplates.PageTemplateFile import PageTemplateFile
 
 from zope.app.pagetemplate.viewpagetemplatefile import ViewMapper
@@ -28,6 +26,71 @@
 from Products.Five.browser.ReuseUtils import rebindFunction
 from Products.Five.browser.TrustedExpression import getEngine, ModuleImporter
 
+from zope.tales.tales import ExpressionEngine
+from zope.tales.expressions import PathExpr, StringExpr, NotExpr, DeferExpr, SubPathExpr
+from zope.tales.expressions import SimpleModuleImporter, _marker
+from zope.tales.pythonexpr import PythonExpr
+from zope.tales.tales import _valid_name, _parse_expr, NAME_RE, Undefined 
+
+
+def BoboTraverseAwareSimpleTraverse(object, path_items, econtext):
+    """ a slightly modified version of zope.tales.expressions.simpleTraverse()
+        that interacts correctly with objects implementing bobo_traverse().
+    """
+
+    for name in path_items:
+        next = getattr(object, name, _marker)
+        if next is not _marker:
+            object = next
+        elif hasattr(object, '__getitem__'):
+            try:
+                object = object[name]
+            except KeyError:
+                # deal with traversal through bobo_traverse()
+                object = object.restrictedTraverse(name)
+        else:
+            # Allow AttributeError to propagate
+            object = getattr(object, name)
+    return object
+
+
+class PathExpr(PathExpr):
+    """We need to subclass PathExpr at this point since there is no other
+       away to pass our own traverser because we do not instantiate 
+       PathExpr on our own...this sucks!
+    """
+
+    def __init__(self, name, expr, engine, traverser=BoboTraverseAwareSimpleTraverse):
+        self._s = expr
+        self._name = name
+        paths = expr.split('|')
+        self._subexprs = []
+        add = self._subexprs.append
+        for i in range(len(paths)):
+            path = paths[i].lstrip()
+            if _parse_expr(path):
+                # This part is the start of another expression type,
+                # so glue it back together and compile it.
+                add(engine.compile('|'.join(paths[i:]).lstrip()))
+                break
+            add(SubPathExpr(path, traverser, engine)._eval)
+
+
+def Engine():
+    e = ExpressionEngine()
+    reg = e.registerType
+    for pt in PathExpr._default_type_names:
+        reg(pt, PathExpr)
+    reg('string', StringExpr)
+    reg('python', PythonExpr)
+    reg('not', NotExpr)
+    reg('defer', DeferExpr)
+    e.registerBaseName('modules', SimpleModuleImporter())
+    return e
+
+Engine = Engine()
+
+
 class ZopeTwoPageTemplateFile(PageTemplateFile):
     """A strange hybrid between Zope 2 and Zope 3 page template.
 
@@ -71,6 +134,9 @@
     pt_render = rebindFunction(PageTemplateFile.pt_render,
                                getEngine=getEngine)
 
+    def pt_getEngine(self):
+        return Engine
+    
     def _pt_getContext(self):
         try:
             root = self.getPhysicalRoot()



More information about the Zope-Checkins mailing list