[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