changeset 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 8ebccfa9a9fe
children de82830f8816
files examples/bench/bigtable.py genshi/template/base.py genshi/template/inline.py
diffstat 3 files changed, 28 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/examples/bench/bigtable.py
+++ b/examples/bench/bigtable.py
@@ -57,7 +57,13 @@
 </tr>
 </table>
 """)
-genshi_tmpl_compiled = genshi_tmpl.compile()
+genshi_tmpl_compiled = MarkupTemplate("""
+<table xmlns:py="http://genshi.edgewall.org/">
+<tr py:for="row in table">
+<td py:for="c in row.values()" py:content="c"/>
+</tr>
+</table>
+""").compile()
 
 genshi_tmpl2 = MarkupTemplate("""
 <table xmlns:py="http://genshi.edgewall.org/">$table</table>
@@ -108,7 +114,7 @@
 
 def test_genshi_compiled():
     """Genshi template, compiled to Python"""
-    stream = Stream(genshi_tmpl_compiled.generate(Context(table=table)))
+    stream = genshi_tmpl_compiled.generate(table=table)
     stream.render('html', strip_whitespace=False)
 
 def test_genshi_text():
--- 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):
--- a/genshi/template/inline.py
+++ b/genshi/template/inline.py
@@ -313,23 +313,23 @@
 
     print
     print 'Executed module:'
-    module = tmpl.compile()
-    print Stream(module.generate(ctxt)).render('html')
+    tmpl.compile()
+    print tmpl.generate(ctxt).render('html')
 
     print
     print
     t = timeit.Timer('list(tmpl.generate(**data))', '''
-from genshi.template import Context, MarkupTemplate
+from genshi.template import MarkupTemplate
 data = dict(hello='world', items=range(10))
 tmpl = MarkupTemplate("""%s""")''' % text)
     print 'Interpreted: %.2f msec/pass' % (1000 * t.timeit(number=1000) / 1000)
     print
 
-    t = timeit.Timer('list(module.generate(Context(**data)))', '''
+    t = timeit.Timer('list(tmpl.generate(**data))', '''
 from genshi.core import Stream
-from genshi.template import Context, MarkupTemplate
+from genshi.template import MarkupTemplate
 data = dict(hello='world', items=range(10))
 tmpl = MarkupTemplate("""%s""")
-module = tmpl.compile()''' % text)
+tmpl.compile()''' % text)
     print 'Compiled: %.2f msec/pass' % (1000 * t.timeit(number=1000) / 1000)
     print
Copyright (C) 2012-2017 Edgewall Software