provide RendererFactory class that allows transparent dynamic retrieval of macros

git-svn-id: svn://svn.cy55.de/Zope3/src/cybertools/trunk@2905 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
helmutm 2008-09-24 11:35:10 +00:00
parent d44621628a
commit f58b622ddd
5 changed files with 60 additions and 11 deletions

46
browser/renderer.py Normal file
View file

@ -0,0 +1,46 @@
#
# Copyright (c) 2008 Helmut Merz helmutm@cy55.de
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
"""
Use ZPT macros as layout renderers.
$Id$
"""
class RendererFactory(object):
""" Provider for ZPT macros.
"""
def __init__(self, template):
self.template = template
def get(self, key, default=None):
return self.template.macros.get(key, default)
def __getitem__(self, key):
return self.template.macros[key]
def __getattr__(self, key):
""" Convenience method for retrieving callable renderer for layout.
"""
return lambda key=key: self[key]
def __repr__(self):
return ('<RendererFactory, template=%r, macros=%r>' %
(self.template, self.template.macros.keys()))

View file

@ -1 +1 @@
<metal:render use-macro="nocall:view/renderer" /> <metal:render use-macro="view/renderer" />

View file

@ -24,28 +24,29 @@ $Id$
from zope.app.pagetemplate import ViewPageTemplateFile from zope.app.pagetemplate import ViewPageTemplateFile
from cybertools.browser.renderer import RendererFactory
from cybertools.composer.layout.base import Layout from cybertools.composer.layout.base import Layout
from cybertools.composer.layout.browser.standard import standardRenderers from cybertools.composer.layout.browser.standard import standardRenderers
defaultRenderers = ViewPageTemplateFile('default.pt').macros defaultRenderers = RendererFactory(ViewPageTemplateFile('default.pt'))
page = Layout('page', 'page', renderer=standardRenderers['page'], page = Layout('page', 'page', renderer=standardRenderers['page'],
sublayouts=set(['css.liquid', 'body.liquid'])) sublayouts=set(['css.liquid', 'body.liquid']))
logo = Layout('logo.default', 'body.logo', renderer=defaultRenderers['logo']) logo = Layout('logo.default', 'body.logo', renderer=defaultRenderers.logo)
top_actions = Layout('top_actions.default', 'body.top_actions', top_actions = Layout('top_actions.default', 'body.top_actions',
renderer=defaultRenderers['top_actions']) renderer=defaultRenderers.top_actions)
column1 = Layout('column1.default', 'body.column1', column1 = Layout('column1.default', 'body.column1',
renderer=defaultRenderers['column1']) renderer=defaultRenderers.column1)
content = Layout('content.default', 'body.content', content = Layout('content.default', 'body.content',
renderer=defaultRenderers['content']) renderer=defaultRenderers.content)
column2 = Layout('column2.default', 'body.column2', column2 = Layout('column2.default', 'body.column2',
renderer=defaultRenderers['column2']) renderer=defaultRenderers.column2)
footer = Layout('footer.default', 'body.footer', renderer=defaultRenderers['footer']) footer = Layout('footer.default', 'body.footer', renderer=defaultRenderers.footer)

View file

@ -28,15 +28,16 @@ from zope import component
from zope.interface import implements from zope.interface import implements
from cybertools.browser.liquid import Liquid from cybertools.browser.liquid import Liquid
from cybertools.browser.renderer import RendererFactory
from cybertools.composer.layout.base import Layout from cybertools.composer.layout.base import Layout
from cybertools.composer.layout.browser.standard import standardRenderers from cybertools.composer.layout.browser.standard import standardRenderers
defaultRenderers = ViewPageTemplateFile('default.pt').macros defaultRenderers = RendererFactory(ViewPageTemplateFile('default.pt'))
css = Layout('css.liquid', 'page.css', renderer=standardRenderers['css'], css = Layout('css.liquid', 'page.css', renderer=standardRenderers['css'],
media='all', resource='liquid.css', skin=Liquid) media='all', resource='liquid.css', skin=Liquid)
body = Layout('body.liquid', 'page.body', renderer=defaultRenderers['body'], body = Layout('body.liquid', 'page.body', renderer=defaultRenderers.body,
skin=Liquid) skin=Liquid)

View file

@ -24,8 +24,9 @@ $Id$
from zope.app.pagetemplate import ViewPageTemplateFile from zope.app.pagetemplate import ViewPageTemplateFile
from cybertools.browser.renderer import RendererFactory
from cybertools.composer.layout.base import Layout from cybertools.composer.layout.base import Layout
standardRenderers = ViewPageTemplateFile('standard.pt').macros standardRenderers = RendererFactory(ViewPageTemplateFile('standard.pt'))