[Checkins] SVN: z3c.pt/trunk/ Added expression translator for 'provider:' pragma (see zope.contentprovider).

Malthe Borch mborch at gmail.com
Sat Sep 13 19:23:34 EDT 2008


Log message for revision 91134:
  Added expression translator for 'provider:' pragma (see zope.contentprovider).

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

-=-
Modified: z3c.pt/trunk/CHANGES.txt
===================================================================
--- z3c.pt/trunk/CHANGES.txt	2008-09-13 22:56:07 UTC (rev 91133)
+++ z3c.pt/trunk/CHANGES.txt	2008-09-13 23:23:33 UTC (rev 91134)
@@ -28,6 +28,10 @@
 
   Features
 
+- Added expression translator "provider:" (which renders a content
+  provider as defined in the ``zope.contentprovider``
+  package). [malthe]
+  
 - Added template API to render macros. [malthe]
   
 - Optimized template loader so only a single template is instantiated

Modified: z3c.pt/trunk/setup.py
===================================================================
--- z3c.pt/trunk/setup.py	2008-09-13 22:56:07 UTC (rev 91133)
+++ z3c.pt/trunk/setup.py	2008-09-13 23:23:33 UTC (rev 91134)
@@ -8,6 +8,7 @@
     'zope.component',
     'zope.i18n >= 3.5',
     'zope.traversing',
+    'zope.contentprovider',
     ]
 
 if sys.version_info[:3] < (2,5,0):

Modified: z3c.pt/trunk/src/z3c/pt/configure.zcml
===================================================================
--- z3c.pt/trunk/src/z3c/pt/configure.zcml	2008-09-13 22:56:07 UTC (rev 91133)
+++ z3c.pt/trunk/src/z3c/pt/configure.zcml	2008-09-13 23:23:33 UTC (rev 91134)
@@ -12,6 +12,10 @@
      name="path"
      component=".expressions.path_translation" />
 
+  <utility
+     name="provider"
+     component=".expressions.provider_translation" />
+
   <adapter
      name="string"
      factory=".expressions.StringTranslation" />

Modified: z3c.pt/trunk/src/z3c/pt/expressions.py
===================================================================
--- z3c.pt/trunk/src/z3c/pt/expressions.py	2008-09-13 22:56:07 UTC (rev 91133)
+++ z3c.pt/trunk/src/z3c/pt/expressions.py	2008-09-13 23:23:33 UTC (rev 91134)
@@ -2,6 +2,7 @@
 import zope.component
 
 from zope.traversing.adapters import traversePathElement
+from zope.contentprovider.interfaces import IContentProvider
 
 import parser
 import re
@@ -748,3 +749,28 @@
         return value
 
 path_translation = PathTranslation()
+
+def get_content_provider(context, request, view, name):
+    cp = zope.component.getMultiAdapter(
+        (context, request, view), IContentProvider, name=name)
+    cp.update()
+    return cp.render()
+    
+class ProviderTranslation(object):
+    zope.interface.implements(interfaces.IExpressionTranslation)
+    
+    provider_regex = re.compile(r'^[A-Za-z][A-Za-z0-9_-]*$')
+    symbol = '_get_content_provider'
+    
+    def validate(self, string):
+        if self.provider_regex.match(string) is None:
+            raise SyntaxError(
+                "%s is not a valid content provider name." % string)
+
+    def translate(self, string):
+        value = types.value("%s(context, request, view, '%s')" % \
+                            (self.symbol, string))
+        value.symbol_mapping[self.symbol] = get_content_provider
+        return value
+    
+provider_translation = ProviderTranslation()

Modified: z3c.pt/trunk/src/z3c/pt/zpt.txt
===================================================================
--- z3c.pt/trunk/src/z3c/pt/zpt.txt	2008-09-13 22:56:07 UTC (rev 91133)
+++ z3c.pt/trunk/src/z3c/pt/zpt.txt	2008-09-13 23:23:33 UTC (rev 91134)
@@ -210,6 +210,48 @@
     <img alt="Leonardo da Vinci; Musee du Louvre, 1503" title="Mona Lisa" />
   </div>
 
+:: Using the "provider:" expression
+
+  >>> class Context(object): pass
+  >>> class Request(object): pass
+  >>> class View(object): pass
+
+This directive renders a content provider; let's define and register a
+content provider which allows us to verify the functionality of the
+expression.
+  
+  >>> from zope.contentprovider.interfaces import IContentProvider
+  >>> from zope import component
+  >>> from zope import interface
+    
+  >>> class DummyContentProvider(object):
+  ...     component.adapts(Context, Request, View)
+  ...     interface.implements(IContentProvider)
+  ...
+  ...     def __init__(self, context, request, view):
+  ...         self.context = context
+  ...         self.request = request
+  ...         self.view = view
+  ...
+  ...     def update(self):
+  ...         self.updated = True
+  ...
+  ...     def render(self):
+  ...         return type(self.context), type(self.request), \
+  ...                type(self.view), self.updated
+
+  >>> component.provideAdapter(
+  ...     DummyContentProvider, name="test")
+  
+  >>> print render_zpt("""\
+  ... <div xmlns="http://www.w3.org/1999/xhtml"
+  ...      xmlns:tal="http://xml.zope.org/namespaces/tal">
+  ...   <span tal:replace="structure provider:test" />
+  ... </div>""", context=Context(), request=Request(), view=View())
+  <div>
+    (<class 'Context'>, <class 'Request'>, <class 'View'>, True)
+  </div>
+
 :: Setting the default expression
 
   >>> print render_zpt("""\



More information about the Checkins mailing list