From 231bc67350bd0269efce3203b83b76c7aa8d4eb1 Mon Sep 17 00:00:00 2001 From: Paul Everitt Date: Wed, 16 Jul 2008 16:55:42 +0000 Subject: --- repoze/bfg/template.py | 52 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) (limited to 'repoze/bfg/template.py') diff --git a/repoze/bfg/template.py b/repoze/bfg/template.py index efb9f2c55..dd0778a43 100644 --- a/repoze/bfg/template.py +++ b/repoze/bfg/template.py @@ -26,6 +26,38 @@ class Z3CPTTemplateFactory(object): response = Response(result) return response +class XSLTemplateFactory(object): + classProvides(ITemplateFactory) + implements(IView) + + def __init__(self, path): + self.path = path + + def __call__(self, *arg, **kw): + node = kw.get("node") + processor = get_processor(self.path) + result = str(processor(node)) + response = Response(result) + return response + +# Manage XSLT processors on a per-thread basis +import threading +from lxml import etree +xslt_pool = threading.local() +def get_processor(xslt_fn): + try: + return xslt_pool.processors[xslt_fn] + except AttributeError: + xslt_pool.processors = {} + except KeyError: + pass + + # Make a processor and add it to the pool + source = etree.ElementTree(file=xslt_fn) + proc = etree.XSLT(source) + xslt_pool.processors[xslt_fn] = proc + return proc + def package_path(package): return os.path.abspath(os.path.dirname(package.__file__)) @@ -56,3 +88,23 @@ def render_template(path, **kw): registerTemplate(template, path) return template(**kw) + +def render_transform(path, **kw): + # Render using XSLT + + if not os.path.isabs(path): + package_globals = sys._getframe(1).f_globals + package_name = package_globals['__name__'] + package = sys.modules[package_name] + prefix = package_path(package) + path = os.path.join(prefix, path) + + template = queryUtility(IView, path) + node = kw.get("node") + if template is None: + if not os.path.exists(path): + raise ValueError('Missing template file: %s' % path) + template = XSLTemplateFactory(path) + registerTemplate(template, path) + + return template(**kw) -- cgit v1.2.3