适配器
默认显示名称生成器
默认显示名称生成器简单地取一个Dublin Core标题或一个__name__并返回它,如果需要则截断。它使用一个辅助函数,convertName,旨在使编写其他显示名称生成器更容易。
目前还没有提供使用HTML的IBrowserDisplayNameGenerator接口的帮助。
给定一个可以被适配到zope.dublincore.interfaces.IDCDescriptiveProperties的ILocation,并且实际上具有该值,它返回DC标题;否则,它使用__name__。
>>> import zope.dublincore.interfaces
>>> import zope.location.interfaces
>>> from zc.displayname import interfaces, adapters
>>> from zope.interface import verify
>>> from zope import interface
>>> class Dummy(object):
... interface.implements(zope.location.interfaces.ILocation)
... def __init__(self, parent, name):
... self.__parent__ = parent
... self.__name__ = name
...
>>> d = Dummy('parent', 'a name')
>>> from zope.publisher.browser import TestRequest
>>> g = adapters.DefaultDisplayNameGenerator(d, TestRequest())
>>> verify.verifyObject(interfaces.IDisplayNameGenerator, g)
True
>>> g()
'a name'
>>> g('foo')
Traceback (most recent call last):
...
TypeError: ('maxlength must be int', 'foo')
>>> g(-1)
Traceback (most recent call last):
...
ValueError: ('maxlength must be 0 or greater', -1)
>>> g(4)
'a...'
>>> g(6)
'a name'
>>> g(2)
'??'
>>> interface.directlyProvides(
... d, zope.dublincore.interfaces.IDCDescriptiveProperties)
>>> d.title = 'My Special Dummy'
>>> d.description = 'My interface said I had to have this'
>>> verify.verifyObject(
... zope.dublincore.interfaces.IDCDescriptiveProperties, d)
True
>>> g()
'My Special Dummy'
>>> g(0)
''
>>> g(100)
'My Special Dummy'
>>> g(16)
'My Special Dummy'
>>> g(15)
'My Special D...'
面包屑
zc.displayname还提供了一个接口和一些基本的适配器,提供了面包屑功能。这种面包屑功能在两个方面与标准Zope 3面包屑不同:面包屑没有连接到IAbsoluteURL接口,面包屑利用了显示名称生成器。
要使用面包屑,注册适当的适配器,并获取具有IAbsoluteURL作为根节点的层次结构中的ILocation的面包屑。
>>> from zope.traversing.interfaces import IContainmentRoot
>>> class DummyContainmentRoot(object):
... zope.interface.implements(IContainmentRoot)
...
>>> root = DummyContainmentRoot()
>>> child = Dummy(root, 'foo')
>>> grandchild = Dummy(child, 'bar baz bing')
>>> d.__parent__ = grandchild
>>> from zope import component
>>> component.provideAdapter(adapters.Breadcrumbs)
>>> component.provideAdapter(adapters.TerminalBreadcrumbs)
>>> component.provideAdapter(adapters.DefaultDisplayNameGenerator)
>>> component.provideAdapter(adapters.SiteDisplayNameGenerator)
>>> from zope.publisher.interfaces.http import IHTTPRequest
>>> from zope.traversing.browser.interfaces import IAbsoluteURL
>>> from zope.traversing import browser
>>> component.provideAdapter(
... browser.AbsoluteURL, adapts=(None, IHTTPRequest),
... provides=IAbsoluteURL)
>>> component.provideAdapter(
... browser.SiteAbsoluteURL, adapts=(IContainmentRoot, IHTTPRequest),
... provides=IAbsoluteURL)
>>> component.provideAdapter(
... browser.AbsoluteURL, adapts=(None, IHTTPRequest),
... provides=interface.Interface, name='absolute_url')
>>> component.provideAdapter(
... browser.SiteAbsoluteURL, adapts=(IContainmentRoot, IHTTPRequest),
... provides=interface.Interface, name='absolute_url')
>>> from zope.publisher.browser import TestRequest
>>> request = TestRequest()
>>> bc = component.getMultiAdapter((d, request), interfaces.IBreadcrumbs)
>>> import pprint
>>> pprint.pprint(bc()) # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE
({'name': u'[root]',
'name_gen': <...SiteDisplayNameGenerator...>,
'object': <DummyContainmentRoot...>,
'url': 'http://127.0.0.1'},
{'name': 'foo',
'name_gen': <...DefaultDisplayNameGenerator...>,
'object': <Dummy...
'url': 'http://127.0.0.1/foo'},
{'name': 'bar baz bing',
'name_gen': <...DefaultDisplayNameGenerator...>,
'object': <Dummy...>,
'url': 'http://127.0.0.1/foo/bar%20baz%20bing'},
{'name': 'My Special Dummy',
'name_gen': <...DefaultDisplayNameGenerator...>,
'object': <Dummy...>,
'url': 'http://127.0.0.1/foo/bar%20baz%20bing/a%20name'})
>>> pprint.pprint(bc(6)) # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE
({'name': u'[root]',
'name_gen': <...SiteDisplayNameGenerator...>,
'object': <DummyContainmentRoot...>,
'url': 'http://127.0.0.1'},
{'name': 'foo',
'name_gen': <...DefaultDisplayNameGenerator...>,
'object': <Dummy...
'url': 'http://127.0.0.1/foo'},
{'name': 'bar...',
'name_gen': <...DefaultDisplayNameGenerator...>,
'object': <Dummy...>,
'url': 'http://127.0.0.1/foo/bar%20baz%20bing'},
{'name': 'My ...',
'name_gen': <...DefaultDisplayNameGenerator...>,
'object': <Dummy...>,
'url': 'http://127.0.0.1/foo/bar%20baz%20bing/a%20name'})
该包还提供了一个隐藏的面包屑实现。这使涉及位于遍历路径中的对象但不需要面包屑的使用案例成为可能。对于某些站点,IAbsoluteURL就是这样一种对象。以下是一个隐藏IAbsoluteURL从面包屑的示例。
>>> import zope.app.container.interfaces
>>> component.provideAdapter(
... adapters.HiddenBreadcrumbs,
... adapts=(zope.app.container.interfaces.IAdding, IHTTPRequest))
>>> from zope.app.container.browser.adding import Adding
>>> adding = Adding(d, request)
>>> bc = component.getMultiAdapter(
... (adding, request), interfaces.IBreadcrumbs)
>>> pprint.pprint(bc()) # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE
({'name': u'[root]',
'name_gen': <...SiteDisplayNameGenerator...>,
'object': <DummyContainmentRoot...>,
'url': 'http://127.0.0.1'},
{'name': 'foo',
'name_gen': <...DefaultDisplayNameGenerator...>,
'object': <Dummy...
'url': 'http://127.0.0.1/foo'},
{'name': 'bar baz bing',
'name_gen': <...DefaultDisplayNameGenerator...>,
'object': <Dummy...>,
'url': 'http://127.0.0.1/foo/bar%20baz%20bing'},
{'name': 'My Special Dummy',
'name_gen': <...DefaultDisplayNameGenerator...>,
'object': <Dummy...>,
'url': 'http://127.0.0.1/foo/bar%20baz%20bing/a%20name'})
为了方便在页面模板中使用,适配器模块还提供了两种视图,可以直接用于获取面包屑。它们简单地对适配器进行调用,要么不带参数,要么带有20个字符的最大长度参数。为您的应用程序的面包屑视图注册其中一个,或者另一个具有相似模式的视图。
>>> pprint.pprint(adapters.breadcrumbs(adding, request))
... # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE
({'name': u'[root]',
'name_gen': <...SiteDisplayNameGenerator...>,
'object': <DummyContainmentRoot...>,
'url': 'http://127.0.0.1'},
{'name': 'foo',
'name_gen': <...DefaultDisplayNameGenerator...>,
'object': <Dummy...
'url': 'http://127.0.0.1/foo'},
{'name': 'bar baz bing',
'name_gen': <...DefaultDisplayNameGenerator...>,
'object': <Dummy...>,
'url': 'http://127.0.0.1/foo/bar%20baz%20bing'},
{'name': 'My Special Dummy',
'name_gen': <...DefaultDisplayNameGenerator...>,
'object': <Dummy...>,
'url': 'http://127.0.0.1/foo/bar%20baz%20bing/a%20name'})
>>> d.title = "My Special Dummy With a Really Long Title"
>>> pprint.pprint(adapters.breadcrumbs20char(adding, request))
... # doctest: +ELLIPSIS +NORMALIZE_WHITESPACE
({'name': u'[root]',
'name_gen': <...SiteDisplayNameGenerator...>,
'object': <DummyContainmentRoot...>,
'url': 'http://127.0.0.1'},
{'name': 'foo',
'name_gen': <...DefaultDisplayNameGenerator...>,
'object': <Dummy...
'url': 'http://127.0.0.1/foo'},
{'name': 'bar baz bing',
'name_gen': <...DefaultDisplayNameGenerator...>,
'object': <Dummy...>,
'url': 'http://127.0.0.1/foo/bar%20baz%20bing'},
{'name': 'My Special Dummy ...',
'name_gen': <...DefaultDisplayNameGenerator...>,
'object': <Dummy...>,
'url': 'http://127.0.0.1/foo/bar%20baz%20bing/a%20name'})