diff options
| author | Chris McDonough <chrism@plope.com> | 2012-08-29 03:41:28 -0400 |
|---|---|---|
| committer | Chris McDonough <chrism@plope.com> | 2012-08-29 03:41:28 -0400 |
| commit | 89c94bb61444893084a4e15fd185b7c07477ecad (patch) | |
| tree | 7af5b0e27c9eb04b2010cd7d2d0291d6dbad3bde | |
| parent | a9289d95036eb23e973815e529d3db3fea235046 (diff) | |
| download | pyramid-89c94bb61444893084a4e15fd185b7c07477ecad.tar.gz pyramid-89c94bb61444893084a4e15fd185b7c07477ecad.tar.bz2 pyramid-89c94bb61444893084a4e15fd185b7c07477ecad.zip | |
rough cut at supporting 'packagename:dirname/template#macroname.pt' renderer style, ala mako renderer
| -rw-r--r-- | pyramid/chameleon_text.py | 2 | ||||
| -rw-r--r-- | pyramid/chameleon_zpt.py | 17 | ||||
| -rw-r--r-- | pyramid/renderers.py | 13 | ||||
| -rw-r--r-- | pyramid/tests/test_renderers.py | 2 |
4 files changed, 25 insertions, 9 deletions
diff --git a/pyramid/chameleon_text.py b/pyramid/chameleon_text.py index 872d3b920..20f614857 100644 --- a/pyramid/chameleon_text.py +++ b/pyramid/chameleon_text.py @@ -27,7 +27,7 @@ def renderer_factory(info): @implementer(ITemplateRenderer) class TextTemplateRenderer(object): - def __init__(self, path, lookup): + def __init__(self, path, lookup, macro=None): self.path = path self.lookup = lookup diff --git a/pyramid/chameleon_zpt.py b/pyramid/chameleon_zpt.py index aa6f89e07..9f9e09850 100644 --- a/pyramid/chameleon_zpt.py +++ b/pyramid/chameleon_zpt.py @@ -26,19 +26,26 @@ def renderer_factory(info): @implementer(ITemplateRenderer) class ZPTTemplateRenderer(object): - def __init__(self, path, lookup): + def __init__(self, path, lookup, macro=None): self.path = path self.lookup = lookup + self.macro = macro @reify # avoid looking up reload_templates before manager pushed def template(self): if sys.platform.startswith('java'): # pragma: no cover raise RuntimeError( 'Chameleon templates are not compatible with Jython') - return PageTemplateFile(self.path, - auto_reload=self.lookup.auto_reload, - debug=self.lookup.debug, - translate=self.lookup.translate) + tf = PageTemplateFile(self.path, + auto_reload=self.lookup.auto_reload, + debug=self.lookup.debug, + translate=self.lookup.translate) + if self.macro: + # render only the portion of the template included in a + # define-macro named the value of self.macro + macro_renderer = tf.macros[self.macro].include + tf._render = macro_renderer + return tf def implementation(self): return self.template diff --git a/pyramid/renderers.py b/pyramid/renderers.py index e526f9997..fe9df33d1 100644 --- a/pyramid/renderers.py +++ b/pyramid/renderers.py @@ -1,5 +1,6 @@ import json import os +import re import pkg_resources import threading @@ -426,7 +427,7 @@ class ChameleonRendererLookup(object): raise ValueError('Missing template file: %s' % spec) renderer = registry.queryUtility(ITemplateRenderer, name=spec) if renderer is None: - renderer = self.impl(spec, self) + renderer = self.impl(spec, self, macro=None) # cache the template try: self.lock.acquire() @@ -438,6 +439,14 @@ class ChameleonRendererLookup(object): # spec is a package:relpath asset spec renderer = registry.queryUtility(ITemplateRenderer, name=spec) if renderer is None: + p = re.compile( + r'(?P<asset>[\w_.:/]+)' + r'(?:\#(?P<defname>[\w_]+))?' + r'(\.(?P<ext>.*))' + ) + asset, macro, ext = p.match(spec).group( + 'asset', 'defname', 'ext') + spec = '%s.%s' % (asset, ext) try: package_name, filename = spec.split(':', 1) except ValueError: # pragma: no cover @@ -450,7 +459,7 @@ class ChameleonRendererLookup(object): if not pkg_resources.resource_exists(package_name, filename): raise ValueError( 'Missing template asset: %s (%s)' % (spec, abspath)) - renderer = self.impl(abspath, self) + renderer = self.impl(abspath, self, macro=macro) settings = info.settings if not settings.get('reload_assets'): # cache the template diff --git a/pyramid/tests/test_renderers.py b/pyramid/tests/test_renderers.py index 495d7dc23..6a8ac64f4 100644 --- a/pyramid/tests/test_renderers.py +++ b/pyramid/tests/test_renderers.py @@ -292,7 +292,7 @@ class TestChameleonRendererLookup(unittest.TestCase): if path.endswith('.pyc'): # pragma: no cover path = path[:-1] self.assertTrue(factory.path.startswith(path)) - self.assertEqual(factory.kw, {}) + self.assertEqual(factory.kw, {'macro':None}) def test___call__reload_assets_true(self): import pyramid.tests |
