]> git.ipfire.org Git - thirdparty/jinja.git/commitdiff
Add support for the filter block
authorKevin Brown <kevin@kevin-brown.com>
Fri, 15 May 2020 20:15:46 +0000 (16:15 -0400)
committerKevin Brown <kevin@kevin-brown.com>
Fri, 15 May 2020 20:15:46 +0000 (16:15 -0400)
src/jinja2/new_parser.py

index 47c0b446f797e462c305f53a46301805cd0e265d..1aac567f4c6c08a272e561bcd34a0c2738e2b8dc 100644 (file)
@@ -112,6 +112,9 @@ def parse_block_pair(ast):
     if block_name == 'call':\r
         return parse_block_call(ast)\r
 \r
+    if block_name == 'filter':\r
+        return parse_block_filter(ast)\r
+\r
     if block_name == 'for':\r
         return parse_block_for(ast)\r
 \r
@@ -182,6 +185,49 @@ def parse_block_extends(ast):
         parse_conditional_expression(ast['block']['parameters'][0]['value'])\r
     )\r
 \r
+def parse_block_filter(ast):\r
+    body = parse(ast['contents'])\r
+    filter_parameter = ast['start']['parameters'][0]['value']\r
+\r
+    filter_base = parse_variable(filter_parameter)\r
+\r
+    if isinstance(filter_base, nodes.Filter):\r
+        filter = filter_base\r
+        while isinstance(filter.node, nodes.Filter):\r
+            filter = filter.node\r
+\r
+        args = []\r
+        kwargs = []\r
+        dynamic_args = None\r
+        dynamic_kwargs = None\r
+\r
+        inner_filter = filter.node\r
+\r
+        if isinstance(inner_filter, nodes.Call):\r
+            args = inner_filter.args\r
+            kwargs = inner_filter.kwargs\r
+            dynamic_args = inner_filter.dyn_args\r
+            dynamic_kwargs = inner_filter.dyn_kwargs\r
+\r
+            inner_filter = inner_filter.node\r
+\r
+        inner_filter = nodes.Filter(\r
+            None,\r
+            inner_filter.name,\r
+            args,\r
+            kwargs,\r
+            dynamic_args,\r
+            dynamic_kwargs,\r
+            lineno=inner_filter.lineno\r
+        )\r
+        filter.node = inner_filter\r
+\r
+    return nodes.FilterBlock(\r
+        body,\r
+        filter_base,\r
+        lineno=lineno_from_parseinfo(ast['parseinfo'])\r
+    )\r
+\r
 def parse_block_for(ast):\r
     target = None\r
     iter = None\r