diff options
author | Armin Ronacher <armin.ronacher@active-4.com> | 2008-04-13 01:10:18 +0200 |
---|---|---|
committer | Armin Ronacher <armin.ronacher@active-4.com> | 2008-04-13 01:10:18 +0200 |
commit | 00d5d2149af1593d791f9cbd3a7c9df9eec85d4e (patch) | |
tree | 127509efbefe8f19ac2ea84b7fd0f4b278b6733a /jinja2/optimizer.py | |
parent | fa865fb5f2908cde19697bb0905a3bdf0b0347d9 (diff) | |
download | jinja2-00d5d2149af1593d791f9cbd3a7c9df9eec85d4e.tar.gz |
some more stuff for jinja2
--HG--
branch : trunk
Diffstat (limited to 'jinja2/optimizer.py')
-rw-r--r-- | jinja2/optimizer.py | 26 |
1 files changed, 26 insertions, 0 deletions
diff --git a/jinja2/optimizer.py b/jinja2/optimizer.py index bd97fa0..d2550f4 100644 --- a/jinja2/optimizer.py +++ b/jinja2/optimizer.py @@ -95,6 +95,32 @@ class Optimizer(NodeTransformer): finally: context.pop() + def visit_FilterBlock(self, node, context): + """Try to filter a block at compile time.""" + node = self.generic_visit(node, context) + context.push() + + # check if we can evaluate the wrapper body into a string + # at compile time + buffer = [] + for child in node.body: + if not isinstance(child, nodes.Output): + return node + for item in child.optimized_nodes(): + if isinstance(item, nodes.Node): + return node + buffer.append(item) + + # now check if we can evaluate the filter at compile time. + try: + data = node.filter.as_const(u''.join(buffer)) + except nodes.Impossible: + return node + + context.pop() + const = nodes.Const(data, lineno=node.lineno) + return nodes.Output([const], lineno=node.lineno) + def visit_For(self, node, context): """Loop unrolling for iterable constant values.""" try: |