added support for dotted names in tests and filters
--HG--
branch : trunk
diff --git a/jinja2/compiler.py b/jinja2/compiler.py
index 9ee323d..6518427 100644
--- a/jinja2/compiler.py
+++ b/jinja2/compiler.py
@@ -325,6 +325,10 @@
# the current line number
self.code_lineno = 1
+ # registry of all filters and tests (global, not block local)
+ self.tests = {}
+ self.filters = {}
+
# the debug information
self.debug_info = []
self._write_debug_info = None
@@ -473,10 +477,13 @@
visitor = DependencyFinderVisitor()
for node in nodes:
visitor.visit(node)
- for name in visitor.filters:
- self.writeline('f_%s = environment.filters[%r]' % (name, name))
- for name in visitor.tests:
- self.writeline('t_%s = environment.tests[%r]' % (name, name))
+ for dependency in 'filters', 'tests':
+ mapping = getattr(self, dependency)
+ for name in getattr(visitor, dependency):
+ if name not in mapping:
+ mapping[name] = self.temporary_identifier()
+ self.writeline('%s = environment.%s[%r]' %
+ (mapping[name], dependency, name))
def collect_shadowed(self, frame):
"""This function returns all the shadowed variables in a dict
@@ -1215,7 +1222,7 @@
self.visit(node.step, frame)
def visit_Filter(self, node, frame, initial=None):
- self.write('f_%s(' % node.name)
+ self.write(self.filters[node.name] + '(')
func = self.environment.filters.get(node.name)
if func is None:
raise TemplateAssertionError('no filter named %r' % node.name,
@@ -1234,7 +1241,7 @@
self.write(')')
def visit_Test(self, node, frame):
- self.write('t_%s(' % node.name)
+ self.write(self.tests[node.name] + '(')
if node.name not in self.environment.tests:
raise TemplateAssertionError('no test named %r' % node.name,
node.lineno, self.filename)