]> git.ipfire.org Git - thirdparty/jinja.git/commitdiff
Add filter parsing for variables
authorKevin <kevin@kevin-brown.com>
Sun, 10 May 2020 15:13:15 +0000 (11:13 -0400)
committerKevin <kevin@kevin-brown.com>
Sun, 10 May 2020 15:13:15 +0000 (11:13 -0400)
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.

new_parser.py

index e041e6d6426111d2f628963fb8a8a1288d259a29..0a97c54739777db939160c1cd840d90e7b6a6428 100644 (file)
@@ -92,24 +92,31 @@ def parse_print(ast):
 \r
     node = parse_variable(variable)\r
 \r
-    for accessor_ast in variable['accessors']:\r
-        node = parse_variable_accessor(node, accessor_ast)\r
-\r
     return nodes.Output([node])\r
 \r
 def parse_template(ast):\r
     return nodes.Template(parse(ast), lineno=1)\r
 \r
-def parse_variable(ast):\r
-    ast = ast['variable']\r
+def parse_variable(ast, variable_context='load'):\r
+    name = ast['variable']\r
 \r
-    if 'literal_type' in ast:\r
-        return parse_literal(ast)\r
+    if 'literal_type' in name:\r
+        node = parse_literal(name)\r
+    else:\r
+        node = nodes.Name(\r
+            name,\r
+            variable_context,\r
+            lineno=lineno_from_parseinfo(ast['parseinfo'])\r
+        )\r
 \r
-    return nodes.Name(\r
-        ast,\r
-        'load'\r
-    )\r
+    for accessor_ast in ast['accessors']:\r
+        node = parse_variable_accessor(node, accessor_ast)\r
+\r
+    if ast['filters']:\r
+        for filter_ast in ast['filters']:\r
+            node = parse_variable_filter(node, filter_ast)\r
+\r
+    return node\r
 \r
 def parse_variable_accessor(node, ast):\r
     accessor_type = ast['accessor_type']\r
@@ -125,4 +132,31 @@ def parse_variable_accessor(node, ast):
     accessor_node.ctx = "load"\r
     accessor_node.lineno = lineno_from_parseinfo(ast['parseinfo'])\r
 \r
-    return accessor_node
\ No newline at end of file
+    return accessor_node\r
+\r
+def parse_variable_filter(node, ast):\r
+    args = []\r
+    kwargs = []\r
+    dynamic_args = None\r
+    dynamic_kwargs = None\r
+\r
+    if 'arguments' in ast:\r
+        for argument in ast['arguments']:\r
+            value = parse_variable(argument['value'])\r
+\r
+            if 'key' in argument:\r
+                kwargs.append(\r
+                    nodes.Keyword(argument['key'], value)\r
+                )\r
+            else:\r
+                args.append(value)\r
+\r
+    return nodes.Filter(\r
+        node,\r
+        ast['name'],\r
+        args,\r
+        kwargs,\r
+        dynamic_args,\r
+        dynamic_kwargs,\r
+        lineno=lineno_from_parseinfo(ast['parseinfo'])\r
+    )\r