Source code for bag.web.pyramid.kajiki
"""Kajiki integration for Pyramid.
This module allows the Kajiki templating language --
http://pypi.python.org/pypi/Kajiki/
-- to be used in the Pyramid web framework --
http://docs.pylonshq.com/
To enable the pyramid_kajiki extension, do this:
.. code-block:: python
config.include('bag.web.pyramid.kajiki')
Once the template loader is active, add the following to the
application section of your Pyramid application’s .ini file::
[app:yourapp]
# ... other stuff ...
kajiki.directory = myapp:templates
kajiki.extensions = .kajiki .genshi .html
The Kajiki FileLoader class supports searching only one directory for
templates. If you want a search path, you must roll your own.
If you do... let us know.
"""
from bag.settings import asbool
from zope.interface import implementer
from pyramid.interfaces import ITemplateRenderer
from pyramid.resource import abspath_from_resource_spec
from warnings import warn
warn('Kajiki now has kajiki.integration.pyramid!', DeprecationWarning)
[docs]@implementer(ITemplateRenderer)
class KajikiTemplateRenderer(object):
def __init__(self, info):
self.loader = info.registry.kajiki_loader
[docs] def implementation(self):
return self
def __call__(self, value, system):
""" ``value`` is the result of the view.
Returns a result (a string or unicode object useful as a
response body). Values computed by the system are passed in the
``system`` parameter, which is a dictionary containing:
* ``view`` (the view callable that returned the value),
* ``renderer_name`` (the template name or simple name of the renderer),
* ``context`` (the context object passed to the view), and
* ``request`` (the request object passed to the view).
"""
Template = self.loader.import_(system['renderer_name'])
try:
system.update(value)
except (TypeError, ValueError):
raise ValueError('KajikiTemplateRenderer was passed a '
'non-dictionary as value.')
t = Template(system)
return t.render()
[docs]def renderer_factory(info):
"""*info* contains:
::
name = Attribute('The value passed by the user as the renderer name')
package = Attribute('The "current package" when the renderer '
'configuration statement was found')
type = Attribute('The renderer type name')
registry = Attribute('The "current" application registry when the '
'renderer was created')
settings = Attribute('The ISettings dictionary related to the '
'current app')
"""
registry = info.registry
settings = info.settings
if not hasattr(registry, 'kajiki_loader'):
from kajiki import FileLoader
registry.kajiki_loader = FileLoader(
base=abspath_from_resource_spec(settings['kajiki.directory']),
reload=asbool(settings.get('reload_templates')),
force_mode=asbool(settings.get('kajiki.force_mode')),
autoescape_text=asbool(settings.get('kajiki.autoescape')),
)
return KajikiTemplateRenderer(info)
[docs]def includeme(config):
"""Set up Kajiki templating for the configured file extensions."""
if hasattr(config, 'bag_kajiki_included'):
return # Include only once per config
config.bag_kajiki_included = True
settings = config.get_settings()
extensions = settings.get('kajiki.extensions', '.kajiki').split()
for extension in extensions:
config.add_renderer(extension, renderer_factory)