Skip to content

Commit 28ed352

Browse files
committed
Templating proof of concept to use multiple engines simultaneously,
set "template_engine = jinja2, zopetal" to play.
1 parent cffc4d8 commit 28ed352

File tree

2 files changed

+54
-11
lines changed

2 files changed

+54
-11
lines changed

roundup/cgi/engine_jinja2.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,9 +47,10 @@ def __init__(self, dir):
4747
)
4848

4949
def check(self, tplname):
50-
print tplname
50+
#print tplname
5151
try:
52-
print self._env.get_template(tplname + '.html')
52+
#print self._env.get_template(tplname + '.html')
53+
self._env.get_template(tplname + '.html')
5354
except jinja2.TemplateNotFound:
5455
return
5556
else:

roundup/cgi/templating.py

Lines changed: 51 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -149,19 +149,61 @@ def __getitem__(self, name):
149149
except NoTemplate, message:
150150
raise KeyError, message
151151

152+
class MultiLoader(LoaderBase):
153+
def __init__(self):
154+
self.loaders = []
155+
156+
def add_loader(self, loader):
157+
self.loaders.append(loader)
158+
159+
def check(self, name):
160+
for l in self.loaders:
161+
if l.check(name):
162+
return True
163+
164+
def load(self, name):
165+
for l in self.loaders:
166+
if l.check(name):
167+
return l.load(name)
168+
169+
def __getitem__(self, name):
170+
"""Needed for TAL templates compatibility"""
171+
# [ ] document root and helper templates
172+
try:
173+
return self.load(name)
174+
except NoTemplate, message:
175+
raise KeyError, message
176+
177+
152178
class TemplateBase:
153179
content_type = 'text/html'
154180

155-
def get_loader(dir, engine_name):
156-
if engine_name == 'chameleon':
157-
from engine_chameleon import Loader
158-
elif engine_name == 'jinja2':
159-
from engine_jinja2 import Jinja2Loader as Loader
160-
elif engine_name == 'zopetal':
161-
from engine_zopetal import Loader
181+
182+
def get_loader(dir, template_engine):
183+
184+
# Support for multiple engines using fallback mechanizm
185+
# meaning that if first engine can't find template, we
186+
# use the second
187+
188+
engines = template_engine.split(',')
189+
engines = [x.strip() for x in engines]
190+
ml = MultiLoader()
191+
192+
for engine_name in engines:
193+
if engine_name == 'chameleon':
194+
from engine_chameleon import Loader
195+
elif engine_name == 'jinja2':
196+
from engine_jinja2 import Jinja2Loader as Loader
197+
elif engine_name == 'zopetal':
198+
from engine_zopetal import Loader
199+
else:
200+
raise Exception('Unknown template engine "%s"' % engine_name)
201+
ml.add_loader(Loader(dir))
202+
203+
if len(engines) == 1:
204+
return ml.loaders[0]
162205
else:
163-
raise Exception('Unknown template engine "%s"' % engine_name)
164-
return Loader(dir)
206+
return ml
165207

166208
# --/ Template Loader API
167209

0 commit comments

Comments
 (0)