# HG changeset patch # User zzzeek # Date 1162689943 0 # Node ID eb5f85d23dc106fae89a214d4892750ac8c94511 # Parent 387d5892244b412077c3ba2923a18b25c6a45b0b better system for def's to work; doing a little benchmarking. diff --git a/genshi/codegen/generator.py b/genshi/codegen/generator.py --- a/genshi/codegen/generator.py +++ b/genshi/codegen/generator.py @@ -72,6 +72,7 @@ __directive__ = template.DefDirective def produce_directive(self, gencontext, directive, event, substream): sig = directive.signature + gencontext.defs.add(directive.name) if not re.search(r'\(.*\)$', sig): gencontext.defs_without_params.add(sig) sig += '()' @@ -128,6 +129,7 @@ self.stream = stream self.serializer = serializer self.defs_without_params = sets.Set() + self.defs = sets.Set() def generate(self): for evt in self.start(): yield evt @@ -183,6 +185,7 @@ "from genshi.core import START, END, START_NS, END_NS, TEXT, COMMENT, DOCTYPE, QName, Stream", "from genshi.template import Context, Template", "from genshi.path import Path", + "from genshi.codegen import interp", "EXPR = Template.EXPR" ]: yield (PYTHON_LINE, line) @@ -216,10 +219,12 @@ if expr is None: expr = event[1] if expr.source in self.defs_without_params: - yield (PYTHON_LINE, "_expr = %s()" % (expr.source)) + yield (PYTHON_LINE, "for _evt in interp.evaluate(%s(), %s):" % (expr.source, repr(event[2]))) else: - yield (PYTHON_LINE, "_expr = %s" % (expr.source)) - yield (PYTHON_LINE, "yield (EXPR, _expr, %s, unicode(_expr))" % (repr(event[2]))) + yield (PYTHON_LINE, "for _evt in interp.evaluate(%s, %s):" % (expr.source, repr(event[2]))) + yield (PYTHON_LINE, "yield _evt") + yield (PYTHON_LINE, "") + def produce_text_event(self, event): yield (PYTHON_LINE, "yield (TEXT, (%s), %s, %s)" % ( repr(unicode(event[1])), diff --git a/genshi/codegen/interp.py b/genshi/codegen/interp.py --- a/genshi/codegen/interp.py +++ b/genshi/codegen/interp.py @@ -72,6 +72,16 @@ else: yield event +def evaluate(result, pos): + if result is not None: + if isinstance(result, basestring): + yield TEXT, result, pos, result + elif hasattr(result, '__iter__'): + for event in result: + yield event + else: + yield TEXT, unicode(result), pos, result + def run_inlined(module, data): context = Context(**data) for item in _match(module.go(context), context): diff --git a/genshi/codegen/tests/test_generator.py b/genshi/codegen/tests/test_generator.py --- a/genshi/codegen/tests/test_generator.py +++ b/genshi/codegen/tests/test_generator.py @@ -15,6 +15,7 @@ from genshi.output import HTMLSerializer from genshi.codegen import generator, interp from genshi.codegen.serialize import HTMLSerializeFilter +import time, sys text = """ ${lala + 'hi'}