diff --git a/jinja2/compiler.py b/jinja2/compiler.py index fad007b59..0917c0393 100644 --- a/jinja2/compiler.py +++ b/jinja2/compiler.py @@ -1412,7 +1412,11 @@ def visit_AssignBlock(self, node, frame): assignment_frame = self.make_assignment_frame(frame) self.newline(node) self.visit(node.target, assignment_frame) - self.write(' = concat(%s)' % block_frame.buffer) + if node.filter is not None: + self.write(' = ') + self.visit_Filter(node.filter, block_frame) + else: + self.write(' = concat(%s)' % block_frame.buffer) self.export_assigned_vars(frame, assignment_frame) # -- Expression Visitors diff --git a/jinja2/nodes.py b/jinja2/nodes.py index d32046ce5..804920170 100644 --- a/jinja2/nodes.py +++ b/jinja2/nodes.py @@ -349,7 +349,7 @@ class Assign(Stmt): class AssignBlock(Stmt): """Assigns a block to a target.""" - fields = ('target', 'body') + fields = ('target', 'filter', 'body') class Expr(Node): diff --git a/jinja2/parser.py b/jinja2/parser.py index d24da180e..453775607 100644 --- a/jinja2/parser.py +++ b/jinja2/parser.py @@ -171,9 +171,10 @@ def parse_set(self): if self.stream.skip_if('assign'): expr = self.parse_tuple() return nodes.Assign(target, expr, lineno=lineno) + filter_node = self.parse_filter(None) body = self.parse_statements(('name:endset',), drop_needle=True) - return nodes.AssignBlock(target, body, lineno=lineno) + return nodes.AssignBlock(target, filter_node, body, lineno=lineno) def parse_for(self): """Parse a for loop.""" diff --git a/tests/test_core_tags.py b/tests/test_core_tags.py index 2ea7757e4..b84c037f5 100644 --- a/tests/test_core_tags.py +++ b/tests/test_core_tags.py @@ -335,3 +335,10 @@ def test_block(self, env_trim): tmpl = env_trim.from_string('{% set foo %}42{% endset %}{{ foo }}') assert tmpl.render() == '42' assert tmpl.module.foo == u'42' + + def test_block_filtered(self, env_trim): + tmpl = env_trim.from_string( + '{% set foo | trim | length | string %} 42 {% endset %}' + '{{ foo }}') + assert tmpl.render() == '2' + assert tmpl.module.foo == u'2'