Mercurial > genshi > mirror
changeset 553:489a47873950 trunk
Store state information for py:choose outside of the regular context data.
author | cmlenz |
---|---|
date | Mon, 02 Jul 2007 17:22:54 +0000 |
parents | b59d99d2f631 |
children | 0cdbd6e5831e 0d98569eaced |
files | genshi/template/base.py genshi/template/directives.py |
diffstat | 2 files changed, 16 insertions(+), 15 deletions(-) [+] |
line wrap: on
line diff
--- a/genshi/template/base.py +++ b/genshi/template/base.py @@ -129,6 +129,7 @@ self.pop = self.frames.popleft self.push = self.frames.appendleft self._match_templates = [] + self._choice_stack = [] # Helper functions for use in expressions def defined(name):
--- a/genshi/template/directives.py +++ b/genshi/template/directives.py @@ -587,13 +587,13 @@ attach = classmethod(attach) def __call__(self, stream, ctxt, directives): - frame = dict({'_choose.matched': False}) + info = [False, None] if self.expr: - frame['_choose.value'] = self.expr.evaluate(ctxt) - ctxt.push(frame) + info[1] = self.expr.evaluate(ctxt) + ctxt._choice_stack.append(info) for event in _apply_directives(stream, ctxt, directives): yield event - ctxt.pop() + ctxt._choice_stack.pop() class WhenDirective(Directive): @@ -616,26 +616,26 @@ attach = classmethod(attach) def __call__(self, stream, ctxt, directives): - matched, frame = ctxt._find('_choose.matched') - if not frame: + info = ctxt._choice_stack and ctxt._choice_stack[-1] + if not info: raise TemplateRuntimeError('"when" directives can only be used ' 'inside a "choose" directive', self.filename, *stream.next()[2][1:]) - if matched: + if info[0]: return [] - if not self.expr and '_choose.value' not in frame: + if not self.expr and not info[1]: raise TemplateRuntimeError('either "choose" or "when" directive ' 'must have a test expression', self.filename, *stream.next()[2][1:]) - if '_choose.value' in frame: - value = frame['_choose.value'] + if info[1]: + value = info[1] if self.expr: matched = value == self.expr.evaluate(ctxt) else: matched = bool(value) else: matched = bool(self.expr.evaluate(ctxt)) - frame['_choose.matched'] = matched + info[0] = matched if not matched: return [] @@ -655,14 +655,14 @@ self.filename = template.filepath def __call__(self, stream, ctxt, directives): - matched, frame = ctxt._find('_choose.matched') - if not frame: + info = ctxt._choice_stack and ctxt._choice_stack[-1] + if not info: raise TemplateRuntimeError('an "otherwise" directive can only be ' 'used inside a "choose" directive', self.filename, *stream.next()[2][1:]) - if matched: + if info[0]: return [] - frame['_choose.matched'] = True + info[0] = True return _apply_directives(stream, ctxt, directives)