# HG changeset patch # User cmlenz # Date 1272301748 0 # Node ID 95d62e239f601a400dd1d846b4e308ac1f7a005f # Parent 09cc3627654c1bd2a567b153d780cef499a8f67a inline branch: support for a couple more directives diff --git a/genshi/template/astutil.py b/genshi/template/astutil.py --- a/genshi/template/astutil.py +++ b/genshi/template/astutil.py @@ -33,9 +33,9 @@ """ def __init__(self, tree): self.lines_info = [] - self.line_info = None + self.line_info = [] self.code = '' - self.line = None + self.line = '' self.last = None self.indent = 0 self.blame_stack = [] diff --git a/genshi/template/eval.py b/genshi/template/eval.py --- a/genshi/template/eval.py +++ b/genshi/template/eval.py @@ -78,7 +78,7 @@ else: assert isinstance(source, _ast.AST), \ 'Expected string or AST node, but got %r' % source - self.source = '?' + self.source = ASTCodeGenerator(source).code.strip() if self.mode == 'eval': node = _ast.Expression() node.body = source diff --git a/genshi/template/inline.py b/genshi/template/inline.py --- a/genshi/template/inline.py +++ b/genshi/template/inline.py @@ -180,8 +180,51 @@ yield line w.unshift() + elif isinstance(d, StripDirective): + if not d.expr: + stream = stream[1:-2] + for line in _apply(rest, stream): + yield line + else: + yield w('strip.append(e[%d].evaluate(ctxt))', + index['E'][d.expr]) + yield w('if not strip[-1]:') + w.shift() + for line in _generate([stream[0]]): + yield line + w.unshift() + for line in _apply(rest, stream[1:-2]): + yield line + yield w('if not strip[-1]:') + w.shift() + for line in _generate([stream[-1]]): + yield line + w.unshift() + yield w('strip.pop(-1)') + + elif isinstance(d, WithDirective): + yield w('push({%s})' % ','.join([ + '%r: e[%d].evaluate(ctxt)' % ( + name[0][0].id, + index['E'][expr] + ) for name, expr in d.vars + ])) + for line in _apply(rest, stream): + yield line + yield w('pop()') + + elif isinstance(d, ContentDirective): + for line in _generate([stream[0]]): + yield line + yield w('for v in e[%d].evaluate(ctxt): yield v', index['E'][d.expr]) + for line in _generate([stream[-1]]): + yield line + + elif isinstance(d, ReplaceDirective): + yield w('for v in e[%d].evaluate(ctxt): yield v', index['E'][d.expr]) + else: - raise NotImplementedError, '%r not supported' % d.tagname + raise NotImplementedError, '%r directive not supported' % d.tagname yield w() @@ -259,6 +302,7 @@ ', '.join(['f=_F'] + ['%s=_%s' % (n.lower(), n) for n in index])) w.shift() yield w('push = ctxt.push; pop = ctxt.pop') + yield w('strip = []') yield w() # Define macro functions @@ -287,14 +331,15 @@ return x*x ?> -

+

Hello, $name!

${sayhi()}