diff roundup/cgi/templating.py @ 4750:12b029655c05

Templating proof of concept to use multiple engines simultaneously, set "template_engine = jinja2, zopetal" to play.
author anatoly techtonik <techtonik@gmail.com>
date Tue, 22 Jan 2013 17:47:29 +0300
parents 0421390b3094
children 365deccf7347
line wrap: on
line diff
--- a/roundup/cgi/templating.py	Tue Jan 22 17:29:06 2013 +0300
+++ b/roundup/cgi/templating.py	Tue Jan 22 17:47:29 2013 +0300
@@ -149,19 +149,61 @@
         except NoTemplate, message:
             raise KeyError, message
 
+class MultiLoader(LoaderBase):
+    def __init__(self):
+        self.loaders = []
+
+    def add_loader(self, loader):
+        self.loaders.append(loader)
+      
+    def check(self, name):
+        for l in self.loaders:
+            if l.check(name):
+                return True
+
+    def load(self, name):    
+        for l in self.loaders:
+            if l.check(name):
+                return l.load(name)
+
+    def __getitem__(self, name):
+        """Needed for TAL templates compatibility"""
+        # [ ] document root and helper templates
+        try:
+            return self.load(name)
+        except NoTemplate, message:
+            raise KeyError, message
+        
+
 class TemplateBase:
     content_type = 'text/html'
 
-def get_loader(dir, engine_name):
-    if engine_name == 'chameleon':
-        from engine_chameleon import Loader
-    elif engine_name == 'jinja2':
-        from engine_jinja2 import Jinja2Loader as Loader
-    elif engine_name == 'zopetal':
-        from engine_zopetal import Loader
+
+def get_loader(dir, template_engine):
+
+    # Support for multiple engines using fallback mechanizm
+    # meaning that if first engine can't find template, we
+    # use the second
+
+    engines = template_engine.split(',')
+    engines = [x.strip() for x in engines]
+    ml = MultiLoader()
+
+    for engine_name in engines:
+        if engine_name == 'chameleon':
+            from engine_chameleon import Loader
+        elif engine_name == 'jinja2':
+            from engine_jinja2 import Jinja2Loader as Loader
+        elif engine_name == 'zopetal':
+            from engine_zopetal import Loader
+        else:
+            raise Exception('Unknown template engine "%s"' % engine_name)
+        ml.add_loader(Loader(dir))
+    
+    if len(engines) == 1:
+        return ml.loaders[0]
     else:
-        raise Exception('Unknown template engine "%s"' % engine_name)
-    return Loader(dir)
+        return ml
 
 # --/ Template Loader API
 

Roundup Issue Tracker: http://roundup-tracker.org/