changeset 903:95d62e239f60 experimental-inline

inline branch: support for a couple more directives
author cmlenz
date Mon, 26 Apr 2010 17:09:08 +0000
parents 09cc3627654c
children bf20de18289c
files genshi/template/astutil.py genshi/template/eval.py genshi/template/inline.py
diffstat 3 files changed, 52 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- 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 = []
--- 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
--- 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
  ?>
  <body>
-    <h1 py:def="sayhi(name='world')">
+    <h1 py:def="sayhi(name='world')" py:strip="1">
       Hello, $name!
     </h1>
     ${sayhi()}
     <ul py:if="items">
       <li py:for="idx, item in enumerate(items)"
-          class="${idx % 2 and 'odd' or 'even'}">
-        <span py:replace="item + 1">NUM</span>
+          class="${idx % 2 and 'odd' or 'even'}"
+          py:with="num=item + 1">
+        <span py:replace="num">NUM</span>
       </li>
     </ul>
  </body>
Copyright (C) 2012-2017 Edgewall Software