From: Kevin Brown Date: Fri, 15 May 2020 20:15:46 +0000 (-0400) Subject: Add support for the filter block X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=1907179e060c32187388412e66e1b7c10aad5b15;p=thirdparty%2Fjinja.git Add support for the filter block --- diff --git a/src/jinja2/new_parser.py b/src/jinja2/new_parser.py index 47c0b446..1aac567f 100644 --- a/src/jinja2/new_parser.py +++ b/src/jinja2/new_parser.py @@ -112,6 +112,9 @@ def parse_block_pair(ast): if block_name == 'call': return parse_block_call(ast) + if block_name == 'filter': + return parse_block_filter(ast) + if block_name == 'for': return parse_block_for(ast) @@ -182,6 +185,49 @@ def parse_block_extends(ast): parse_conditional_expression(ast['block']['parameters'][0]['value']) ) +def parse_block_filter(ast): + body = parse(ast['contents']) + filter_parameter = ast['start']['parameters'][0]['value'] + + filter_base = parse_variable(filter_parameter) + + if isinstance(filter_base, nodes.Filter): + filter = filter_base + while isinstance(filter.node, nodes.Filter): + filter = filter.node + + args = [] + kwargs = [] + dynamic_args = None + dynamic_kwargs = None + + inner_filter = filter.node + + if isinstance(inner_filter, nodes.Call): + args = inner_filter.args + kwargs = inner_filter.kwargs + dynamic_args = inner_filter.dyn_args + dynamic_kwargs = inner_filter.dyn_kwargs + + inner_filter = inner_filter.node + + inner_filter = nodes.Filter( + None, + inner_filter.name, + args, + kwargs, + dynamic_args, + dynamic_kwargs, + lineno=inner_filter.lineno + ) + filter.node = inner_filter + + return nodes.FilterBlock( + body, + filter_base, + lineno=lineno_from_parseinfo(ast['parseinfo']) + ) + def parse_block_for(ast): target = None iter = None