Mercurial > genshi > mirror
changeset 828:456d7e77320a 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 | 0d4fe605f734 |
children | a55e4d51b8ff |
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