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() _______________________________________________ Zope-Checkins maillist - Zope-Checkins@zope.org http://mail.zope.org/mailman/listinfo/zope-checkins