From: Kevin Date: Thu, 14 May 2020 03:06:25 +0000 (-0400) Subject: Fix parsing of filters to allow chained calls X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=46da1570316b86b4750025d9899a800e5cb5ec4c;p=thirdparty%2Fjinja.git Fix parsing of filters to allow chained calls --- diff --git a/src/jinja2/new_parser.py b/src/jinja2/new_parser.py index 95ae73ec..5ef1a439 100644 --- a/src/jinja2/new_parser.py +++ b/src/jinja2/new_parser.py @@ -730,20 +730,22 @@ def parse_variable_filter(node, ast): dynamic_args = None dynamic_kwargs = None - if 'arguments' in ast: - for argument in ast['arguments']: - value = parse_variable(argument['value']) + variable = parse_variable(ast) - if 'key' in argument: - kwargs.append( - nodes.Keyword(argument['key'], value) - ) - else: - args.append(value) + filter_node = None + last_filter = None + start_variable = variable - return nodes.Filter( + while not isinstance(variable, nodes.Name): + if isinstance(variable, nodes.Call): + last_filter = filter_node + filter_node = variable + + variable = variable.node + + new_filter = nodes.Filter( node, - ast['name'], + variable.name, args, kwargs, dynamic_args, @@ -751,6 +753,17 @@ def parse_variable_filter(node, ast): lineno=lineno_from_parseinfo(ast['parseinfo']) ) + if filter_node is not None: + new_filter.args = filter_node.args + new_filter.kwargs = filter_node.kwargs + + if last_filter is None: + return new_filter + + last_filter.node = new_filter + + return last_filter + def parse_variable_tuple(ast, variable_context): identifiers = [] diff --git a/test_tatsu.py b/test_tatsu.py index 3c40eb1c..d67a74c9 100644 --- a/test_tatsu.py +++ b/test_tatsu.py @@ -29,5 +29,5 @@ with open('grammar.ebnf', 'r') as tatsu_grammar: with open('parsed_jinja.py', 'w') as jinja_ast_file: pprint.pprint(jinja_ast, indent=2, stream=jinja_ast_file) - print("New Parser", new_parse_end - new_parse_start, file=sys.stderr) - print("Jinja Parser", jinja_parse_end - jinja_parse_start, file=sys.stderr) + print("New Parser", new_parse_end - new_parse_start) + print("Jinja Parser", jinja_parse_end - jinja_parse_start)