summaryrefslogtreecommitdiff
path: root/repoze/bfg/template.py
diff options
context:
space:
mode:
authorPaul Everitt <paul@agendaless.com>2008-07-16 16:55:42 +0000
committerPaul Everitt <paul@agendaless.com>2008-07-16 16:55:42 +0000
commit231bc67350bd0269efce3203b83b76c7aa8d4eb1 (patch)
tree3d908b33b995c7ce98b9e18a12bded7387440924 /repoze/bfg/template.py
parent22eed6aa7e8938ec30908aface102d42541dd3b3 (diff)
downloadpyramid-231bc67350bd0269efce3203b83b76c7aa8d4eb1.tar.gz
pyramid-231bc67350bd0269efce3203b83b76c7aa8d4eb1.tar.bz2
pyramid-231bc67350bd0269efce3203b83b76c7aa8d4eb1.zip
Diffstat (limited to 'repoze/bfg/template.py')
-rw-r--r--repoze/bfg/template.py52
1 files changed, 52 insertions, 0 deletions
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)