From: Kevin Date: Sun, 10 May 2020 15:13:15 +0000 (-0400) Subject: Add filter parsing for variables X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=cf6c74b8ab3196ef937b07699b0a070ec98f322b;p=thirdparty%2Fjinja.git Add filter parsing for variables Filters and their arguments are now properly parsed into the right Jinja nodes. Dynamic arguments (`*args`) and dynamic keyword arguments (`**kwargs`) are not currently parsed as they are not supported by the grammar. --- diff --git a/new_parser.py b/new_parser.py index e041e6d6..0a97c547 100644 --- a/new_parser.py +++ b/new_parser.py @@ -92,24 +92,31 @@ def parse_print(ast): node = parse_variable(variable) - for accessor_ast in variable['accessors']: - node = parse_variable_accessor(node, accessor_ast) - return nodes.Output([node]) def parse_template(ast): return nodes.Template(parse(ast), lineno=1) -def parse_variable(ast): - ast = ast['variable'] +def parse_variable(ast, variable_context='load'): + name = ast['variable'] - if 'literal_type' in ast: - return parse_literal(ast) + if 'literal_type' in name: + node = parse_literal(name) + else: + node = nodes.Name( + name, + variable_context, + lineno=lineno_from_parseinfo(ast['parseinfo']) + ) - return nodes.Name( - ast, - 'load' - ) + for accessor_ast in ast['accessors']: + node = parse_variable_accessor(node, accessor_ast) + + if ast['filters']: + for filter_ast in ast['filters']: + node = parse_variable_filter(node, filter_ast) + + return node def parse_variable_accessor(node, ast): accessor_type = ast['accessor_type'] @@ -125,4 +132,31 @@ def parse_variable_accessor(node, ast): accessor_node.ctx = "load" accessor_node.lineno = lineno_from_parseinfo(ast['parseinfo']) - return accessor_node \ No newline at end of file + return accessor_node + +def parse_variable_filter(node, ast): + args = [] + kwargs = [] + dynamic_args = None + dynamic_kwargs = None + + if 'arguments' in ast: + for argument in ast['arguments']: + value = parse_variable(argument['value']) + + if 'key' in argument: + kwargs.append( + nodes.Keyword(argument['key'], value) + ) + else: + args.append(value) + + return nodes.Filter( + node, + ast['name'], + args, + kwargs, + dynamic_args, + dynamic_kwargs, + lineno=lineno_from_parseinfo(ast['parseinfo']) + )