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)
diff --git a/jinja2/nodes.py b/jinja2/nodes.py
index 2519682..180478d 100644
--- a/jinja2/nodes.py
+++ b/jinja2/nodes.py
@@ -727,6 +727,9 @@
class ExtensionAttribute(Expr):
"""Returns the attribute of an extension bound to the environment.
The identifier is the identifier of the :class:`Extension`.
+
+ This node is usually constructed by calling the
+ :meth:`~jinja2.ext.Extension.attr` method on an extension.
"""
fields = ('identifier', 'attr')
diff --git a/jinja2/parser.py b/jinja2/parser.py
index dae1a6b..8d23b5f 100644
--- a/jinja2/parser.py
+++ b/jinja2/parser.py
@@ -676,18 +676,21 @@
lineno=token.lineno)
def parse_filter(self, node, start_inline=False):
- lineno = self.stream.current.type
while self.stream.current.type == 'pipe' or start_inline:
if not start_inline:
self.stream.next()
token = self.stream.expect('name')
+ name = token.value
+ while self.stream.current.type is 'dot':
+ self.stream.next()
+ name += '.' + self.stream.expect('name').value
if self.stream.current.type is 'lparen':
args, kwargs, dyn_args, dyn_kwargs = self.parse_call(None)
else:
args = []
kwargs = []
dyn_args = dyn_kwargs = None
- node = nodes.Filter(node, token.value, args, kwargs, dyn_args,
+ node = nodes.Filter(node, name, args, kwargs, dyn_args,
dyn_kwargs, lineno=token.lineno)
start_inline = False
return node
@@ -700,6 +703,9 @@
else:
negated = False
name = self.stream.expect('name').value
+ while self.stream.current.type is 'dot':
+ self.stream.next()
+ name += '.' + self.stream.expect('name').value
dyn_args = dyn_kwargs = None
kwargs = []
if self.stream.current.type is 'lparen':