diff genshi/template/base.py @ 828:eb8aa8690480 experimental-inline

inline branch: template object can be compiled, and remembers the generated module.
author cmlenz
date Fri, 13 Mar 2009 16:06:42 +0000
parents 1837f39efd6f
children de82830f8816
line wrap: on
line diff
--- a/genshi/template/base.py
+++ b/genshi/template/base.py
@@ -22,6 +22,7 @@
 import os
 from StringIO import StringIO
 import sys
+from types import ModuleType
 
 from genshi.core import Attrs, Stream, StreamEventKind, START, TEXT, _ensure
 from genshi.input import ParseError
@@ -394,6 +395,7 @@
         self.lookup = lookup
         self.allow_exec = allow_exec
         self._init_filters()
+        self._module = None
         self._prepared = False
 
         if isinstance(source, basestring):
@@ -498,11 +500,12 @@
         from genshi.template.inline import inline
 
         name = (self.filename or '_some_ident').replace('.', '_')
-        module = new_module(name)
+        module = ModuleType(name)
         source = u'\n'.join(list(inline(self)))
         code = compile(source, self.filepath or '<string>', 'exec')
         exec code in module.__dict__, module.__dict__
-        return module
+        self._module = module
+        return self
 
     def generate(self, *args, **kwargs):
         """Apply the template to the given context data.
@@ -529,9 +532,15 @@
         else:
             ctxt = Context(**kwargs)
 
-        stream = self.stream
-        for filter_ in self.filters:
-            stream = filter_(iter(stream), ctxt, **vars)
+        if self._module is not None:
+            stream = self._module.generate(ctxt)
+            for filter_ in [f for f in self.filters if f != self._flatten]:
+                stream = filter_(iter(stream), ctxt, **vars)
+        else:
+            stream = self.stream
+            for filter_ in self.filters:
+                stream = filter_(iter(stream), ctxt, **vars)
+
         return Stream(stream, self.serializer)
 
     def _flatten(self, stream, ctxt, **vars):
Copyright (C) 2012-2017 Edgewall Software