summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris McDonough <chrism@plope.com>2012-08-29 03:41:28 -0400
committerChris McDonough <chrism@plope.com>2012-08-29 03:41:28 -0400
commit89c94bb61444893084a4e15fd185b7c07477ecad (patch)
tree7af5b0e27c9eb04b2010cd7d2d0291d6dbad3bde
parenta9289d95036eb23e973815e529d3db3fea235046 (diff)
downloadpyramid-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.py2
-rw-r--r--pyramid/chameleon_zpt.py17
-rw-r--r--pyramid/renderers.py13
-rw-r--r--pyramid/tests/test_renderers.py2
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