summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMark McClain <mark.mcclain@shootq.com>2011-01-04 10:51:37 -0500
committerMark McClain <mark.mcclain@shootq.com>2011-01-04 10:51:37 -0500
commit618cbb6e3e36b655429f72803d9b20e9e38dcfb2 (patch)
tree95d3c9bb73498e1f12cefd765c0426357707cacc
parentaa5fe04500eaec0d3c4bfb4bdfc5f78e29124189 (diff)
downloadpecan-618cbb6e3e36b655429f72803d9b20e9e38dcfb2.tar.gz
adding global context and easier customer renderers + refactor of code
-rw-r--r--pecan/pecan.py9
-rw-r--r--pecan/templating.py92
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]