summaryrefslogtreecommitdiff
path: root/jinja2/optimizer.py
diff options
context:
space:
mode:
authorArmin Ronacher <armin.ronacher@active-4.com>2008-04-13 01:10:18 +0200
committerArmin Ronacher <armin.ronacher@active-4.com>2008-04-13 01:10:18 +0200
commit00d5d2149af1593d791f9cbd3a7c9df9eec85d4e (patch)
tree127509efbefe8f19ac2ea84b7fd0f4b278b6733a /jinja2/optimizer.py
parentfa865fb5f2908cde19697bb0905a3bdf0b0347d9 (diff)
downloadjinja2-00d5d2149af1593d791f9cbd3a7c9df9eec85d4e.tar.gz
some more stuff for jinja2
--HG-- branch : trunk
Diffstat (limited to 'jinja2/optimizer.py')
-rw-r--r--jinja2/optimizer.py26
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: