[Zope3-checkins] SVN: Zope3/trunk/ Added breadcrumbs to all types
of objects visible through the code documentation browser.
Shane Hathaway
shane at hathawaymix.org
Fri Nov 10 18:58:56 EST 2006
Log message for revision 71107:
Added breadcrumbs to all types of objects visible through the code documentation browser.
Changed:
U Zope3/trunk/doc/CHANGES.txt
U Zope3/trunk/src/zope/app/apidoc/browser/apidoc.css
U Zope3/trunk/src/zope/app/apidoc/browser/details_macros.pt
U Zope3/trunk/src/zope/app/apidoc/codemodule/README.txt
U Zope3/trunk/src/zope/app/apidoc/codemodule/browser/README.txt
U Zope3/trunk/src/zope/app/apidoc/codemodule/browser/class_index.pt
U Zope3/trunk/src/zope/app/apidoc/codemodule/browser/configure.zcml
U Zope3/trunk/src/zope/app/apidoc/codemodule/browser/function_index.pt
U Zope3/trunk/src/zope/app/apidoc/codemodule/browser/module.py
U Zope3/trunk/src/zope/app/apidoc/codemodule/browser/module_index.pt
U Zope3/trunk/src/zope/app/apidoc/codemodule/browser/textfile_index.pt
A Zope3/trunk/src/zope/app/apidoc/codemodule/browser/utilities.py
U Zope3/trunk/src/zope/app/apidoc/codemodule/browser/zcmlfile_index.pt
U Zope3/trunk/src/zope/app/apidoc/codemodule/codemodule.py
U Zope3/trunk/src/zope/app/apidoc/codemodule/interfaces.py
U Zope3/trunk/src/zope/app/apidoc/codemodule/module.py
U Zope3/trunk/src/zope/app/apidoc/codemodule/zcml.py
U Zope3/trunk/src/zope/app/apidoc/ifacemodule/browser.py
U Zope3/trunk/src/zope/app/apidoc/ifacemodule/configure.zcml
U Zope3/trunk/src/zope/app/apidoc/ifacemodule/index.pt
-=-
Modified: Zope3/trunk/doc/CHANGES.txt
===================================================================
--- Zope3/trunk/doc/CHANGES.txt 2006-11-10 22:36:20 UTC (rev 71106)
+++ Zope3/trunk/doc/CHANGES.txt 2006-11-10 23:58:55 UTC (rev 71107)
@@ -10,6 +10,9 @@
New features
+ - Added breadcrumbs to all types of objects visible through the
+ code documentation browser.
+
- Added ISkinChangedEvent to applySkin() function. This event is
triggered whenever the skin of a request is changed.
Modified: Zope3/trunk/src/zope/app/apidoc/browser/apidoc.css
===================================================================
--- Zope3/trunk/src/zope/app/apidoc/browser/apidoc.css 2006-11-10 22:36:20 UTC (rev 71106)
+++ Zope3/trunk/src/zope/app/apidoc/browser/apidoc.css 2006-11-10 23:58:55 UTC (rev 71107)
@@ -60,13 +60,18 @@
h1.details-header {
font-size: 220%;
font-weight: normal;
- margin-top: 0;
+ margin-top: 0px;
}
+h1.details-header span.pre-header {
+ font-size: 60%;
+ font-weight: normal;
+}
+
div.details-subheader {
font-size: 125%;
font-weight: normal;
- margin-top: 0;
+ margin-top: 0px;
}
h2.details-section {
Modified: Zope3/trunk/src/zope/app/apidoc/browser/details_macros.pt
===================================================================
--- Zope3/trunk/src/zope/app/apidoc/browser/details_macros.pt 2006-11-10 22:36:20 UTC (rev 71106)
+++ Zope3/trunk/src/zope/app/apidoc/browser/details_macros.pt 2006-11-10 23:58:55 UTC (rev 71107)
@@ -69,3 +69,19 @@
</div>
</metal:block>
+
+
+<metal:block define-macro="breadcrumbs">
+
+ <p class="breadcrumbs">
+ <tal:block repeat="entry context/@@code_breadcrumbs">
+ <a href=""
+ tal:attributes="href string:${entry/url}/index.html"
+ tal:content="entry/name"
+ i18n:translate=""
+ tal:omit-tag="repeat/entry/end" />
+ <span tal:omit-tag="" tal:condition="not: repeat/entry/end">/</span>
+ </tal:block>
+ </p>
+
+</metal:block>
Modified: Zope3/trunk/src/zope/app/apidoc/codemodule/README.txt
===================================================================
--- Zope3/trunk/src/zope/app/apidoc/codemodule/README.txt 2006-11-10 22:36:20 UTC (rev 71106)
+++ Zope3/trunk/src/zope/app/apidoc/codemodule/README.txt 2006-11-10 23:58:55 UTC (rev 71107)
@@ -23,6 +23,8 @@
''
>>> cm.getPath()
''
+ >>> cm.isPackage()
+ True
>>> cm.keys()
[]
@@ -51,6 +53,12 @@
>>> module.getPath()
'zope.app.apidoc'
+ >>> module.isPackage()
+ True
+ >>> m2 = codemodule.module.Module(
+ ... None, 'apidoc', zope.app.apidoc.apidoc)
+ >>> m2.isPackage()
+ False
The setup for creating the sub module and class tree is automatically
called during initialization, so that the sub-objects are available as
@@ -276,7 +284,7 @@
>>> module = codemodule.module.Module(None, 'zope.app.apidoc.codemodule',
... zope.app.apidoc.codemodule)
- >>> zcml = codemodule.zcml.ZCMLFile(path, module)
+ >>> zcml = codemodule.zcml.ZCMLFile(path, module, module, 'configure.zcml')
The interesting attribute of the object is the `rootElement`, since it
contains the root XML element and thus the entire XML tree. The `rootElement`
Modified: Zope3/trunk/src/zope/app/apidoc/codemodule/browser/README.txt
===================================================================
--- Zope3/trunk/src/zope/app/apidoc/codemodule/browser/README.txt 2006-11-10 22:36:20 UTC (rev 71106)
+++ Zope3/trunk/src/zope/app/apidoc/codemodule/browser/README.txt 2006-11-10 23:58:55 UTC (rev 71107)
@@ -63,7 +63,11 @@
We cannot reuse the the system's bread crumbs, since they go all the
way up to the root, but we just want to go to the root module.
- >>> pprint(details.getBreadCrumbs())
+ >>> from zope.app.apidoc.codemodule.browser import utilities
+ >>> bc = utilities.CodeBreadCrumbs()
+ >>> bc.context = details.context
+ >>> bc.request = details.request
+ >>> pprint(bc())
[{'name': u'[top]',
'url': 'http://127.0.0.1'},
{'name': u'zope',
Modified: Zope3/trunk/src/zope/app/apidoc/codemodule/browser/class_index.pt
===================================================================
--- Zope3/trunk/src/zope/app/apidoc/codemodule/browser/class_index.pt 2006-11-10 22:36:20 UTC (rev 71106)
+++ Zope3/trunk/src/zope/app/apidoc/codemodule/browser/class_index.pt 2006-11-10 23:58:55 UTC (rev 71107)
@@ -2,11 +2,13 @@
i18n:domain="zope">
<body metal:fill-slot="contents">
- <h1 class="details-header"
- tal:content="context/getPath">
- zope.app.Klass
+ <h1 class="details-header">
+ <span class="pre-header">Class</span><br />
+ <span tal:replace="context/getPath">zope.app.Klass</span>
</h1>
+ <p metal:use-macro="views/apidoc_macros/breadcrumbs" />
+
<div class="indent">
<div class="documentation" i18n:translate=""
tal:content="structure view/getDoc">
Modified: Zope3/trunk/src/zope/app/apidoc/codemodule/browser/configure.zcml
===================================================================
--- Zope3/trunk/src/zope/app/apidoc/codemodule/browser/configure.zcml 2006-11-10 22:36:20 UTC (rev 71106)
+++ Zope3/trunk/src/zope/app/apidoc/codemodule/browser/configure.zcml 2006-11-10 23:58:55 UTC (rev 71107)
@@ -2,6 +2,14 @@
xmlns="http://namespaces.zope.org/browser"
i18n_domain="zope">
+ <view
+ for="*"
+ permission="zope.View"
+ name="code_breadcrumbs"
+ class=".utilities.CodeBreadCrumbs"
+ allowed_attributes="__call__"
+ />
+
<page
for="..codemodule.CodeModule"
permission="zope.app.apidoc.UseAPIDoc"
Modified: Zope3/trunk/src/zope/app/apidoc/codemodule/browser/function_index.pt
===================================================================
--- Zope3/trunk/src/zope/app/apidoc/codemodule/browser/function_index.pt 2006-11-10 22:36:20 UTC (rev 71106)
+++ Zope3/trunk/src/zope/app/apidoc/codemodule/browser/function_index.pt 2006-11-10 23:58:55 UTC (rev 71107)
@@ -2,11 +2,13 @@
i18n:domain="zope">
<body metal:fill-slot="contents">
- <h1 class="details-header"
- tal:content="context/getPath">
- zope.app.function
+ <h1 class="details-header">
+ <span class="pre-header">Function</span><br />
+ <span tal:replace="context/getPath">zope.app.function</span>
</h1>
+ <p metal:use-macro="views/apidoc_macros/breadcrumbs" />
+
<h2 class="details-section" i18n:translate="">Signature</h2>
<div class="indent">
Modified: Zope3/trunk/src/zope/app/apidoc/codemodule/browser/module.py
===================================================================
--- Zope3/trunk/src/zope/app/apidoc/codemodule/browser/module.py 2006-11-10 22:36:20 UTC (rev 71106)
+++ Zope3/trunk/src/zope/app/apidoc/codemodule/browser/module.py 2006-11-10 23:58:55 UTC (rev 71107)
@@ -13,7 +13,7 @@
##############################################################################
"""Module Views
-$Id: browser.py 29143 2005-02-14 22:43:16Z srichter $
+$Id$
"""
__docformat__ = 'restructuredtext'
from zope.component import getMultiAdapter
@@ -21,7 +21,7 @@
from zope.proxy import removeAllProxies
from zope.publisher.browser import BrowserView
from zope.security.proxy import isinstance, removeSecurityProxy
-from zope.traversing.api import getName, getParent
+from zope.traversing.api import getParent
from zope.traversing.browser import absoluteURL
from zope.app.i18n import ZopeMessageFactory as _
@@ -80,26 +80,10 @@
entries = columnize(entries)
return entries
- def getBreadCrumbs(self):
- """Create breadcrumbs for the module path.
+ def getPath(self):
+ """Return the path to the module"""
+ return self.context.getPath()
- We cannot reuse the the system's bread crumbs, since they go all the
- way up to the root, but we just want to go to the root module."""
- names = self.context.getPath().split('.')
- crumbs = []
- module = self.context
- # I really need the class here, so remove the proxy.
- while removeSecurityProxy(module).__class__ is Module:
- crumbs.append(
- {'name': getName(module),
- 'url': absoluteURL(module, self.request)}
- )
- module = getParent(module)
-
- crumbs.append(
- {'name': _('[top]'),
- 'url': getMultiAdapter(
- (module, self.request), name='absolute_url')()} )
-
- crumbs.reverse()
- return crumbs
+ def isPackage(self):
+ """Return true if this module is a package"""
+ return self.context.isPackage()
Modified: Zope3/trunk/src/zope/app/apidoc/codemodule/browser/module_index.pt
===================================================================
--- Zope3/trunk/src/zope/app/apidoc/codemodule/browser/module_index.pt 2006-11-10 22:36:20 UTC (rev 71106)
+++ Zope3/trunk/src/zope/app/apidoc/codemodule/browser/module_index.pt 2006-11-10 23:58:55 UTC (rev 71107)
@@ -2,17 +2,30 @@
i18n:domain="zope">
<body metal:fill-slot="contents">
- <h1 class="details-header" i18n:translate="">Zope 3 Code Browser</h1>
+ <!-- Note: don't use path expressions of the form "context/*" in this
+ template, since module objects have items, and path expressions
+ prefer items over attributes. -->
- <p class="breadcrumbs">
- <span tal:repeat="entry view/getBreadCrumbs">
- <a href=""
- tal:attributes="href string:${entry/url}/index.html"
- tal:content="entry/name" i18n:translate=""/>
- <tal:omit-tag condition="not: repeat/entry/end">/</tal:omit-tag>
+ <h1 class="details-header">
+ <span tal:condition="view/getPath">
+ <span class="pre-header">
+ <span tal:condition="view/isPackage">
+ Package
+ </span>
+ <span tal:condition="not: view/isPackage">
+ Module
+ </span>
+ </span>
+ <br />
+ <span tal:replace="view/getPath">zope.app</span>
</span>
- </p>
+ <span tal:omit-tag="" tal:condition="not: view/getPath">
+ Zope 3 Code Browser
+ </span>
+ </h1>
+ <p metal:use-macro="views/apidoc_macros/breadcrumbs" />
+
<div class="highlight documentation"
tal:define="doc view/getDoc"
tal:condition="doc"
Modified: Zope3/trunk/src/zope/app/apidoc/codemodule/browser/textfile_index.pt
===================================================================
--- Zope3/trunk/src/zope/app/apidoc/codemodule/browser/textfile_index.pt 2006-11-10 22:36:20 UTC (rev 71106)
+++ Zope3/trunk/src/zope/app/apidoc/codemodule/browser/textfile_index.pt 2006-11-10 23:58:55 UTC (rev 71107)
@@ -7,6 +7,13 @@
<body metal:fill-slot="contents">
+ <h1 class="details-header">
+ <span class="pre-header">Text File</span><br />
+ <span tal:replace="context/zope:name">README.txt</span>
+ </h1>
+
+ <p metal:use-macro="views/apidoc_macros/breadcrumbs" />
+
<div class="documentation"
tal:content="structure view/renderedContent">
file content
Added: Zope3/trunk/src/zope/app/apidoc/codemodule/browser/utilities.py
===================================================================
--- Zope3/trunk/src/zope/app/apidoc/codemodule/browser/utilities.py 2006-11-10 22:36:20 UTC (rev 71106)
+++ Zope3/trunk/src/zope/app/apidoc/codemodule/browser/utilities.py 2006-11-10 23:58:55 UTC (rev 71107)
@@ -0,0 +1,49 @@
+##############################################################################
+#
+# Copyright (c) 2006 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.
+#
+##############################################################################
+"""Browser utilities for API documentation.
+
+$Id: utilities.py 70020 2006-09-07 09:08:16Z flox $
+"""
+__docformat__ = 'restructuredtext'
+
+from zope.traversing.api import getName, getParent
+from zope.traversing.browser import absoluteURL
+from zope.app.apidoc.interfaces import IDocumentationModule
+from zope.app.i18n import ZopeMessageFactory as _
+
+
+class CodeBreadCrumbs(object):
+ """View that provides breadcrumbs for code objects"""
+
+ def __call__(self):
+ """Create breadcrumbs for a module or an object in a module or package.
+
+ We cannot reuse the system's bread crumbs, since they go all the
+ way up to the root, but we just want to go to the root module.
+ """
+ obj = self.context
+ crumbs = []
+ while not IDocumentationModule.providedBy(obj):
+ crumbs.append(
+ {'name': getName(obj),
+ 'url': absoluteURL(obj, self.request)}
+ )
+ obj = getParent(obj)
+
+ crumbs.append(
+ {'name': _('[top]'),
+ 'url': absoluteURL(obj, self.request)}
+ )
+ crumbs.reverse()
+ return crumbs
Modified: Zope3/trunk/src/zope/app/apidoc/codemodule/browser/zcmlfile_index.pt
===================================================================
--- Zope3/trunk/src/zope/app/apidoc/codemodule/browser/zcmlfile_index.pt 2006-11-10 22:36:20 UTC (rev 71106)
+++ Zope3/trunk/src/zope/app/apidoc/codemodule/browser/zcmlfile_index.pt 2006-11-10 23:58:55 UTC (rev 71107)
@@ -1,7 +1,11 @@
-<html>
+<html metal:use-macro="views/apidoc_macros/details">
<head>
- <style type="text/css" media="all">
+ <base href=""
+ metal:fill-slot="headers"
+ tal:attributes="href request/URL/-1" />
+ <style metal:fill-slot="style_slot" type="text/css" media="all">
+
.directive {
font-family: monospace;
padding: 1px;
@@ -43,9 +47,18 @@
}
</style>
+
</head>
-<body>
+<body metal:fill-slot="contents">
+
+ <h1 class="details-header">
+ <span class="pre-header">ZCML File</span><br />
+ <span tal:replace="context/zope:name">configure.zcml</span>
+ </h1>
+
+ <p metal:use-macro="views/apidoc_macros/breadcrumbs" />
+
<div tal:replace="structure context/rootElement/@@display" />
</body>
Modified: Zope3/trunk/src/zope/app/apidoc/codemodule/codemodule.py
===================================================================
--- Zope3/trunk/src/zope/app/apidoc/codemodule/codemodule.py 2006-11-10 22:36:20 UTC (rev 71106)
+++ Zope3/trunk/src/zope/app/apidoc/codemodule/codemodule.py 2006-11-10 23:58:55 UTC (rev 71107)
@@ -16,7 +16,7 @@
This module is able to take a dotted name of any class and display
documentation for it.
-$Id: __init__.py 29269 2005-02-23 22:22:48Z srichter $
+$Id$
"""
__docformat__ = 'restructuredtext'
@@ -86,6 +86,10 @@
"""See Module class."""
return ''
+ def isPackage(self):
+ """See Module class."""
+ return True
+
def get(self, key, default=None):
"""See zope.app.container.interfaces.IReadContainer."""
self.setup()
Modified: Zope3/trunk/src/zope/app/apidoc/codemodule/interfaces.py
===================================================================
--- Zope3/trunk/src/zope/app/apidoc/codemodule/interfaces.py 2006-11-10 22:36:20 UTC (rev 71106)
+++ Zope3/trunk/src/zope/app/apidoc/codemodule/interfaces.py 2006-11-10 23:58:55 UTC (rev 71107)
@@ -45,7 +45,10 @@
def getPath():
"""Return the Python path of the module."""
+ def isPackage():
+ """Return true if this module is a Python package."""
+
class IClassDocumentation(zope.interface.Interface):
"""Representation of a class or type for documentation."""
Modified: Zope3/trunk/src/zope/app/apidoc/codemodule/module.py
===================================================================
--- Zope3/trunk/src/zope/app/apidoc/codemodule/module.py 2006-11-10 22:36:20 UTC (rev 71106)
+++ Zope3/trunk/src/zope/app/apidoc/codemodule/module.py 2006-11-10 23:58:55 UTC (rev 71107)
@@ -13,7 +13,7 @@
##############################################################################
"""Module representation for code browser
-$Id: __init__.py 29143 2005-02-14 22:43:16Z srichter $
+$Id$
"""
__docformat__ = 'restructuredtext'
import os
@@ -49,6 +49,7 @@
self.__name__ = name
self._module = module
self._children = {}
+ self._package = False
if setup:
self.__setup()
@@ -59,6 +60,7 @@
(self._module.__file__.endswith('__init__.py') or
self._module.__file__.endswith('__init__.pyc')or
self._module.__file__.endswith('__init__.pyo')):
+ self._package = True
for dir in self._module.__path__:
for file in os.listdir(dir):
if file in IGNORE_FILES or file in self._children:
@@ -123,6 +125,10 @@
"""See IModule."""
return self._module.__name__
+ def isPackage(self):
+ """See IModuleDocumentation."""
+ return self._package
+
def get(self, key, default=None):
"""See zope.app.container.interfaces.IReadContainer."""
obj = self._children.get(key, default)
Modified: Zope3/trunk/src/zope/app/apidoc/codemodule/zcml.py
===================================================================
--- Zope3/trunk/src/zope/app/apidoc/codemodule/zcml.py 2006-11-10 22:36:20 UTC (rev 71106)
+++ Zope3/trunk/src/zope/app/apidoc/codemodule/zcml.py 2006-11-10 23:58:55 UTC (rev 71107)
@@ -24,6 +24,7 @@
from zope.cachedescriptors.property import Lazy
from zope.configuration import xmlconfig, config
from zope.interface import implements, directlyProvides
+from zope.location.interfaces import ILocation
import zope.app.appsetup.appsetup
@@ -99,9 +100,9 @@
class ZCMLFile(object):
"""Representation of an entire ZCML file."""
- implements(IZCMLFile)
+ implements(ILocation, IZCMLFile)
- def __init__(self, filename, package, parent=None, name=None):
+ def __init__(self, filename, package, parent, name):
# Retrieve the directive registry
self.filename = filename
self.package = package
Modified: Zope3/trunk/src/zope/app/apidoc/ifacemodule/browser.py
===================================================================
--- Zope3/trunk/src/zope/app/apidoc/ifacemodule/browser.py 2006-11-10 22:36:20 UTC (rev 71106)
+++ Zope3/trunk/src/zope/app/apidoc/ifacemodule/browser.py 2006-11-10 23:58:55 UTC (rev 71107)
@@ -20,6 +20,7 @@
import inspect
+from zope.component import getUtility
from zope.publisher.interfaces.browser import IBrowserRequest
from zope.publisher.interfaces.xmlrpc import IXMLRPCRequest
from zope.publisher.interfaces.http import IHTTPRequest
@@ -27,7 +28,7 @@
from zope.publisher.browser import BrowserView
from zope.security.proxy import isinstance, removeSecurityProxy
from zope.proxy import removeAllProxies
-from zope.traversing.api import getName, getParent
+from zope.traversing.api import getName, getParent, traverse
from zope.traversing.browser import absoluteURL
from zope.app.i18n import ZopeMessageFactory as _
@@ -275,3 +276,37 @@
"ftp": _("FTP"),
"other": _("Other"),
}
+
+
+class InterfaceBreadCrumbs(object):
+ """View that provides breadcrumbs for interface objects"""
+
+ def __call__(self):
+ """Create breadcrumbs for an interface object.
+
+ The breadcrumbs are rooted at the code browser.
+ """
+ docroot = self.context
+ while not isinstance(docroot, APIDocumentation):
+ docroot = getParent(docroot)
+ codeModule = traverse(docroot, "Code")
+ crumbs = [{
+ 'name': _('[top]'),
+ 'url': absoluteURL(codeModule, self.request)
+ }]
+ # We need the __module__ of the interface, not of a location proxy,
+ # so we have to remove all proxies.
+ iface = removeAllProxies(self.context)
+ mod_names = iface.__module__.split('.')
+ obj = codeModule
+ for name in mod_names:
+ obj = traverse(obj, name)
+ crumbs.append({
+ 'name': name,
+ 'url': absoluteURL(obj, self.request)
+ })
+ crumbs.append({
+ 'name': iface.__name__,
+ 'url': absoluteURL(self.context, self.request)
+ })
+ return crumbs
Modified: Zope3/trunk/src/zope/app/apidoc/ifacemodule/configure.zcml
===================================================================
--- Zope3/trunk/src/zope/app/apidoc/ifacemodule/configure.zcml 2006-11-10 22:36:20 UTC (rev 71106)
+++ Zope3/trunk/src/zope/app/apidoc/ifacemodule/configure.zcml 2006-11-10 23:58:55 UTC (rev 71107)
@@ -16,6 +16,14 @@
<!-- Setup interface-related macros -->
+ <browser:view
+ for="zope.interface.interfaces.IInterface"
+ permission="zope.View"
+ name="code_breadcrumbs"
+ class=".browser.InterfaceBreadCrumbs"
+ allowed_attributes="__call__"
+ />
+
<browser:page
for="*"
name="interface_macros"
Modified: Zope3/trunk/src/zope/app/apidoc/ifacemodule/index.pt
===================================================================
--- Zope3/trunk/src/zope/app/apidoc/ifacemodule/index.pt 2006-11-10 22:36:20 UTC (rev 71106)
+++ Zope3/trunk/src/zope/app/apidoc/ifacemodule/index.pt 2006-11-10 23:58:55 UTC (rev 71107)
@@ -3,10 +3,13 @@
<body metal:fill-slot="contents"
tal:define="rootURL view/apidocRoot">
- <h1 class="details-header" tal:content="view/getId">
- zope.app.interfaces.IInterface
+ <h1 class="details-header">
+ <span class="pre-header">Interface</span><br />
+ <span tal:replace="view/getId">zope.app.interfaces.IInterface</span>
</h1>
+ <p metal:use-macro="views/apidoc_macros/breadcrumbs" />
+
<h3 tal:condition="view/getTypes">
Type:
<tal:omit-tag tal:repeat="type view/getTypes" >
More information about the Zope3-Checkins
mailing list