Skip to content

Commit 14cdc77

Browse files
committed
Support filters in set block
- e.g {% set foo | trim %}...{% endset %} - closes #486
1 parent 50c6cd7 commit 14cdc77

File tree

4 files changed

+15
-3
lines changed

4 files changed

+15
-3
lines changed

jinja2/compiler.py

+5-1
Original file line numberDiff line numberDiff line change
@@ -1412,7 +1412,11 @@ def visit_AssignBlock(self, node, frame):
14121412
assignment_frame = self.make_assignment_frame(frame)
14131413
self.newline(node)
14141414
self.visit(node.target, assignment_frame)
1415-
self.write(' = concat(%s)' % block_frame.buffer)
1415+
if node.filter is not None:
1416+
self.write(' = ')
1417+
self.visit_Filter(node.filter, block_frame)
1418+
else:
1419+
self.write(' = concat(%s)' % block_frame.buffer)
14161420
self.export_assigned_vars(frame, assignment_frame)
14171421

14181422
# -- Expression Visitors

jinja2/nodes.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ class Assign(Stmt):
349349

350350
class AssignBlock(Stmt):
351351
"""Assigns a block to a target."""
352-
fields = ('target', 'body')
352+
fields = ('target', 'filter', 'body')
353353

354354

355355
class Expr(Node):

jinja2/parser.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -171,9 +171,10 @@ def parse_set(self):
171171
if self.stream.skip_if('assign'):
172172
expr = self.parse_tuple()
173173
return nodes.Assign(target, expr, lineno=lineno)
174+
filter_node = self.parse_filter(None)
174175
body = self.parse_statements(('name:endset',),
175176
drop_needle=True)
176-
return nodes.AssignBlock(target, body, lineno=lineno)
177+
return nodes.AssignBlock(target, filter_node, body, lineno=lineno)
177178

178179
def parse_for(self):
179180
"""Parse a for loop."""

tests/test_core_tags.py

+7
Original file line numberDiff line numberDiff line change
@@ -335,3 +335,10 @@ def test_block(self, env_trim):
335335
tmpl = env_trim.from_string('{% set foo %}42{% endset %}{{ foo }}')
336336
assert tmpl.render() == '42'
337337
assert tmpl.module.foo == u'42'
338+
339+
def test_block_filtered(self, env_trim):
340+
tmpl = env_trim.from_string(
341+
'{% set foo | trim | length | string %} 42 {% endset %}'
342+
'{{ foo }}')
343+
assert tmpl.render() == '2'
344+
assert tmpl.module.foo == u'2'

0 commit comments

Comments
 (0)