[Checkins] SVN: z3ext.layout/tags/1.5.8/ release tag
Nikolay Kim
fafhrd at datacom.kz
Sun Nov 23 12:24:00 EST 2008
Log message for revision 93282:
release tag
Changed:
A z3ext.layout/tags/1.5.8/
D z3ext.layout/tags/1.5.8/buildout.cfg
A z3ext.layout/tags/1.5.8/buildout.cfg
A z3ext.layout/tags/1.5.8/buildout34.cfg
D z3ext.layout/tags/1.5.8/setup.py
A z3ext.layout/tags/1.5.8/setup.py
D z3ext.layout/tags/1.5.8/src/z3ext/layout/README.txt
A z3ext.layout/tags/1.5.8/src/z3ext/layout/README.txt
D z3ext.layout/tags/1.5.8/src/z3ext/layout/pagelet.txt
A z3ext.layout/tags/1.5.8/src/z3ext/layout/pagelet.txt
D z3ext.layout/tags/1.5.8/src/z3ext/layout/styles.css
A z3ext.layout/tags/1.5.8/src/z3ext/layout/styles.css
A z3ext.layout/tags/1.5.8/tests.cfg
-=-
Deleted: z3ext.layout/tags/1.5.8/buildout.cfg
===================================================================
--- z3ext.layout/trunk/buildout.cfg 2008-11-21 11:18:39 UTC (rev 93238)
+++ z3ext.layout/tags/1.5.8/buildout.cfg 2008-11-23 17:23:59 UTC (rev 93282)
@@ -1,18 +0,0 @@
-[buildout]
-develop = .
-parts = test coverage-test coverage-report
-
-[test]
-recipe = zc.recipe.testrunner
-eggs = z3ext.layout [test]
-
-[coverage-test]
-recipe = zc.recipe.testrunner
-eggs = z3ext.layout [test]
-defaults = ['--coverage', '../../coverage']
-
-[coverage-report]
-recipe = zc.recipe.egg
-eggs = z3c.coverage
-scripts = coverage=coverage-report
-arguments = ('coverage', 'coverage/report')
Copied: z3ext.layout/tags/1.5.8/buildout.cfg (from rev 93271, z3ext.layout/trunk/buildout.cfg)
===================================================================
--- z3ext.layout/tags/1.5.8/buildout.cfg (rev 0)
+++ z3ext.layout/tags/1.5.8/buildout.cfg 2008-11-23 17:23:59 UTC (rev 93282)
@@ -0,0 +1,4 @@
+[buildout]
+develop = .
+parts = test coverage-test coverage-report
+extends = tests.cfg
Copied: z3ext.layout/tags/1.5.8/buildout34.cfg (from rev 93271, z3ext.layout/trunk/buildout34.cfg)
===================================================================
--- z3ext.layout/tags/1.5.8/buildout34.cfg (rev 0)
+++ z3ext.layout/tags/1.5.8/buildout34.cfg 2008-11-23 17:23:59 UTC (rev 93282)
@@ -0,0 +1,9 @@
+[buildout]
+develop = .
+parts = test coverage-test coverage-report
+versions = versions
+extends = tests.cfg
+ http://download.zope.org/zope3.4/versions-3.4.0c7.cfg
+
+[versions]
+z3c.zrtresource = 1.1.0
Deleted: z3ext.layout/tags/1.5.8/setup.py
===================================================================
--- z3ext.layout/trunk/setup.py 2008-11-21 11:18:39 UTC (rev 93238)
+++ z3ext.layout/tags/1.5.8/setup.py 2008-11-23 17:23:59 UTC (rev 93282)
@@ -1,76 +0,0 @@
-##############################################################################
-#
-# Copyright (c) 2007 Zope Corporation and Contributors.
-# All Rights Reserved.
-#
-# This software is subject to the provisions of the Zope Public License,
-# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
-# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
-# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
-# FOR A PARTICULAR PURPOSE.
-#
-##############################################################################
-"""Setup for z3ext.layout package
-
-$Id$
-"""
-import sys, os
-from setuptools import setup, find_packages
-
-def read(*rnames):
- return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
-
-version='1.5.8dev'
-
-
-setup(name='z3ext.layout',
- version=version,
- description="A package implementing advanced Page Template patterns.",
- long_description=(
- 'Detailed Documentation\n' +
- '======================\n'
- + '\n\n' +
- read('src', 'z3ext', 'layout', 'README.txt')
- + '\n\n' +
- read('CHANGES.txt')
- ),
- classifiers=[
- 'Development Status :: 5 - Production/Stable',
- 'Environment :: Web Environment',
- 'Intended Audience :: Developers',
- 'License :: OSI Approved :: Zope Public License',
- 'Programming Language :: Python',
- 'Natural Language :: English',
- 'Operating System :: OS Independent',
- 'Topic :: Internet :: WWW/HTTP',
- 'Framework :: Zope3'],
- author='Nikolay Kim',
- author_email='fafhrd91 at gmail.com',
- url='http://z3ext.net/',
- license='ZPL 2.1',
- packages=find_packages('src'),
- package_dir = {'':'src'},
- namespace_packages=['z3ext'],
- install_requires = ['setuptools',
- 'zope.event',
- 'zope.schema',
- 'zope.component',
- 'zope.interface',
- 'zope.security',
- 'zope.publisher',
- 'zope.configuration',
- 'zope.pagetemplate',
- 'zope.tales',
- 'zope.app.component',
- 'zope.app.publisher',
- 'zope.app.pagetemplate',
- 'z3c.autoinclude',
- ],
- extras_require = dict(test=['zope.app.container',
- 'zope.app.testing',
- 'zope.testing',
- ]),
- include_package_data = True,
- zip_safe = False
- )
Copied: z3ext.layout/tags/1.5.8/setup.py (from rev 93271, z3ext.layout/trunk/setup.py)
===================================================================
--- z3ext.layout/tags/1.5.8/setup.py (rev 0)
+++ z3ext.layout/tags/1.5.8/setup.py 2008-11-23 17:23:59 UTC (rev 93282)
@@ -0,0 +1,76 @@
+##############################################################################
+#
+# Copyright (c) 2007 Zope Corporation and Contributors.
+# All Rights Reserved.
+#
+# This software is subject to the provisions of the Zope Public License,
+# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution.
+# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED
+# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS
+# FOR A PARTICULAR PURPOSE.
+#
+##############################################################################
+"""Setup for z3ext.layout package
+
+$Id$
+"""
+import sys, os
+from setuptools import setup, find_packages
+
+def read(*rnames):
+ return open(os.path.join(os.path.dirname(__file__), *rnames)).read()
+
+version='1.5.8'
+
+
+setup(name='z3ext.layout',
+ version=version,
+ description="A package implementing advanced Page Template patterns.",
+ long_description=(
+ 'Detailed Documentation\n' +
+ '======================\n'
+ + '\n\n' +
+ read('src', 'z3ext', 'layout', 'README.txt')
+ + '\n\n' +
+ read('CHANGES.txt')
+ ),
+ classifiers=[
+ 'Development Status :: 5 - Production/Stable',
+ 'Environment :: Web Environment',
+ 'Intended Audience :: Developers',
+ 'License :: OSI Approved :: Zope Public License',
+ 'Programming Language :: Python',
+ 'Natural Language :: English',
+ 'Operating System :: OS Independent',
+ 'Topic :: Internet :: WWW/HTTP',
+ 'Framework :: Zope3'],
+ author='Nikolay Kim',
+ author_email='fafhrd91 at gmail.com',
+ url='http://z3ext.net/',
+ license='ZPL 2.1',
+ packages=find_packages('src'),
+ package_dir = {'':'src'},
+ namespace_packages=['z3ext'],
+ install_requires = ['setuptools',
+ 'zope.event',
+ 'zope.schema',
+ 'zope.component',
+ 'zope.interface',
+ 'zope.security',
+ 'zope.publisher',
+ 'zope.configuration',
+ 'zope.pagetemplate',
+ 'zope.tales',
+ 'zope.app.component',
+ 'zope.app.publisher',
+ 'zope.app.pagetemplate',
+ 'z3c.autoinclude',
+ ],
+ extras_require = dict(test=['zope.app.container',
+ 'zope.app.testing',
+ 'zope.testing',
+ ]),
+ include_package_data = True,
+ zip_safe = False
+ )
Deleted: z3ext.layout/tags/1.5.8/src/z3ext/layout/README.txt
===================================================================
--- z3ext.layout/trunk/src/z3ext/layout/README.txt 2008-11-21 11:18:39 UTC (rev 93238)
+++ z3ext.layout/tags/1.5.8/src/z3ext/layout/README.txt 2008-11-23 17:23:59 UTC (rev 93282)
@@ -1,299 +0,0 @@
-================
-Template layouts
-================
-
-Layouts is different way of building skin templates without METAL.
-
-We need load zcml file
-
- >>> import z3ext.layout
- >>> from zope.configuration import xmlconfig
- >>> context = xmlconfig.file('meta.zcml', z3ext.layout)
-
- >>> import os, tempfile
- >>> from zope import interface, component
- >>> from z3ext.layout import tests, interfaces
- >>> from z3ext.layout.pagelet import BrowserPagelet
-
-Let's define main layout for our skin, it like 'page' macros from basicskin or
-rotterdam. It will contains <html>, <head> and <body> tags.
-It's like main_template in CMF or 'page' macro in basicskin/rotterdam
-
- >>> temp_dir = tempfile.mkdtemp()
- >>> layoutportal = os.path.join(temp_dir, 'layoutportal.pt')
- >>> open(layoutportal, 'w').write(
- ... '''<html>
- ... <body>
- ... <div id="portal" tal:content="structure view/render">
- ... </div>
- ... </body>
- ... </html>''')
-
-Let's define 'portal' layout
-
- >>> context = xmlconfig.string("""
- ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
- ... <z3ext:layout
- ... name="portal"
- ... for="zope.app.component.interfaces.ISite"
- ... template="%s" />
- ... </configure>"""%layoutportal, context)
-
-Here another layout.
-
- >>> layoutworkspace = os.path.join(temp_dir, 'layoutworkspace.pt')
- >>> open(layoutworkspace, 'w').write('''
- ... <div id="workspace" tal:content="structure view/render"></div>''')
-
- >>> context = xmlconfig.string("""
- ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
- ... <z3ext:layout
- ... name="workspace"
- ... layout="portal"
- ... for="zope.app.component.interfaces.ISite"
- ... template="%s" />
- ... </configure>"""%layoutworkspace, context)
-
-You should notice that we used layout="portal" it indicates that
-'workspace' layout uses 'portal' layout as parent. so 'workspace' will be rendered
-inside 'portal' layout
-
-Now we need very simple view that uses BrowserPagelet
-
- >>> class IMyView(interface.Interface):
- ... pass
-
- >>> class MyView(BrowserPagelet):
- ... interface.implements(IMyView)
- ...
- ... def render(self):
- ... return self.context.__name__
-
- >>> from zope.publisher.browser import TestRequest
- >>> request = TestRequest()
- >>> view = MyView(root, request)
-
-It returns context __name__
-
- >>> view.__call__()
- 'root'
-
-By default BrowserPagelet uses layout without name, Let's create one, it will
-use 'workspace' layout as parent.
-
- >>> layoutcontent = os.path.join(temp_dir, 'layoutcontent.pt')
- >>> open(layoutcontent, 'w').write('''
- ... <div id="content" tal:content="structure view/render"></div>''')
-
- >>> context = xmlconfig.string("""
- ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
- ... <z3ext:layout
- ... layout="workspace"
- ... for="zope.app.component.interfaces.ISite"
- ... template="%s" />
- ... </configure>"""%layoutcontent, context)
-
- >>> print view()
- <html>
- <body>
- <div id="portal">
- <div id="workspace">
- <div id="content">root</div></div></div>
- </body>
- </html>
-
-All 3 our layout rendered. view rendered inside nameless layout then in
--> 'workspace' layout -> 'portal' layout
-
-Now let's create several more content objects
-
- >>> folder1 = tests.Folder()
- >>> root['folder1'] = folder1
-
- >>> print MyView(folder1, request)()
- <html>
- <body>
- <div id="portal">
- <div id="workspace">
- <div id="content">folder1</div></div></div>
- </body>
- </html>
-
-And another one.
-
- >>> folder1_1 = tests.Folder()
- >>> root['folder1']['folder1_1'] = folder1_1
-
- >>> folder1_1_1 = tests.Folder()
- >>> root['folder1']['folder1_1']['folder1_1_1'] = folder1_1_1
-
- >>> print MyView(folder1_1_1, request)()
- <html>
- <body>
- <div id="portal">
- <div id="workspace">
- <div id="content">folder1_1_1</div></div></div>
- </body>
- </html>
-
-This is all quite easy. Let's use more complex example. For example
-later other developers decide change how portal looks for folder1 object
-they want that all folder1 and all it's childs(folder1_1, folder1_1_1) have
-same look.
-
-Let's add '<table>' with couple columns
-
- >>> layoutcolumns = os.path.join(temp_dir, 'layoutcolumns.pt')
- >>> open(layoutcolumns, 'w').write('''
- ... <table id="columns">
- ... <tr>
- ... <td id="column1">Column1</td>
- ... <td id="column2" tal:content="structure view/render"></td>
- ... <td id="column3">Column3</td>
- ... </tr>
- ... </table>''')
-
-We register new layout for different interafce
-
- >>> context = xmlconfig.string("""
- ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
- ... <z3ext:layout
- ... name="workspace"
- ... layout="portal"
- ... for="z3ext.layout.tests.IFolder1"
- ... template="%s" />
- ... </configure>"""%layoutcolumns, context)
-
- >>> interface.directlyProvides(folder1, tests.IFolder1)
-
- >>> print MyView(folder1, request)()
- <html>
- <body>
- <div id="portal">
- <table id="columns">
- <tr>
- <td id="column1">Column1</td>
- <td id="column2">
- <div id="content">folder1</div></td>
- <td id="column3">Column3</td>
- </tr>
- </table></div>
- </body>
- </html>
-
-folder1 uses new 'workspace' layout, but what about other folders
-
- >>> print MyView(folder1_1, request)()
- <html>
- <body>
- <div id="portal">
- <table id="columns">
- <tr>
- <td id="column1">Column1</td>
- <td id="column2">
- <div id="content">folder1_1</div></td>
- <td id="column3">Column3</td>
- </tr>
- </table></div>
- </body>
- </html>
-
-
- >>> print MyView(folder1_1_1, request)()
- <html>
- <body>
- <div id="portal">
- <table id="columns">
- <tr>
- <td id="column1">Column1</td>
- <td id="column2">
- <div id="content">folder1_1_1</div></td>
- <td id="column3">Column3</td>
- </tr>
- </table></div>
- </body>
- </html>
-
-
-Now we also change how folder1_1 looks, we can replace nameless layout.
-Also we can use nameless layout as parent with layout="."
-
- >>> layoutcontent1_1 = os.path.join(temp_dir, 'layoutcontent1_1.pt')
- >>> open(layoutcontent1_1, 'w').write('''
- ... <div id="content1_1">
- ... <h1>Folder1_1</h1>
- ... <div tal:content="structure view/render"></div>
- ... </div>''')
-
- >>> context = xmlconfig.string("""
- ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
- ... <z3ext:layout
- ... layout="."
- ... for="z3ext.layout.tests.IFolder1_1"
- ... template="%s" />
- ... </configure>"""%layoutcontent1_1, context)
-
- >>> interface.directlyProvides(folder1_1, tests.IFolder1_1)
-
- >>> print MyView(folder1_1, request)()
- <html>
- <body>
- <div id="portal">
- <table id="columns">
- <tr>
- <td id="column1">Column1</td>
- <td id="column2">
- <div id="content">
- <div id="content1_1">
- <h1>Folder1_1</h1>
- <div>folder1_1</div>
- </div></div></td>
- <td id="column3">Column3</td>
- </tr>
- </table></div>
- </body>
- </html>
-
-It still uses nameless layout that we defined for 'root'.
-
-And same for folder1_1_1
-
- >>> layoutcontent1_1_1 = os.path.join(temp_dir, 'layoutcontent1_1_1.pt')
- >>> open(layoutcontent1_1_1, 'w').write('''
- ... <div id="content1_1_1">
- ... <h1>Folder1_1_1</h1>
- ... <div tal:content="structure view/render"></div>
- ... </div>''')
-
- >>> context = xmlconfig.string("""
- ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
- ... <z3ext:layout
- ... layout="."
- ... for="z3ext.layout.tests.IFolder1_1_1"
- ... template="%s" />
- ... </configure>"""%layoutcontent1_1_1, context)
-
- >>> interface.directlyProvides(folder1_1_1, tests.IFolder1_1_1)
-
- >>> print MyView(folder1_1_1, request)()
- <html>
- <body>
- <div id="portal">
- <table id="columns">
- <tr>
- <td id="column1">Column1</td>
- <td id="column2">
- <div id="content">
- <div id="content1_1">
- <h1>Folder1_1</h1>
- <div>
- <div id="content1_1_1">
- <h1>Folder1_1_1</h1>
- <div>folder1_1_1</div>
- </div></div>
- </div></div></td>
- <td id="column3">Column3</td>
- </tr>
- </table></div>
- </body>
- </html>
Copied: z3ext.layout/tags/1.5.8/src/z3ext/layout/README.txt (from rev 93263, z3ext.layout/trunk/src/z3ext/layout/README.txt)
===================================================================
--- z3ext.layout/tags/1.5.8/src/z3ext/layout/README.txt (rev 0)
+++ z3ext.layout/tags/1.5.8/src/z3ext/layout/README.txt 2008-11-23 17:23:59 UTC (rev 93282)
@@ -0,0 +1,297 @@
+================
+Template layouts
+================
+
+Layouts is different way of building skin templates without METAL.
+
+We need load zcml file
+
+ >>> import z3ext.layout
+ >>> from zope.configuration import xmlconfig
+ >>> context = xmlconfig.file('meta.zcml', z3ext.layout)
+
+ >>> import os, tempfile
+ >>> from zope import interface, component
+ >>> from z3ext.layout import tests, interfaces
+ >>> from z3ext.layout.pagelet import BrowserPagelet
+
+Let's define main layout for our skin, it like 'page' macros from basicskin or
+rotterdam. It will contains <html>, <head> and <body> tags.
+It's like main_template in CMF or 'page' macro in basicskin/rotterdam
+
+ >>> temp_dir = tempfile.mkdtemp()
+ >>> layoutportal = os.path.join(temp_dir, 'layoutportal.pt')
+ >>> open(layoutportal, 'w').write(
+ ... '''<html>
+ ... <body>
+ ... <div id="portal" tal:content="structure view/render">
+ ... </div>
+ ... </body>
+ ... </html>''')
+
+Let's define 'portal' layout
+
+ >>> context = xmlconfig.string("""
+ ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+ ... <z3ext:layout
+ ... name="portal"
+ ... for="zope.app.component.interfaces.ISite"
+ ... template="%s" />
+ ... </configure>"""%layoutportal, context)
+
+Here another layout.
+
+ >>> layoutworkspace = os.path.join(temp_dir, 'layoutworkspace.pt')
+ >>> open(layoutworkspace, 'w').write('''
+ ... <div id="workspace" tal:content="structure view/render"></div>''')
+
+ >>> context = xmlconfig.string("""
+ ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+ ... <z3ext:layout
+ ... name="workspace"
+ ... layout="portal"
+ ... for="zope.app.component.interfaces.ISite"
+ ... template="%s" />
+ ... </configure>"""%layoutworkspace, context)
+
+You should notice that we used layout="portal" it indicates that
+'workspace' layout uses 'portal' layout as parent. so 'workspace' will be rendered
+inside 'portal' layout
+
+Now we need very simple view that uses BrowserPagelet
+
+ >>> class IMyView(interface.Interface):
+ ... pass
+
+ >>> class MyView(BrowserPagelet):
+ ... interface.implements(IMyView)
+ ...
+ ... def render(self):
+ ... return self.context.__name__
+
+ >>> from zope.publisher.browser import TestRequest
+ >>> request = TestRequest()
+ >>> view = MyView(root, request)
+
+It returns context __name__
+
+ >>> view.__call__()
+ 'root'
+
+By default BrowserPagelet uses layout without name, Let's create one, it will
+use 'workspace' layout as parent.
+
+ >>> layoutcontent = os.path.join(temp_dir, 'layoutcontent.pt')
+ >>> open(layoutcontent, 'w').write('''
+ ... <div id="content" tal:content="structure view/render"></div>''')
+
+ >>> context = xmlconfig.string("""
+ ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+ ... <z3ext:layout
+ ... layout="workspace"
+ ... for="zope.app.component.interfaces.ISite"
+ ... template="%s" />
+ ... </configure>"""%layoutcontent, context)
+
+ >>> print view()
+ <html>
+ <body>
+ <div id="portal">
+ <div id="workspace">
+ <div id="content">root</div>...
+ </body>
+ </html>
+
+All 3 our layout rendered. view rendered inside nameless layout then in
+-> 'workspace' layout -> 'portal' layout
+
+Now let's create several more content objects
+
+ >>> folder1 = tests.Folder()
+ >>> root['folder1'] = folder1
+
+ >>> print MyView(folder1, request)()
+ <html>
+ <body>
+ <div id="portal">
+ <div id="workspace">
+ <div id="content">folder1</div>...
+ </body>
+ </html>
+
+And another one.
+
+ >>> folder1_1 = tests.Folder()
+ >>> root['folder1']['folder1_1'] = folder1_1
+
+ >>> folder1_1_1 = tests.Folder()
+ >>> root['folder1']['folder1_1']['folder1_1_1'] = folder1_1_1
+
+ >>> print MyView(folder1_1_1, request)()
+ <html>
+ <body>
+ <div id="portal">
+ <div id="workspace">
+ <div id="content">folder1_1_1</div>...
+ </body>
+ </html>
+
+This is all quite easy. Let's use more complex example. For example
+later other developers decide change how portal looks for folder1 object
+they want that all folder1 and all it's childs(folder1_1, folder1_1_1) have
+same look.
+
+Let's add '<table>' with couple columns
+
+ >>> layoutcolumns = os.path.join(temp_dir, 'layoutcolumns.pt')
+ >>> open(layoutcolumns, 'w').write('''
+ ... <table id="columns">
+ ... <tr>
+ ... <td id="column1">Column1</td>
+ ... <td id="column2" tal:content="structure view/render"></td>
+ ... <td id="column3">Column3</td>
+ ... </tr>
+ ... </table>''')
+
+We register new layout for different interafce
+
+ >>> context = xmlconfig.string("""
+ ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+ ... <z3ext:layout
+ ... name="workspace"
+ ... layout="portal"
+ ... for="z3ext.layout.tests.IFolder1"
+ ... template="%s" />
+ ... </configure>"""%layoutcolumns, context)
+
+ >>> interface.directlyProvides(folder1, tests.IFolder1)
+
+ >>> print MyView(folder1, request)()
+ <html>
+ <body>
+ <div id="portal">
+ <table id="columns">
+ <tr>
+ <td id="column1">Column1</td>
+ <td id="column2">
+ <div id="content">folder1</div>...
+ <td id="column3">Column3</td>
+ </tr>
+ </table>...
+ </body>
+ </html>
+
+folder1 uses new 'workspace' layout, but what about other folders
+
+ >>> print MyView(folder1_1, request)()
+ <html>
+ <body>
+ <div id="portal">
+ <table id="columns">
+ <tr>
+ <td id="column1">Column1</td>
+ <td id="column2">
+ <div id="content">folder1_1</div>...
+ <td id="column3">Column3</td>
+ </tr>
+ </table>...
+ </body>
+ </html>
+
+
+ >>> print MyView(folder1_1_1, request)()
+ <html>
+ <body>
+ <div id="portal">
+ <table id="columns">
+ <tr>
+ <td id="column1">Column1</td>
+ <td id="column2">
+ <div id="content">folder1_1_1</div>...
+ <td id="column3">Column3</td>
+ </tr>
+ </table>...
+ </body>
+ </html>
+
+
+Now we also change how folder1_1 looks, we can replace nameless layout.
+Also we can use nameless layout as parent with layout="."
+
+ >>> layoutcontent1_1 = os.path.join(temp_dir, 'layoutcontent1_1.pt')
+ >>> open(layoutcontent1_1, 'w').write('''
+ ... <div id="content1_1">
+ ... <h1>Folder1_1</h1>
+ ... <div tal:content="structure view/render"></div>
+ ... </div>''')
+
+ >>> context = xmlconfig.string("""
+ ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+ ... <z3ext:layout
+ ... layout="."
+ ... for="z3ext.layout.tests.IFolder1_1"
+ ... template="%s" />
+ ... </configure>"""%layoutcontent1_1, context)
+
+ >>> interface.directlyProvides(folder1_1, tests.IFolder1_1)
+
+ >>> print MyView(folder1_1, request)()
+ <html>
+ <body>
+ <div id="portal">
+ <table id="columns">
+ <tr>
+ <td id="column1">Column1</td>
+ <td id="column2">
+ <div id="content">
+ <div id="content1_1">
+ <h1>Folder1_1</h1>
+ <div>folder1_1</div>
+ </div>...
+ <td id="column3">Column3</td>
+ </tr>
+ </table>...
+ </body>
+ </html>
+
+It still uses nameless layout that we defined for 'root'.
+
+And same for folder1_1_1
+
+ >>> layoutcontent1_1_1 = os.path.join(temp_dir, 'layoutcontent1_1_1.pt')
+ >>> open(layoutcontent1_1_1, 'w').write('''
+ ... <div id="content1_1_1">
+ ... <h1>Folder1_1_1</h1>
+ ... <div tal:content="structure view/render"></div>
+ ... </div>''')
+
+ >>> context = xmlconfig.string("""
+ ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+ ... <z3ext:layout
+ ... layout="."
+ ... for="z3ext.layout.tests.IFolder1_1_1"
+ ... template="%s" />
+ ... </configure>"""%layoutcontent1_1_1, context)
+
+ >>> interface.directlyProvides(folder1_1_1, tests.IFolder1_1_1)
+
+ >>> print MyView(folder1_1_1, request)()
+ <html>
+ <body>
+ <div id="portal">
+ <table id="columns">
+ <tr>
+ <td id="column1">Column1</td>
+ <td id="column2">
+ <div id="content">
+ <div id="content1_1">
+ <h1>Folder1_1</h1>
+ <div>
+ <div id="content1_1_1">
+ <h1>Folder1_1_1</h1>
+ <div>folder1_1_1</div>...
+ <td id="column3">Column3</td>
+ </tr>
+ </table>...
+ </body>
+ </html>
Deleted: z3ext.layout/tags/1.5.8/src/z3ext/layout/pagelet.txt
===================================================================
--- z3ext.layout/trunk/src/z3ext/layout/pagelet.txt 2008-11-21 11:18:39 UTC (rev 93238)
+++ z3ext.layout/tags/1.5.8/src/z3ext/layout/pagelet.txt 2008-11-23 17:23:59 UTC (rev 93282)
@@ -1,525 +0,0 @@
-=================
-Pagelet directive
-=================
-
-Show how we can use the pagelet directive. Register the meta configuration for
-the directive.
-
- >>> import os, tempfile
- >>> from zope import interface, component
- >>> from zope.configuration import xmlconfig
- >>> from z3ext.layout.interfaces import IPagelet
- >>> import z3ext.layout
- >>> context = xmlconfig.file('meta.zcml', z3ext.layout)
-
-We need also a custom pagelet class:
-
- >>> from z3ext.layout.pagelet import BrowserPagelet
- >>> class MyPagelet(BrowserPagelet):
- ... """Custom pagelet"""
-
-Register a pagelet within the directive with minimal attributes:
-
- >>> context = xmlconfig.string("""
- ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
- ... <z3ext:pagelet
- ... name="index.html"
- ... class="z3ext.layout.TESTS.MyPagelet"
- ... permission="zope.Public"
- ... />
- ... </configure>
- ... """, context)
-
-Let's get the pagelet
-
- >>> from zope.publisher.browser import TestRequest
- >>> pagelet = component.queryMultiAdapter((object(), TestRequest()),
- ... name='index.html')
-
-and check them:
-
- >>> pagelet
- <z3ext.layout.zcml.PageletClass from <class 'z3ext.layout.TESTS.MyPagelet'> ...>
-
- >>> pagelet.context
- <object object at ...>
-
-Register the pagelet with a different name and more attributes provided from
-the directive. We also use a custom attribute called label here.
-Also we don't use BrowserPagelet as parent class, pagelet directive automaticly
-adds BrowserPagetlet to bases classes. Let's define some more components...
-
- >>> class SecondPagelet(object):
- ... label = u''
-
- >>> import zope.interface
- >>> class IContent(zope.interface.Interface):
- ... """Content interface."""
-
- >>> class Content(object):
- ... zope.interface.implements(IContent)
-
- >>> context = xmlconfig.string("""
- ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
- ... <z3ext:pagelet
- ... name="custom.html"
- ... class="z3ext.layout.TESTS.SecondPagelet"
- ... for="z3ext.layout.TESTS.IContent"
- ... permission="zope.Public"
- ... label="my Label" />
- ... </configure>
- ... """, context)
-
-Get the pagelet for the new content object
-
- >>> import zope.component
- >>> pagelet = zope.component.queryMultiAdapter((Content(), TestRequest()),
- ... name='custom.html')
-
-and check them:
-
- >>> pagelet
- <z3ext.layout.zcml.PageletClass from <class 'z3ext.layout.TESTS.SecondPagelet'> ...>
-
- >>> pagelet.label
- u'my Label'
-
-We also can provide another interface then the IPagelet within the directive.
-Such a interface must be inherited from IPagelet.
-
- >>> class NewPagelet(BrowserPagelet):
- ... """New pagelet"""
-
-Now register the pagelet within a interface.
-
- >>> class INewPagelet(interface.Interface):
- ... """New pagelet interface."""
-
- >>> context = xmlconfig.string("""
- ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
- ... <z3ext:pagelet
- ... name="new.html"
- ... class="z3ext.layout.TESTS.NewPagelet"
- ... permission="zope.Public"
- ... provides="z3ext.layout.TESTS.INewPagelet" />
- ... </configure>
- ... """, context)
-
-And if we get the pagelet, we can see that the object provides the new
-pagelet interface:
-
- >>> pagelet = component.queryMultiAdapter((object(), TestRequest()),
- ... name='new.html')
- >>> pagelet
- <z3ext.layout.zcml.PageletClass from <class 'z3ext.layout.TESTS.NewPagelet'> ...>
-
- >>> INewPagelet.providedBy(pagelet)
- True
-
-We can create pagelet without specific class
-
- >>> context = xmlconfig.string("""
- ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
- ... <z3ext:pagelet
- ... name="noclass.html"
- ... permission="zope.Public" />
- ... </configure>
- ... """, context)
-
- >>> pagelet = component.queryMultiAdapter((object(), TestRequest()),
- ... name='noclass.html')
- >>> pagelet
- <z3ext.layout.zcml.PageletClass from None ...>
-
-
-We can create pagelet with template:
-
- >>> context = xmlconfig.string("""
- ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
- ... <z3ext:pagelet
- ... name="unknown.html"
- ... template="unknown.pt"
- ... permission="zope.Public" />
- ... </configure>
- ... """, context)
- Traceback (most recent call last):
- ...
- ZopeXMLConfigurationError: File "<string>", line 3.2-6.33
- ConfigurationError: ('No such file', ...unknown.pt')
-
- >>> temp_dir = tempfile.mkdtemp()
- >>> template = os.path.join(temp_dir, 'pagelet.pt')
- >>> open(template, 'w').write('''<div>My pagelet</div>''')
-
- >>> context = xmlconfig.string("""
- ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
- ... <z3ext:pagelet
- ... name="template.html"
- ... template="%s"
- ... permission="zope.Public" />
- ... </configure>
- ... """%template, context)
-
- >>> pagelet = component.queryMultiAdapter((object(), TestRequest()),
- ... name='template.html')
- >>> pagelet
- <z3ext.layout.zcml.PageletClass from None ...>
-
- >>> pagelet.template
- <BoundPageTemplateFile of <z3ext.layout.zcml.PageletClass from None ...>>
-
-Pagelet rendering
-
- >>> print pagelet.render()
- <div>My pagelet</div>
- <BLANKLINE>
-
-We should use page template as template for pagelet or we should
-provide IPageTemplate adapter for pagelet
-
- >>> pagelet = component.queryMultiAdapter((object(), TestRequest()),
- ... name='noclass.html')
- >>> pagelet.render()
- Traceback (most recent call last):
- ...
- LookupError: Can't find IPageTemplate for pagelet.
-
- >>> from zope.pagetemplate.interfaces import IPageTemplate
- >>> from zope.app.pagetemplate import ViewPageTemplateFile
- >>> pt = ViewPageTemplateFile(template)
- >>> def getPT(context, request):
- ... return pt
- >>> component.getSiteManager().registerAdapter(
- ... getPT, (pagelet.__class__, interface.Interface), IPageTemplate, '')
-
- >>> print pagelet()
- <div>My pagelet</div>
- <BLANKLINE>
-
-We can redirect during pagelet rendering, in this case render method
-doesn't call.
-
- >>> pagelet = component.queryMultiAdapter((object(), TestRequest()),
- ... name='noclass.html')
- >>> pagelet.redirect('/')
- >>> pagelet.isRedirected
- True
- >>> pagelet()
- u''
-
-We can get default pagelet view for content. First register default view
-
- >>> from zope.component.interfaces import IDefaultViewName
- >>> component.getSiteManager().registerAdapter(
- ... 'index.html', (interface.Interface, interface.Interface),
- ... IDefaultViewName)
-
- >>> view = component.getMultiAdapter(
- ... (object(), TestRequest()), z3ext.layout.interfaces.IPagelet)
-
- >>> view
- <z3ext.layout.zcml.PageletClass from <class 'z3ext.layout.TESTS.MyPagelet'> ...>
-
- >>> view.__name__
- u'index.html'
-
-
-Pagelet without name
-
- >>> class IMyPagelet1(interface.Interface):
- ... pass
-
- >>> class IMyPagelet2(interface.Interface):
- ... pass
-
- >>> template2 = os.path.join(temp_dir, 'pagelet2.pt')
- >>> open(template2, 'w').write('''<div>My pagelet2</div>''')
-
- >>> from z3ext.layout.tests import ITestPagelet
-
- >>> context = xmlconfig.string("""
- ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
- ... <z3ext:pagelet
- ... template="%s"
- ... provides="z3ext.layout.tests.ITestPagelet"
- ... permission="zope.Public" />
- ... <z3ext:pagelet
- ... template="%s"
- ... provides="z3ext.layout.TESTS.IMyPagelet2"
- ... permission="zope.Public" />
- ... <z3ext:pagelet
- ... template="%s"
- ... permission="zope.Public" />
- ... </configure>
- ... """%(template, template2, template2), context)
-
- >>> pagelet = component.queryMultiAdapter(
- ... (object(), TestRequest()), ITestPagelet)
-
- >>> ITestPagelet.providedBy(pagelet)
- True
- >>> pagelet.render()
- u'<div>My pagelet</div>'
-
- >>> request = TestRequest()
- >>> pagelet = component.queryMultiAdapter((object(), request), IMyPagelet2)
- >>> IMyPagelet2.providedBy(pagelet)
- True
- >>> pagelet.render()
- u'<div>My pagelet2</div>'
-
-
-Access nameless pagelet from view
-
- >>> pagelet = component.getMultiAdapter((object(), request), name='pagelet')
-
- >>> print pagelet.publishTraverse(
- ... request, 'test.unknown')
- Traceback (most recent call last):
- ...
- NotFound: Object: ..., name: 'test.unknown'
-
- >>> pagelet.browserDefault(request)
- (..., ('',))
-
-by default IPagelet
-
- >>> print pagelet()
- <div>My pagelet2</div>
-
- >>> print pagelet.publishTraverse(request, '')
- <div>My pagelet2</div>
-
- >>> print pagelet.publishTraverse(
- ... request, 'z3ext.layout.tests.ITestPagelet')
- <div>My pagelet</div>
-
-We can register our marker interface as named utility and use name
-instead of full module path
-
- >>> component.provideUtility(
- ... ITestPagelet, z3ext.layout.interfaces.IPageletType, name='testPageletType')
- >>> interface.alsoProvides(ITestPagelet, z3ext.layout.interfaces.IPageletType)
-
- >>> print pagelet.publishTraverse(request, 'testPageletType')
- <div>My pagelet</div>
-
-We can register nameless pagelet only if provided interface is not
-inherited from IBrowserPublisher, because we can override
-IBrowserPublisher for content.
-
- >>> class IWrongPageletInterface(IPagelet):
- ... pass
-
- >>> context = xmlconfig.string("""
- ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
- ... <z3ext:pagelet
- ... template="%s"
- ... provides="z3ext.layout.TESTS.IWrongPageletInterface"
- ... permission="zope.Public" />
- ... </configure>
- ... """%template, context)
- Traceback (most recent call last):
- ...
- ZopeXMLConfigurationError:...
- ConfigurationError: You can't register nameless pagelet...
-
-If we still need nameless adapter we can use IPagelet interface
-
- >>> context = xmlconfig.string("""
- ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
- ... <z3ext:pagelet
- ... for="z3ext.layout.TESTS.IContent"
- ... template="%s"
- ... provides="z3ext.layout.interfaces.IPagelet"
- ... permission="zope.Public" />
- ... </configure>
- ... """%template, context)
-
-
-If we register named pagelet and provided interface provides IPageletType,
-also nameless adapter registered
-
- >>> context = xmlconfig.string("""
- ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
- ... <z3ext:pagelet
- ... name="test.html"
- ... for="z3ext.layout.TESTS.IContent"
- ... template="%s"
- ... provides="z3ext.layout.TESTS.ITestPagelet"
- ... permission="zope.Public" />
- ... </configure>
- ... """%template, context)
-
- >>> content = Content()
- >>> pagelet1 = component.getMultiAdapter((content, request), name='test.html')
- >>> pagelet2 = component.getMultiAdapter((content, request), ITestPagelet)
-
- >>> pagelet1.__class__ is pagelet2.__class__
- True
-
-
-The TALES `pagelet` expression
-==============================
-
-The ``pagelet`` expression will look up the interaface or IPageletType
-name, call it and return the HTML content. The first step, however, will be to
-register our pagelet with the component architecture:
-
-Let's now create a view using a page template:
-
- >>> import os, tempfile
- >>> temp_dir = tempfile.mkdtemp()
- >>> templateFileName = os.path.join(temp_dir, 'template.pt')
- >>> open(templateFileName, 'w').write('''
- ... <html>
- ... <body>
- ... <h1>My Web Page</h1>
- ... <div class="left-column">
- ... <tal:block replace="structure pagelet:z3ext.layout.tests.ITestPagelet" />
- ... </div>
- ... <div class="main">
- ... Content here
- ... </div>
- ... </body>
- ... </html>
- ... ''')
-
-Also we should register tales expression
-
- >>> from z3ext.layout import tales
- >>> from zope.app.pagetemplate.metaconfigure import registerType
- >>> registerType('pagelet', tales.TALESPageletExpression)
-
-Finally we look up the view and render it.
-
- >>> from zope.app.pagetemplate.simpleviewclass import SimpleViewClass
-
- >>> FrontPage = SimpleViewClass(templateFileName, name='main.html')
- >>> component.provideAdapter(
- ... FrontPage,
- ... (interface.Interface, interface.Interface), interface.Interface,
- ... name='main.html')
-
- >>> view = component.getMultiAdapter((object(), request), name='main.html')
- >>> print view()
- <html>
- <body>
- <h1>My Web Page</h1>
- <div class="left-column">
- <div>My pagelet</div>
- </div>
- <div class="main">
- Content here
- </div>
- </body>
- </html>
-
-Or we can use typed pagelet interface
-
- >>> open(templateFileName, 'w').write('''
- ... <html>
- ... <body>
- ... <h1>My Web Page</h1>
- ... <div class="left-column">
- ... <tal:block replace="structure pagelet:testPageletType" />
- ... </div>
- ... <div class="main">
- ... Content here
- ... </div>
- ... </body>
- ... </html>
- ... ''')
-
- >>> FrontPage = SimpleViewClass(templateFileName, name='main.html')
- >>> component.provideAdapter(
- ... FrontPage,
- ... (interface.Interface, interface.Interface), interface.Interface,
- ... name='main.html')
-
- >>> view = component.getMultiAdapter((object(), request), name='main.html')
- >>> print view()
- <html>
- <body>
- <h1>My Web Page</h1>
- <div class="left-column">
- <div>My pagelet</div>
- </div>
- <div class="main">
- Content here
- </div>
- </body>
- </html>
-
-Default IPagelet
-
- >>> open(templateFileName, 'w').write('''
- ... <html>
- ... <body>
- ... <h1>My Web Page</h1>
- ... <div class="left-column">
- ... <tal:block replace="structure pagelet:" />
- ... </div>
- ... <div class="main">
- ... Content here
- ... </div>
- ... </body>
- ... </html>
- ... ''')
-
- >>> FrontPage = SimpleViewClass(templateFileName, name='main.html')
- >>> component.provideAdapter(
- ... FrontPage,
- ... (interface.Interface, interface.Interface), interface.Interface,
- ... name='main.html')
-
- >>> view = component.getMultiAdapter((object(), request), name='main.html')
- >>> print view()
- <html>
- <body>
- <h1>My Web Page</h1>
- <div class="left-column">
- <div>My pagelet2</div>
- </div>
- <div class="main">
- Content here
- </div>
- </body>
- </html>
-
-
-If pagelet is not exist, just return empty string
-
- >>> open(templateFileName, 'w').write('''
- ... <html>
- ... <body>
- ... <h1>My Web Page</h1>
- ... <div class="left-column">
- ... <tal:block replace="structure pagelet:test.unknown" />
- ... </div>
- ... <div class="main">
- ... Content here
- ... </div>
- ... </body>
- ... </html>
- ... ''')
-
- >>> FrontPage = SimpleViewClass(templateFileName, name='main.html')
- >>> component.provideAdapter(
- ... FrontPage,
- ... (interface.Interface, interface.Interface), interface.Interface,
- ... name='main.html')
-
- >>> view = component.getMultiAdapter((object(), request), name='main.html')
- >>> print view()
- <html>
- <body>
- <h1>My Web Page</h1>
- <div class="left-column">
- <BLANKLINE>
- </div>
- <div class="main">
- Content here
- </div>
- </body>
- </html>
Copied: z3ext.layout/tags/1.5.8/src/z3ext/layout/pagelet.txt (from rev 93263, z3ext.layout/trunk/src/z3ext/layout/pagelet.txt)
===================================================================
--- z3ext.layout/tags/1.5.8/src/z3ext/layout/pagelet.txt (rev 0)
+++ z3ext.layout/tags/1.5.8/src/z3ext/layout/pagelet.txt 2008-11-23 17:23:59 UTC (rev 93282)
@@ -0,0 +1,523 @@
+=================
+Pagelet directive
+=================
+
+Show how we can use the pagelet directive. Register the meta configuration for
+the directive.
+
+ >>> import os, tempfile
+ >>> from zope import interface, component
+ >>> from zope.configuration import xmlconfig
+ >>> from z3ext.layout.interfaces import IPagelet
+ >>> import z3ext.layout
+ >>> context = xmlconfig.file('meta.zcml', z3ext.layout)
+
+We need also a custom pagelet class:
+
+ >>> from z3ext.layout.pagelet import BrowserPagelet
+ >>> class MyPagelet(BrowserPagelet):
+ ... """Custom pagelet"""
+
+Register a pagelet within the directive with minimal attributes:
+
+ >>> context = xmlconfig.string("""
+ ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+ ... <z3ext:pagelet
+ ... name="index.html"
+ ... class="z3ext.layout.TESTS.MyPagelet"
+ ... permission="zope.Public"
+ ... />
+ ... </configure>
+ ... """, context)
+
+Let's get the pagelet
+
+ >>> from zope.publisher.browser import TestRequest
+ >>> pagelet = component.queryMultiAdapter((object(), TestRequest()),
+ ... name='index.html')
+
+and check them:
+
+ >>> pagelet
+ <z3ext.layout.zcml.PageletClass from <class 'z3ext.layout.TESTS.MyPagelet'> ...>
+
+ >>> pagelet.context
+ <object object at ...>
+
+Register the pagelet with a different name and more attributes provided from
+the directive. We also use a custom attribute called label here.
+Also we don't use BrowserPagelet as parent class, pagelet directive automaticly
+adds BrowserPagetlet to bases classes. Let's define some more components...
+
+ >>> class SecondPagelet(object):
+ ... label = u''
+
+ >>> import zope.interface
+ >>> class IContent(zope.interface.Interface):
+ ... """Content interface."""
+
+ >>> class Content(object):
+ ... zope.interface.implements(IContent)
+
+ >>> context = xmlconfig.string("""
+ ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+ ... <z3ext:pagelet
+ ... name="custom.html"
+ ... class="z3ext.layout.TESTS.SecondPagelet"
+ ... for="z3ext.layout.TESTS.IContent"
+ ... permission="zope.Public"
+ ... label="my Label" />
+ ... </configure>
+ ... """, context)
+
+Get the pagelet for the new content object
+
+ >>> import zope.component
+ >>> pagelet = zope.component.queryMultiAdapter((Content(), TestRequest()),
+ ... name='custom.html')
+
+and check them:
+
+ >>> pagelet
+ <z3ext.layout.zcml.PageletClass from <class 'z3ext.layout.TESTS.SecondPagelet'> ...>
+
+ >>> pagelet.label
+ u'my Label'
+
+We also can provide another interface then the IPagelet within the directive.
+Such a interface must be inherited from IPagelet.
+
+ >>> class NewPagelet(BrowserPagelet):
+ ... """New pagelet"""
+
+Now register the pagelet within a interface.
+
+ >>> class INewPagelet(interface.Interface):
+ ... """New pagelet interface."""
+
+ >>> context = xmlconfig.string("""
+ ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+ ... <z3ext:pagelet
+ ... name="new.html"
+ ... class="z3ext.layout.TESTS.NewPagelet"
+ ... permission="zope.Public"
+ ... provides="z3ext.layout.TESTS.INewPagelet" />
+ ... </configure>
+ ... """, context)
+
+And if we get the pagelet, we can see that the object provides the new
+pagelet interface:
+
+ >>> pagelet = component.queryMultiAdapter((object(), TestRequest()),
+ ... name='new.html')
+ >>> pagelet
+ <z3ext.layout.zcml.PageletClass from <class 'z3ext.layout.TESTS.NewPagelet'> ...>
+
+ >>> INewPagelet.providedBy(pagelet)
+ True
+
+We can create pagelet without specific class
+
+ >>> context = xmlconfig.string("""
+ ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+ ... <z3ext:pagelet
+ ... name="noclass.html"
+ ... permission="zope.Public" />
+ ... </configure>
+ ... """, context)
+
+ >>> pagelet = component.queryMultiAdapter((object(), TestRequest()),
+ ... name='noclass.html')
+ >>> pagelet
+ <z3ext.layout.zcml.PageletClass from None ...>
+
+
+We can create pagelet with template:
+
+ >>> context = xmlconfig.string("""
+ ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+ ... <z3ext:pagelet
+ ... name="unknown.html"
+ ... template="unknown.pt"
+ ... permission="zope.Public" />
+ ... </configure>
+ ... """, context)
+ Traceback (most recent call last):
+ ...
+ ZopeXMLConfigurationError: File "<string>", line 3.2-6.33
+ ConfigurationError: ('No such file', ...unknown.pt')
+
+ >>> temp_dir = tempfile.mkdtemp()
+ >>> template = os.path.join(temp_dir, 'pagelet.pt')
+ >>> open(template, 'w').write('''<div>My pagelet</div>''')
+
+ >>> context = xmlconfig.string("""
+ ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+ ... <z3ext:pagelet
+ ... name="template.html"
+ ... template="%s"
+ ... permission="zope.Public" />
+ ... </configure>
+ ... """%template, context)
+
+ >>> pagelet = component.queryMultiAdapter((object(), TestRequest()),
+ ... name='template.html')
+ >>> pagelet
+ <z3ext.layout.zcml.PageletClass from None ...>
+
+ >>> pagelet.template
+ <BoundPageTemplateFile of <z3ext.layout.zcml.PageletClass from None ...>>
+
+Pagelet rendering
+
+ >>> print pagelet.render()
+ <div>My pagelet</div>
+
+We should use page template as template for pagelet or we should
+provide IPageTemplate adapter for pagelet
+
+ >>> pagelet = component.queryMultiAdapter((object(), TestRequest()),
+ ... name='noclass.html')
+ >>> pagelet.render()
+ Traceback (most recent call last):
+ ...
+ LookupError: Can't find IPageTemplate for pagelet.
+
+ >>> from zope.pagetemplate.interfaces import IPageTemplate
+ >>> from zope.app.pagetemplate import ViewPageTemplateFile
+ >>> pt = ViewPageTemplateFile(template)
+ >>> def getPT(context, request):
+ ... return pt
+ >>> component.getSiteManager().registerAdapter(
+ ... getPT, (pagelet.__class__, interface.Interface), IPageTemplate, '')
+
+ >>> print pagelet()
+ <div>My pagelet</div>
+
+We can redirect during pagelet rendering, in this case render method
+doesn't call.
+
+ >>> pagelet = component.queryMultiAdapter((object(), TestRequest()),
+ ... name='noclass.html')
+ >>> pagelet.redirect('/')
+ >>> pagelet.isRedirected
+ True
+ >>> pagelet()
+ u''
+
+We can get default pagelet view for content. First register default view
+
+ >>> from zope.component.interfaces import IDefaultViewName
+ >>> component.getSiteManager().registerAdapter(
+ ... 'index.html', (interface.Interface, interface.Interface),
+ ... IDefaultViewName)
+
+ >>> view = component.getMultiAdapter(
+ ... (object(), TestRequest()), z3ext.layout.interfaces.IPagelet)
+
+ >>> view
+ <z3ext.layout.zcml.PageletClass from <class 'z3ext.layout.TESTS.MyPagelet'> ...>
+
+ >>> view.__name__
+ u'index.html'
+
+
+Pagelet without name
+
+ >>> class IMyPagelet1(interface.Interface):
+ ... pass
+
+ >>> class IMyPagelet2(interface.Interface):
+ ... pass
+
+ >>> template2 = os.path.join(temp_dir, 'pagelet2.pt')
+ >>> open(template2, 'w').write('''<div>My pagelet2</div>''')
+
+ >>> from z3ext.layout.tests import ITestPagelet
+
+ >>> context = xmlconfig.string("""
+ ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+ ... <z3ext:pagelet
+ ... template="%s"
+ ... provides="z3ext.layout.tests.ITestPagelet"
+ ... permission="zope.Public" />
+ ... <z3ext:pagelet
+ ... template="%s"
+ ... provides="z3ext.layout.TESTS.IMyPagelet2"
+ ... permission="zope.Public" />
+ ... <z3ext:pagelet
+ ... template="%s"
+ ... permission="zope.Public" />
+ ... </configure>
+ ... """%(template, template2, template2), context)
+
+ >>> pagelet = component.queryMultiAdapter(
+ ... (object(), TestRequest()), ITestPagelet)
+
+ >>> ITestPagelet.providedBy(pagelet)
+ True
+ >>> print pagelet.render()
+ <div>My pagelet</div>
+
+ >>> request = TestRequest()
+ >>> pagelet = component.queryMultiAdapter((object(), request), IMyPagelet2)
+ >>> IMyPagelet2.providedBy(pagelet)
+ True
+ >>> print pagelet.render()
+ <div>My pagelet2</div>
+
+
+Access nameless pagelet from view
+
+ >>> pagelet = component.getMultiAdapter((object(), request), name='pagelet')
+
+ >>> print pagelet.publishTraverse(
+ ... request, 'test.unknown')
+ Traceback (most recent call last):
+ ...
+ NotFound: Object: ..., name: 'test.unknown'
+
+ >>> pagelet.browserDefault(request)
+ (..., ('',))
+
+by default IPagelet
+
+ >>> print pagelet()
+ <div>My pagelet2</div>
+
+ >>> print pagelet.publishTraverse(request, '')
+ <div>My pagelet2</div>
+
+ >>> print pagelet.publishTraverse(
+ ... request, 'z3ext.layout.tests.ITestPagelet')
+ <div>My pagelet</div>
+
+We can register our marker interface as named utility and use name
+instead of full module path
+
+ >>> component.provideUtility(
+ ... ITestPagelet, z3ext.layout.interfaces.IPageletType, name='testPageletType')
+ >>> interface.alsoProvides(ITestPagelet, z3ext.layout.interfaces.IPageletType)
+
+ >>> print pagelet.publishTraverse(request, 'testPageletType')
+ <div>My pagelet</div>
+
+We can register nameless pagelet only if provided interface is not
+inherited from IBrowserPublisher, because we can override
+IBrowserPublisher for content.
+
+ >>> class IWrongPageletInterface(IPagelet):
+ ... pass
+
+ >>> context = xmlconfig.string("""
+ ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+ ... <z3ext:pagelet
+ ... template="%s"
+ ... provides="z3ext.layout.TESTS.IWrongPageletInterface"
+ ... permission="zope.Public" />
+ ... </configure>
+ ... """%template, context)
+ Traceback (most recent call last):
+ ...
+ ZopeXMLConfigurationError:...
+ ConfigurationError: You can't register nameless pagelet...
+
+If we still need nameless adapter we can use IPagelet interface
+
+ >>> context = xmlconfig.string("""
+ ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+ ... <z3ext:pagelet
+ ... for="z3ext.layout.TESTS.IContent"
+ ... template="%s"
+ ... provides="z3ext.layout.interfaces.IPagelet"
+ ... permission="zope.Public" />
+ ... </configure>
+ ... """%template, context)
+
+
+If we register named pagelet and provided interface provides IPageletType,
+also nameless adapter registered
+
+ >>> context = xmlconfig.string("""
+ ... <configure xmlns:z3ext="http://namespaces.zope.org/z3ext">
+ ... <z3ext:pagelet
+ ... name="test.html"
+ ... for="z3ext.layout.TESTS.IContent"
+ ... template="%s"
+ ... provides="z3ext.layout.TESTS.ITestPagelet"
+ ... permission="zope.Public" />
+ ... </configure>
+ ... """%template, context)
+
+ >>> content = Content()
+ >>> pagelet1 = component.getMultiAdapter((content, request), name='test.html')
+ >>> pagelet2 = component.getMultiAdapter((content, request), ITestPagelet)
+
+ >>> pagelet1.__class__ is pagelet2.__class__
+ True
+
+
+The TALES `pagelet` expression
+==============================
+
+The ``pagelet`` expression will look up the interaface or IPageletType
+name, call it and return the HTML content. The first step, however, will be to
+register our pagelet with the component architecture:
+
+Let's now create a view using a page template:
+
+ >>> import os, tempfile
+ >>> temp_dir = tempfile.mkdtemp()
+ >>> templateFileName = os.path.join(temp_dir, 'template.pt')
+ >>> open(templateFileName, 'w').write('''
+ ... <html>
+ ... <body>
+ ... <h1>My Web Page</h1>
+ ... <div class="left-column">
+ ... <tal:block replace="structure pagelet:z3ext.layout.tests.ITestPagelet" />
+ ... </div>
+ ... <div class="main">
+ ... Content here
+ ... </div>
+ ... </body>
+ ... </html>
+ ... ''')
+
+Also we should register tales expression
+
+ >>> from z3ext.layout import tales
+ >>> from zope.app.pagetemplate.metaconfigure import registerType
+ >>> registerType('pagelet', tales.TALESPageletExpression)
+
+Finally we look up the view and render it.
+
+ >>> from zope.app.pagetemplate.simpleviewclass import SimpleViewClass
+
+ >>> FrontPage = SimpleViewClass(templateFileName, name='main.html')
+ >>> component.provideAdapter(
+ ... FrontPage,
+ ... (interface.Interface, interface.Interface), interface.Interface,
+ ... name='main.html')
+
+ >>> view = component.getMultiAdapter((object(), request), name='main.html')
+ >>> print view()
+ <html>
+ <body>
+ <h1>My Web Page</h1>
+ <div class="left-column">
+ <div>My pagelet</div>
+ </div>
+ <div class="main">
+ Content here
+ </div>
+ </body>
+ </html>
+
+Or we can use typed pagelet interface
+
+ >>> open(templateFileName, 'w').write('''
+ ... <html>
+ ... <body>
+ ... <h1>My Web Page</h1>
+ ... <div class="left-column">
+ ... <tal:block replace="structure pagelet:testPageletType" />
+ ... </div>
+ ... <div class="main">
+ ... Content here
+ ... </div>
+ ... </body>
+ ... </html>
+ ... ''')
+
+ >>> FrontPage = SimpleViewClass(templateFileName, name='main.html')
+ >>> component.provideAdapter(
+ ... FrontPage,
+ ... (interface.Interface, interface.Interface), interface.Interface,
+ ... name='main.html')
+
+ >>> view = component.getMultiAdapter((object(), request), name='main.html')
+ >>> print view()
+ <html>
+ <body>
+ <h1>My Web Page</h1>
+ <div class="left-column">
+ <div>My pagelet</div>
+ </div>
+ <div class="main">
+ Content here
+ </div>
+ </body>
+ </html>
+
+Default IPagelet
+
+ >>> open(templateFileName, 'w').write('''
+ ... <html>
+ ... <body>
+ ... <h1>My Web Page</h1>
+ ... <div class="left-column">
+ ... <tal:block replace="structure pagelet:" />
+ ... </div>
+ ... <div class="main">
+ ... Content here
+ ... </div>
+ ... </body>
+ ... </html>
+ ... ''')
+
+ >>> FrontPage = SimpleViewClass(templateFileName, name='main.html')
+ >>> component.provideAdapter(
+ ... FrontPage,
+ ... (interface.Interface, interface.Interface), interface.Interface,
+ ... name='main.html')
+
+ >>> view = component.getMultiAdapter((object(), request), name='main.html')
+ >>> print view()
+ <html>
+ <body>
+ <h1>My Web Page</h1>
+ <div class="left-column">
+ <div>My pagelet2</div>
+ </div>
+ <div class="main">
+ Content here
+ </div>
+ </body>
+ </html>
+
+
+If pagelet is not exist, just return empty string
+
+ >>> open(templateFileName, 'w').write('''
+ ... <html>
+ ... <body>
+ ... <h1>My Web Page</h1>
+ ... <div class="left-column">
+ ... <tal:block replace="structure pagelet:test.unknown" />
+ ... </div>
+ ... <div class="main">
+ ... Content here
+ ... </div>
+ ... </body>
+ ... </html>
+ ... ''')
+
+ >>> FrontPage = SimpleViewClass(templateFileName, name='main.html')
+ >>> component.provideAdapter(
+ ... FrontPage,
+ ... (interface.Interface, interface.Interface), interface.Interface,
+ ... name='main.html')
+
+ >>> view = component.getMultiAdapter((object(), request), name='main.html')
+ >>> print view()
+ <html>
+ <body>
+ <h1>My Web Page</h1>
+ <div class="left-column">
+ <BLANKLINE>
+ </div>
+ <div class="main">
+ Content here
+ </div>
+ </body>
+ </html>
Deleted: z3ext.layout/tags/1.5.8/src/z3ext/layout/styles.css
===================================================================
--- z3ext.layout/trunk/src/z3ext/layout/styles.css 2008-11-21 11:18:39 UTC (rev 93238)
+++ z3ext.layout/tags/1.5.8/src/z3ext/layout/styles.css 2008-11-23 17:23:59 UTC (rev 93282)
@@ -1,318 +0,0 @@
-/* zrt-cssregistry: */
-
- at media all {
-
- .z-page, .page {
- padding: 1.5em;
- border: borderWidth borderStyle globalBorderColor;
- background-color: globalBackgroundColor;
- font-size: 100%;
- }
-
- .z-page h1 {
- padding-top: 0;
- }
-
- .z-page h4 {
- border-bottom: borderWidth borderStyle globalBorderColor;
- }
-
- .z-page legend {
- background-color: transparent;
- }
-
- .z-page-description,
- .pageDescription {
- color: discreetColor;
- font-size: fontSmallSize;
- font-weight: normal;
- margin-bottom: 1.5em;
- }
-
- .z-frame, .z-topframe,
- .frame, .topframe {
- padding: 1em;
- margin-top: 1em;
- background: contentBackgroundColor;
- border: borderWidth borderStyle globalExtraBorderColor;
- }
-
- .z-topframe, .topframe {
- margin-top: 0em;
- }
-
- .z-frame h4 {
- border-bottom: borderWidth borderStyle globalExtraBorderColor;
- font-weight: normal;
- }
-
- #z-portal {
- background-color: contentBackgroundColor;
- }
-
- #z-portal-workspace {
- margin: 2em 1.5em 1.5em 1.5em;
- }
-
- #z-portal-workspace {
- font-size: 110%;
- background: contentBackgroundColor;
- }
-
- #z-portal-workspace h1 {
- font-size: 120%;
- font-weight: bold;
- }
-
- #z-portal-workspace h2 {
- font-size: 110%;
- }
-
- #z-portal-workspace h3 {
- font-size: 100%;
- }
-
- #z-portal-workspace h5,
- #z-portal-workspace h6 {
- color: discreetColor;
- }
-
- ul.z-listing {
- margin: 0.5em 0;
- list-style: none;
- list-style-image: none;
- list-style-type: none;
- }
-
- ul.z-listing li {
- clear: both;
- margin-bottom: 0.5em;
- list-style: none;
- list-style-image: none;
- }
-
- ul.z-listing li .z-listing-icon {
- float: left;
- padding-top: 8px;
- padding-right: 0.5em;
- height: 32px;
- }
-
- ul.z-listing li a,
- ul.z-listing li .z-listing-details a {
- color: linkColor;
- border: 0;
- border-bottom: 1px dotted discreetColor;
- text-decoration: none;
- }
-
- ul.z-listing li a:visited,
- ul.z-listing li .z-listing-details a:visited {
- color: linkColor;
- background-color: transparent;
- }
-
- ul.z-listing li a:active,
- ul.z-listing li .z-listing-details a:active {
- color: linkColor;
- background-color: transparent;
- }
-
- ul.z-listing li span {
- border: 0;
- border-bottom: 1px dotted discreetColor;
- }
-
- ul.z-listing li .z-listing-details span a {
- border-bottom: 0px;
- }
-
- ul.z-listing li label {
- font-weight: bold;
- border-bottom: borderWidth dotted discreetColor;
- }
-
- ul.z-listing li {
- border: 1px solid transparent;
- }
-
- ul.z-listing li .z-listing-details div {
- color: discreetColor;
- font-size: fontSmallSize;
- }
-
- ul.z-listing li ul.z-listing {
- margin-left: 1.5em;
- font-size: 110%;
- }
-
- ul.z-listing li .z-listing-details div span {
- color: discreetColor;
- font-size: fontSmallSize;
- border: 0;
- }
-
- table.z-listing {
- border-collapse: collapse;
- border-left: borderWidth borderStyle globalBorderColor;
- border-bottom: borderWidth borderStyle globalBorderColor;
- }
-
- table.z-listing tr {
- vertical-align: middle;
- }
-
- table.z-listing th {
- background: globalBackgroundColor;
- border-top: borderWidth borderStyle globalBorderColor;
- border-bottom: borderWidth borderStyle globalBorderColor;
- border-right: borderWidth borderStyle globalBorderColor;
- font-weight: normal;
- padding: 0.25em 1em;
- text-transform: textTransform;
- text-align: center;
- }
-
- table.z-listing .top {
- border-left: borderWidth borderStyle backgroundColor;
- border-top: borderWidth borderStyle backgroundColor ! important;
- border-right: borderWidth borderStyle backgroundColor ! important;
- text-align: right ! important;
- padding: 0em 0em 1em 0em;
- }
-
- table.z-listing td {
- border-right: borderWidth borderStyle globalBorderColor;
- padding: 0.25em 1em;
- }
-
- table.z-listing a {
- text-decoration: none;
- }
-
- table.z-listing a:hover {
- text-decoration: underline;
- }
-
- table.z-listing img {
- vertical-align: middle;
- }
-
- .z-level1 {
- padding-left: 0.8em;
- }
-
- .z-level2 {
- padding-left: 1.6em;
- }
-
- .z-level3 {
- padding-left: 2.4em;
- }
-
- .z-level4 {
- padding-left: 3.2em;
- }
-
- .even {
- background-color: evenRowBackgroundColor;
- }
-
- .odd {
- background-color: oddRowBackgroundColor;
- }
-
- .visualHighlight {
- background-color: evenRowBackgroundColor;
- }
-
- .discreet {
- color: discreetColor;
- font-size: fontSmallSize;
- font-weight: normal;
- }
-
- .discreet a {
- color: discreetColor;
- text-decoration: underline;
- }
-
- .discreet a:hover {
- text-decoration: none;
- }
-
- .visualClear {
- display: block;
- clear: both;
- }
-
- .hiddenStructure {
- display: block;
- background: transparent;
- background-image: none; /* safari bug */
- border: none;
- height: 1px;
- overflow: hidden;
- padding: 0;
- margin: -1px 0 0 -1px;
- width: 1px;
- }
-
- .hiddenLabel {
- display: block;
- background: transparent;
- background-image: none; /* safari bug */
- border: none;
- height: 1px;
- overflow: hidden;
- padding: 0;
- margin: -1px 0 0 -1px;
- width: 1px;
- }
-
- .wide {
- width: 100%;
- }
-
- .nowrap {
- white-space: nowrap;
- }
-
- .strong {
- font-weight: bold;
- }
-
- .small {
- font-size: fontSmallSize;
- }
-
- td.error {
- width: auto !important;
- }
-
- .center {
- text-align: center;
- }
-
- .warning {
- color: notifyBorderColor;
- font-weight: bold;
- }
-
- .spacer {
- padding-top: 1.5em;
- padding-bottom: 1.5em;
- }
-
- .u {
- border-bottom: borderWidth borderStyle globalBorderColor;
- }
-
-}
-
- at media print {
- .z-page-description,
- .pageDescription {
- font-weight: normal;
- }
-}
Copied: z3ext.layout/tags/1.5.8/src/z3ext/layout/styles.css (from rev 93263, z3ext.layout/trunk/src/z3ext/layout/styles.css)
===================================================================
--- z3ext.layout/tags/1.5.8/src/z3ext/layout/styles.css (rev 0)
+++ z3ext.layout/tags/1.5.8/src/z3ext/layout/styles.css 2008-11-23 17:23:59 UTC (rev 93282)
@@ -0,0 +1,318 @@
+/* zrt-cssregistry: */
+
+ at media all {
+
+ .z-page, .page {
+ padding: 1.5em;
+ border: borderWidth borderStyle globalBorderColor;
+ background-color: globalBackgroundColor;
+ font-size: 100%;
+ }
+
+ .z-page h1 {
+ padding-top: 0;
+ }
+
+ .z-page h4 {
+ border-bottom: borderWidth borderStyle globalBorderColor;
+ }
+
+ .z-page legend {
+ background-color: transparent;
+ }
+
+ .z-page-description,
+ .pageDescription {
+ color: discreetColor;
+ font-size: fontSmallSize;
+ font-weight: normal;
+ margin-bottom: 1.5em;
+ }
+
+ .z-frame, .z-topframe,
+ .frame, .topframe {
+ padding: 1em;
+ margin-top: 1em;
+ background: contentBackgroundColor;
+ border: borderWidth borderStyle globalExtraBorderColor;
+ }
+
+ .z-topframe, .topframe {
+ margin-top: 0em;
+ }
+
+ .z-frame h4 {
+ border-bottom: borderWidth borderStyle globalExtraBorderColor;
+ font-weight: normal;
+ }
+
+ #z-portal {
+ background-color: contentBackgroundColor;
+ }
+
+ #z-portal-workspace {
+ margin: 2em 1.5em 1.5em 1.5em;
+ }
+
+ #z-portal-workspace {
+ font-size: 110%;
+ background: contentBackgroundColor;
+ }
+
+ #z-portal-workspace h1 {
+ font-size: 120%;
+ font-weight: bold;
+ }
+
+ #z-portal-workspace h2 {
+ font-size: 110%;
+ }
+
+ #z-portal-workspace h3 {
+ font-size: 100%;
+ }
+
+ #z-portal-workspace h5,
+ #z-portal-workspace h6 {
+ color: discreetColor;
+ }
+
+ ul.z-listing {
+ margin: 0.5em 0;
+ list-style: none;
+ list-style-image: none;
+ list-style-type: none;
+ }
+
+ ul.z-listing li {
+ clear: both;
+ margin-bottom: 0.5em;
+ list-style: none;
+ list-style-image: none;
+ }
+
+ ul.z-listing li .z-listing-icon {
+ float: left;
+ padding-top: 8px;
+ padding-right: 0.5em;
+ height: 1.5em;
+ }
+
+ ul.z-listing li a,
+ ul.z-listing li .z-listing-details a {
+ color: linkColor;
+ border: 0;
+ border-bottom: 1px dotted discreetColor;
+ text-decoration: none;
+ }
+
+ ul.z-listing li a:visited,
+ ul.z-listing li .z-listing-details a:visited {
+ color: linkColor;
+ background-color: transparent;
+ }
+
+ ul.z-listing li a:active,
+ ul.z-listing li .z-listing-details a:active {
+ color: linkColor;
+ background-color: transparent;
+ }
+
+ ul.z-listing li span {
+ border: 0;
+ border-bottom: 1px dotted discreetColor;
+ }
+
+ ul.z-listing li .z-listing-details span a {
+ border-bottom: 0px;
+ }
+
+ ul.z-listing li label {
+ font-weight: bold;
+ border-bottom: borderWidth dotted discreetColor;
+ }
+
+ ul.z-listing li {
+ border: 1px solid transparent;
+ }
+
+ ul.z-listing li .z-listing-details div {
+ color: discreetColor;
+ font-size: fontSmallSize;
+ }
+
+ ul.z-listing li ul.z-listing {
+ margin-left: 1.5em;
+ font-size: 110%;
+ }
+
+ ul.z-listing li .z-listing-details div span {
+ color: discreetColor;
+ font-size: fontSmallSize;
+ border: 0;
+ }
+
+ table.z-listing {
+ border-collapse: collapse;
+ border-left: borderWidth borderStyle globalBorderColor;
+ border-bottom: borderWidth borderStyle globalBorderColor;
+ }
+
+ table.z-listing tr {
+ vertical-align: middle;
+ }
+
+ table.z-listing th {
+ background: globalBackgroundColor;
+ border-top: borderWidth borderStyle globalBorderColor;
+ border-bottom: borderWidth borderStyle globalBorderColor;
+ border-right: borderWidth borderStyle globalBorderColor;
+ font-weight: normal;
+ padding: 0.25em 1em;
+ text-transform: textTransform;
+ text-align: center;
+ }
+
+ table.z-listing .top {
+ border-left: borderWidth borderStyle backgroundColor;
+ border-top: borderWidth borderStyle backgroundColor ! important;
+ border-right: borderWidth borderStyle backgroundColor ! important;
+ text-align: right ! important;
+ padding: 0em 0em 1em 0em;
+ }
+
+ table.z-listing td {
+ border-right: borderWidth borderStyle globalBorderColor;
+ padding: 0.25em 1em;
+ }
+
+ table.z-listing a {
+ text-decoration: none;
+ }
+
+ table.z-listing a:hover {
+ text-decoration: underline;
+ }
+
+ table.z-listing img {
+ vertical-align: middle;
+ }
+
+ .z-level1 {
+ padding-left: 0.8em;
+ }
+
+ .z-level2 {
+ padding-left: 1.6em;
+ }
+
+ .z-level3 {
+ padding-left: 2.4em;
+ }
+
+ .z-level4 {
+ padding-left: 3.2em;
+ }
+
+ .even {
+ background-color: evenRowBackgroundColor;
+ }
+
+ .odd {
+ background-color: oddRowBackgroundColor;
+ }
+
+ .visualHighlight {
+ background-color: evenRowBackgroundColor;
+ }
+
+ .discreet {
+ color: discreetColor;
+ font-size: fontSmallSize;
+ font-weight: normal;
+ }
+
+ .discreet a {
+ color: discreetColor;
+ text-decoration: underline;
+ }
+
+ .discreet a:hover {
+ text-decoration: none;
+ }
+
+ .visualClear {
+ display: block;
+ clear: both;
+ }
+
+ .hiddenStructure {
+ display: block;
+ background: transparent;
+ background-image: none; /* safari bug */
+ border: none;
+ height: 1px;
+ overflow: hidden;
+ padding: 0;
+ margin: -1px 0 0 -1px;
+ width: 1px;
+ }
+
+ .hiddenLabel {
+ display: block;
+ background: transparent;
+ background-image: none; /* safari bug */
+ border: none;
+ height: 1px;
+ overflow: hidden;
+ padding: 0;
+ margin: -1px 0 0 -1px;
+ width: 1px;
+ }
+
+ .wide {
+ width: 100%;
+ }
+
+ .nowrap {
+ white-space: nowrap;
+ }
+
+ .strong {
+ font-weight: bold;
+ }
+
+ .small {
+ font-size: fontSmallSize;
+ }
+
+ td.error {
+ width: auto !important;
+ }
+
+ .center {
+ text-align: center;
+ }
+
+ .warning {
+ color: notifyBorderColor;
+ font-weight: bold;
+ }
+
+ .spacer {
+ padding-top: 1.5em;
+ padding-bottom: 1.5em;
+ }
+
+ .u {
+ border-bottom: borderWidth borderStyle globalBorderColor;
+ }
+
+}
+
+ at media print {
+ .z-page-description,
+ .pageDescription {
+ font-weight: normal;
+ }
+}
Copied: z3ext.layout/tags/1.5.8/tests.cfg (from rev 93271, z3ext.layout/trunk/tests.cfg)
===================================================================
--- z3ext.layout/tags/1.5.8/tests.cfg (rev 0)
+++ z3ext.layout/tags/1.5.8/tests.cfg 2008-11-23 17:23:59 UTC (rev 93282)
@@ -0,0 +1,14 @@
+[test]
+recipe = zc.recipe.testrunner
+eggs = z3ext.layout [test]
+
+[coverage-test]
+recipe = zc.recipe.testrunner
+eggs = z3ext.layout [test]
+defaults = ['--coverage', '../../coverage']
+
+[coverage-report]
+recipe = zc.recipe.egg
+eggs = z3c.coverage
+scripts = coverage=coverage-report
+arguments = ('coverage', 'coverage/report')
More information about the Checkins
mailing list