]> git.ipfire.org Git - thirdparty/jinja.git/commitdiff
Add initial parsing of for blocks
authorKevin <kevin@kevin-brown.com>
Sun, 10 May 2020 16:04:38 +0000 (12:04 -0400)
committerKevin <kevin@kevin-brown.com>
Sun, 10 May 2020 16:04:38 +0000 (12:04 -0400)
This will correctly parse out most of the starting block as well as
the contents, but it does not yet handle the parsing of the `{% else %}`
block that can be contained within the contents of the block.

new_parser.py

index ac1d7be2a75cdde3096a32a34dfe701a2a435f18..29e38885a4acf036540fe5061c6e57537f595bb8 100644 (file)
@@ -35,11 +35,37 @@ def parse_block(ast):
     return None\r
 \r
 def parse_block_pair(ast):\r
-    if ast['start']['name'] == 'with':\r
+    block_name = ast['start']['name']\r
+\r
+    if block_name == 'with':\r
         return parse_block_with(ast)\r
 \r
+    if block_name == 'for':\r
+        return parse_block_for(ast)\r
+\r
     return None\r
 \r
+def parse_block_for(ast):\r
+    target = None\r
+    iter = None\r
+    body = parse(ast['contents'])\r
+    else_ = []\r
+    test = None\r
+    recursive = False\r
+\r
+    block_parameters = ast['start']['parameters']\r
+\r
+    if block_parameters[1]['value']['variable'] != 'in':\r
+        raise\r
+\r
+    target = parse_variable(block_parameters[0]['value'], variable_context='store')\r
+    iter = parse_variable(block_parameters[2]['value'])\r
+\r
+    return nodes.For(\r
+        target, iter, body, else_, test, recursive,\r
+        lineno=lineno_from_parseinfo(ast['parseinfo'])\r
+    )\r
+\r
 def parse_block_from(ast):\r
     names = []\r
     parameters = ast['block']['parameters']\r