diff options
author | Mark McClain <mark.mcclain@shootq.com> | 2011-01-04 10:51:37 -0500 |
---|---|---|
committer | Mark McClain <mark.mcclain@shootq.com> | 2011-01-04 10:51:37 -0500 |
commit | 618cbb6e3e36b655429f72803d9b20e9e38dcfb2 (patch) | |
tree | 95d3c9bb73498e1f12cefd765c0426357707cacc | |
parent | aa5fe04500eaec0d3c4bfb4bdfc5f78e29124189 (diff) | |
download | pecan-618cbb6e3e36b655429f72803d9b20e9e38dcfb2.tar.gz |
adding global context and easier customer renderers + refactor of code
-rw-r--r-- | pecan/pecan.py | 9 | ||||
-rw-r--r-- | pecan/templating.py | 92 |
2 files changed, 68 insertions, 33 deletions
diff --git a/pecan/pecan.py b/pecan/pecan.py index c798810..c2f20b6 100644 --- a/pecan/pecan.py +++ b/pecan/pecan.py @@ -1,6 +1,6 @@ from configuration import _runtime_conf from monitor import MonitorableProcess -from templating import renderers +from templating import RendererFactory from routing import lookup_controller from webob import Request, Response, exc @@ -62,13 +62,14 @@ def error_for(field): class Pecan(MonitorableProcess): def __init__(self, root, - renderers = renderers, default_renderer = 'kajiki', template_path = 'templates', - hooks = []): + hooks = [], + custom_renderers = {}, + ): self.root = root - self.renderers = renderers + self.renderers = RendererFactory(custom_renderers) self.default_renderer = default_renderer self.hooks = hooks self.template_path = template_path diff --git a/pecan/templating.py b/pecan/templating.py index 2d685c0..4e35a9a 100644 --- a/pecan/templating.py +++ b/pecan/templating.py @@ -1,26 +1,5 @@ __all__ = ['renderers'] -_renderers = {} - -class RendererFactory(object): - def create(self, name, template_path): - if name == 'genshi': - return GenshiRenderer(template_path) - elif name == 'kajiki': - return KajikiRenderer(template_path) - elif name == 'mako': - return MakoRenderer(template_path) - elif name == 'json': - return JsonRenderer(template_path) - - def get(self, name, template_path): - key = name+template_path - if key not in _renderers: - _renderers[key] = self.create(name, template_path) - return _renderers[key] - -renderers = RendererFactory() - # # JSON rendering engine @@ -29,7 +8,7 @@ renderers = RendererFactory() class JsonRenderer(object): content_type = 'application/json' - def __init__(self, path): + def __init__(self, path, context): pass def render(self, template_path, namespace): @@ -44,13 +23,14 @@ class JsonRenderer(object): class GenshiRenderer(object): content_type = 'text/html' - def __init__(self, path): + def __init__(self, path, context): from genshi.template import TemplateLoader self.loader = TemplateLoader([path], auto_reload=True) + self.context = context def render(self, template_path, namespace): tmpl = self.loader.load(template_path) - stream = tmpl.generate(**namespace) + stream = tmpl.generate(**self.context.make_ns(namespace)) return stream.render('html') @@ -61,13 +41,14 @@ class GenshiRenderer(object): class MakoRenderer(object): content_type = 'text/html' - def __init__(self, path): + def __init__(self, path, context): from mako.lookup import TemplateLookup self.loader = TemplateLookup(directories=[path]) + self.context = context def render(self, template_path, namespace): tmpl = self.loader.get_template(template_path) - return tmpl.render(**namespace) + return tmpl.render(**self.context.make_ns(namespace)) # @@ -77,11 +58,64 @@ class MakoRenderer(object): class KajikiRenderer(object): content_type = 'text/html' - def __init__(self, path): + def __init__(self, path, context): from kajiki.loader import FileLoader self.loader = FileLoader(path, reload=True) + self.context = context def render(self, template_path, namespace): Template = self.loader.import_(template_path) - stream = Template(namespace) - return stream.render()
\ No newline at end of file + stream = Template(self.context.make_ns(namespace)) + return stream.render() + +# +# Rendering Context +# +class RenderingContext(object): + def __init__(self, globals={}): + self.namespace = dict(globals) + + def update(self, d): + self.namespace.update(d) + + def make_ns(self, ns): + if self.namespace: + retval = {} + retval.update(self.namespace) + retval.update(ns) + return retval + else: + return ns + +# +# Rendering Factory +# +class RendererFactory(object): + def __init__(self, custom_renderers={}, extra_namespace={}): + self._renderers = {} + self._renderer_classes = { + 'genshi': GenshiRenderer, + 'kajiki': KajikiRenderer, + 'mako' : MakoRenderer, + 'json' : JsonRenderer + } + + self.add_renderers(custom_renderers) + self.context = RenderingContext(extra_namespace) + + def add_renderers(self, custom_dict): + self._renderer_classes.update(custom_dict) + + def create(self, name, template_path): + cls = self._renderer_classes.get(name) + + if cls is None: + return None + else: + return cls(template_path, self.context) + + def get(self, name, template_path): + key = name+template_path + if key not in self._renderers: + self._renderers[key] = self.create(name, template_path) + return self._renderers[key] |