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 cybertools.browser.renderer import RendererFactory
from cybertools.composer.layout.base import Layout
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'],
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',
renderer=defaultRenderers['top_actions'])
renderer=defaultRenderers.top_actions)
column1 = Layout('column1.default', 'body.column1',
renderer=defaultRenderers['column1'])
renderer=defaultRenderers.column1)
content = Layout('content.default', 'body.content',
renderer=defaultRenderers['content'])
renderer=defaultRenderers.content)
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 cybertools.browser.liquid import Liquid
from cybertools.browser.renderer import RendererFactory
from cybertools.composer.layout.base import Layout
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'],
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)

View file

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