]> git.ipfire.org Git - thirdparty/jinja.git/commitdiff
Add parsing of conditional expressions
authorKevin <kevin@kevin-brown.com>
Sun, 10 May 2020 21:36:33 +0000 (17:36 -0400)
committerKevin <kevin@kevin-brown.com>
Sun, 10 May 2020 21:36:33 +0000 (17:36 -0400)
new_parser.py

index 56debe323178a6624c1ed5dcad6901d10d6fbb95..2a07f681ccec4fdb78b7ea19627ea573cadb1d79 100644 (file)
@@ -259,8 +259,72 @@ def parse_conditional_expression(ast):
     if 'variable' in ast:\r
         return parse_variable(ast)\r
 \r
+    if 'comparator' in ast:\r
+        return parse_conditional_expression_comparator(ast)\r
+\r
+    if 'logical_operator' in ast:\r
+        return parse_conditional_expression_logical(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_comparator(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[ast['comparator']],\r
+                parse_variable(ast['right'])\r
+            )\r
+        ],\r
+        lineno=lineno_from_parseinfo(ast['parseinfo'])\r
+    )\r
+\r
+def parse_conditional_expression_logical(ast):\r
+    node_class_map = {\r
+        'and': nodes.And,\r
+        'or': nodes.Or,\r
+    }\r
+\r
+    node_class = node_class_map[ast['logical_operator']]\r
+\r
+    return node_class(\r
+        parse_conditional_expression(ast['left']),\r
+        parse_conditional_expression(ast['right']),\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
+\r
+    name = test_function.name\r
+    args = []\r
+    kwargs = []\r
+    dynamic_args = None\r
+    dynamic_kwargs = None\r
+\r
+    return nodes.Test(\r
+        node,\r
+        name,\r
+        args,\r
+        kwargs,\r
+        dynamic_args,\r
+        dynamic_kwargs,\r
+        lineno=lineno_from_parseinfo(ast['parseinfo'])\r
+    )\r
+\r
 def parse_literal(ast):\r
     if 'literal_type' not in ast:\r
         raise\r