# HG changeset patch # User cmlenz # Date 1236605161 0 # Node ID 3047d5d83cccca400ec9ec7ba0b56267a19c0533 # Parent b1e9e3209c6ff76fb0b157ae961372cc2325868b Merge the internal template filters `_eval` and `_exec` into the `_flatten` function for slightly better performance. diff --git a/genshi/template/base.py b/genshi/template/base.py --- a/genshi/template/base.py +++ b/genshi/template/base.py @@ -418,7 +418,7 @@ return '<%s "%s">' % (self.__class__.__name__, self.filename) def _init_filters(self): - self.filters = [self._flatten, self._eval, self._exec] + self.filters = [self._flatten] if self.loader: self.filters.append(self._include) @@ -520,11 +520,7 @@ stream = filter_(iter(stream), ctxt, **vars) return Stream(stream, self.serializer) - def _eval(self, stream, ctxt, **vars): - """Internal stream filter that evaluates any expressions in `START` and - `TEXT` events. - """ - filters = (self._flatten, self._eval) + def _flatten(self, stream, ctxt, **vars): number_conv = self._number_conv for kind, data, pos in stream: @@ -539,11 +535,9 @@ value = substream else: values = [] - for subkind, subdata, subpos in self._eval(substream, - ctxt, - **vars): - if subkind is TEXT: - values.append(subdata) + for event in self._flatten(substream, ctxt, **vars): + if event[0] is TEXT: + values.append(event[1]) value = [x for x in values if x is not None] if not value: continue @@ -561,39 +555,25 @@ elif isinstance(result, (int, float, long)): yield TEXT, number_conv(result), pos elif hasattr(result, '__iter__'): - substream = _ensure(result) - for filter_ in filters: - substream = filter_(substream, ctxt, **vars) - for event in substream: + for event in self._flatten(_ensure(result), ctxt, + **vars): yield event else: yield TEXT, unicode(result), pos + elif kind is EXEC: + _exec_suite(data, ctxt, **vars) + + elif kind is SUB: + # This event is a list of directives and a list of nested + # events to which those directives should be applied + substream = _apply_directives(data[1], data[0], ctxt, **vars) + for event in self._flatten(substream, ctxt, **vars): + yield event + else: yield kind, data, pos - def _exec(self, stream, ctxt, **vars): - """Internal stream filter that executes Python code blocks.""" - for event in stream: - if event[0] is EXEC: - _exec_suite(event[1], ctxt, **vars) - else: - yield event - - def _flatten(self, stream, ctxt, **vars): - """Internal stream filter that expands `SUB` events in the stream.""" - for event in stream: - if event[0] is SUB: - # This event is a list of directives and a list of nested - # events to which those directives should be applied - directives, substream = event[1] - substream = _apply_directives(substream, directives, ctxt, - **vars) - for event in self._flatten(substream, ctxt, **vars): - yield event - else: - yield event - def _include(self, stream, ctxt, **vars): """Internal stream filter that performs inclusion of external template files. @@ -605,8 +585,8 @@ href, cls, fallback = event[1] if not isinstance(href, basestring): parts = [] - for subkind, subdata, subpos in self._eval(href, ctxt, - **vars): + for subkind, subdata, subpos in self._flatten(href, ctxt, + **vars): if subkind is TEXT: parts.append(subdata) href = u''.join([x for x in parts if x is not None]) diff --git a/genshi/template/markup.py b/genshi/template/markup.py --- a/genshi/template/markup.py +++ b/genshi/template/markup.py @@ -374,13 +374,9 @@ # Recursively process the output template = _apply_directives(template, directives, ctxt, **vars) - for event in self._match( - self._exec( - self._eval( - self._flatten(template, ctxt, **vars), - ctxt, **vars), - ctxt, **vars), - ctxt, start=idx + 1, **vars): + for event in self._match(self._flatten(template, ctxt, + **vars), + ctxt, start=idx + 1, **vars): yield event # If the match template did not actually call select to