[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