]> git.ipfire.org Git - thirdparty/jinja.git/commitdiff
Add support for not() expressions in parser
authorKevin <kevin@kevin-brown.com>
Tue, 12 May 2020 02:28:11 +0000 (22:28 -0400)
committerKevin <kevin@kevin-brown.com>
Tue, 12 May 2020 02:28:11 +0000 (22:28 -0400)
new_parser.py
test_template.jinja

index a14000d7df82d59a5585acb9350f3e2cdfba3284..6275b60c5b7544d46bb759d8a3c79fa14a2483a0 100644 (file)
@@ -309,44 +309,26 @@ def parse_conditional_expression(ast):
     if 'variable' in ast:\r
         return parse_variable(ast)\r
 \r
-    if 'operator' in ast:\r
-        return parse_conditional_expression_operator(ast)\r
-\r
     if 'concatenate' in ast:\r
         return parse_concatenate_expression(ast)\r
 \r
-    if 'test_expression' in ast:\r
-        return parse_conditional_expression_if(ast)\r
-\r
     if 'logical_operator' in ast:\r
         return parse_conditional_expression_logical(ast)\r
 \r
+    if 'not' in ast:\r
+        return parse_conditional_expression_not(ast)\r
+\r
+    if 'operator' in ast:\r
+        return parse_conditional_expression_operator(ast)\r
+\r
+    if 'test_expression' in ast:\r
+        return parse_conditional_expression_if(ast)\r
+\r
     if 'test_function' in ast:\r
         return parse_conditional_expression_test(ast)\r
 \r
     return None\r
 \r
-def parse_conditional_expression_operator(ast):\r
-    operand_map = {\r
-        '>': 'gt',\r
-        '>=': 'gteq',\r
-        '==': 'eq',\r
-        '!=': 'ne',\r
-        '<': 'lt',\r
-        '<=': 'lteq',\r
-    }\r
-\r
-    return nodes.Compare(\r
-        parse_variable(ast['left']),\r
-        [\r
-            nodes.Operand(\r
-                operand_map.get(ast['operator'], ast['operator']),\r
-                parse_variable(ast['right'])\r
-            )\r
-        ],\r
-        lineno=lineno_from_parseinfo(ast['parseinfo'])\r
-    )\r
-\r
 def parse_conditional_expression_if(ast):\r
     test = parse_conditional_expression(ast['test_expression'])\r
     expr1 = parse_variable(ast['true_value'])\r
@@ -376,6 +358,33 @@ def parse_conditional_expression_logical(ast):
         lineno=lineno_from_parseinfo(ast['parseinfo'])\r
     )\r
 \r
+def parse_conditional_expression_not(ast):\r
+    return nodes.Not(\r
+        parse_conditional_expression(ast['not']),\r
+        lineno=lineno_from_parseinfo(ast['parseinfo'])\r
+    )\r
+\r
+def parse_conditional_expression_operator(ast):\r
+    operand_map = {\r
+        '>': 'gt',\r
+        '>=': 'gteq',\r
+        '==': 'eq',\r
+        '!=': 'ne',\r
+        '<': 'lt',\r
+        '<=': 'lteq',\r
+    }\r
+\r
+    return nodes.Compare(\r
+        parse_variable(ast['left']),\r
+        [\r
+            nodes.Operand(\r
+                operand_map.get(ast['operator'], ast['operator']),\r
+                parse_variable(ast['right'])\r
+            )\r
+        ],\r
+        lineno=lineno_from_parseinfo(ast['parseinfo'])\r
+    )\r
+\r
 def parse_conditional_expression_test(ast):\r
     node = parse_variable(ast['test_variable'])\r
     test_function = parse_variable(ast['test_function'])\r
index 07b8dc9f97f60b96b4c7dfe74bae993e296ed597..bb71fcc7f96975e47ddf82aeb1eb43406507b3c3 100644 (file)
@@ -67,4 +67,7 @@ across lines #}
 {{ "[{}]".format(page.title) if page.title }}\r
 {% extends layout_template if layout_template is defined else 'master.html' %}\r
 {{ "Hello " ~ name ~ "!" }}\r
-{{ 1 in [1, 2, 3] }}
\ No newline at end of file
+{{ 1 in [1, 2, 3] }}\r
+{{ foo is not bar }}\r
+{{ not (foo and bar) }}\r
+{{ foo not in bar }}
\ No newline at end of file