From: Kevin Date: Tue, 12 May 2020 02:28:11 +0000 (-0400) Subject: Add support for not() expressions in parser X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=dadb931c84cd1dcff3ecaa042e299d57811e0edd;p=thirdparty%2Fjinja.git Add support for not() expressions in parser --- diff --git a/new_parser.py b/new_parser.py index a14000d7..6275b60c 100644 --- a/new_parser.py +++ b/new_parser.py @@ -309,44 +309,26 @@ def parse_conditional_expression(ast): if 'variable' in ast: return parse_variable(ast) - if 'operator' in ast: - return parse_conditional_expression_operator(ast) - if 'concatenate' in ast: return parse_concatenate_expression(ast) - if 'test_expression' in ast: - return parse_conditional_expression_if(ast) - if 'logical_operator' in ast: return parse_conditional_expression_logical(ast) + if 'not' in ast: + return parse_conditional_expression_not(ast) + + if 'operator' in ast: + return parse_conditional_expression_operator(ast) + + if 'test_expression' in ast: + return parse_conditional_expression_if(ast) + if 'test_function' in ast: return parse_conditional_expression_test(ast) return None -def parse_conditional_expression_operator(ast): - operand_map = { - '>': 'gt', - '>=': 'gteq', - '==': 'eq', - '!=': 'ne', - '<': 'lt', - '<=': 'lteq', - } - - return nodes.Compare( - parse_variable(ast['left']), - [ - nodes.Operand( - operand_map.get(ast['operator'], ast['operator']), - parse_variable(ast['right']) - ) - ], - lineno=lineno_from_parseinfo(ast['parseinfo']) - ) - def parse_conditional_expression_if(ast): test = parse_conditional_expression(ast['test_expression']) expr1 = parse_variable(ast['true_value']) @@ -376,6 +358,33 @@ def parse_conditional_expression_logical(ast): lineno=lineno_from_parseinfo(ast['parseinfo']) ) +def parse_conditional_expression_not(ast): + return nodes.Not( + parse_conditional_expression(ast['not']), + lineno=lineno_from_parseinfo(ast['parseinfo']) + ) + +def parse_conditional_expression_operator(ast): + operand_map = { + '>': 'gt', + '>=': 'gteq', + '==': 'eq', + '!=': 'ne', + '<': 'lt', + '<=': 'lteq', + } + + return nodes.Compare( + parse_variable(ast['left']), + [ + nodes.Operand( + operand_map.get(ast['operator'], ast['operator']), + parse_variable(ast['right']) + ) + ], + lineno=lineno_from_parseinfo(ast['parseinfo']) + ) + def parse_conditional_expression_test(ast): node = parse_variable(ast['test_variable']) test_function = parse_variable(ast['test_function']) diff --git a/test_template.jinja b/test_template.jinja index 07b8dc9f..bb71fcc7 100644 --- a/test_template.jinja +++ b/test_template.jinja @@ -67,4 +67,7 @@ across lines #} {{ "[{}]".format(page.title) if page.title }} {% extends layout_template if layout_template is defined else 'master.html' %} {{ "Hello " ~ name ~ "!" }} -{{ 1 in [1, 2, 3] }} \ No newline at end of file +{{ 1 in [1, 2, 3] }} +{{ foo is not bar }} +{{ not (foo and bar) }} +{{ foo not in bar }} \ No newline at end of file