# HG changeset patch # User cmlenz # Date 1236960402 0 # Node ID eb8aa869048043145cd880a7cac2c0ae5eee71ca # Parent 8ebccfa9a9fe3f69f61609748c58a3df02d16238 inline branch: template object can be compiled, and remembers the generated module. diff --git a/examples/bench/bigtable.py b/examples/bench/bigtable.py --- a/examples/bench/bigtable.py +++ b/examples/bench/bigtable.py @@ -57,7 +57,13 @@ """) -genshi_tmpl_compiled = genshi_tmpl.compile() +genshi_tmpl_compiled = MarkupTemplate(""" + + + +
+
+""").compile() genshi_tmpl2 = MarkupTemplate(""" $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(): diff --git a/genshi/template/base.py b/genshi/template/base.py --- 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 '', '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): diff --git a/genshi/template/inline.py b/genshi/template/inline.py --- 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