]> git.ipfire.org Git - thirdparty/jinja.git/commitdiff
Add support for parsing `{% else %}` blocks in for loops
authorKevin <kevin@kevin-brown.com>
Wed, 13 May 2020 02:10:49 +0000 (22:10 -0400)
committerKevin <kevin@kevin-brown.com>
Wed, 13 May 2020 02:10:49 +0000 (22:10 -0400)
1 [new file with mode: 0644]
2 [new file with mode: 0644]
new_parser.py
test_template.jinja

diff --git a/1 b/1
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/2 b/2
new file mode 100644 (file)
index 0000000..e69de29
index b3dd8ac998a28c773cb7dcb15d8749415f378002..5e3b0c5cef55cfc5352dc9d918424a50b572fc75 100644 (file)
@@ -143,7 +143,7 @@ def parse_block_extends(ast):
 def parse_block_for(ast):\r
     target = None\r
     iter = None\r
-    body = parse(ast['contents'])\r
+    body = ast['contents']\r
     else_ = []\r
     test = None\r
     recursive = False\r
@@ -174,8 +174,15 @@ def parse_block_for(ast):
     if len(block_parameters) > 1:\r
         recursive = block_parameters[-1]['value']['variable'] == 'recursive'\r
 \r
+    else_ = _split_contents_at_block(ast['contents'], 'else')\r
+\r
+    if else_ is not None:\r
+        body, _, else_ = else_\r
+    else:\r
+        else_ = []\r
+\r
     return nodes.For(\r
-        target, iter, body, else_, test, recursive,\r
+        target, iter, parse(body), parse(else_), test, recursive,\r
         lineno=lineno_from_parseinfo(ast['parseinfo'])\r
     )\r
 \r
@@ -677,4 +684,14 @@ def _parse_import_context(block_parameters):
     if block_parameters[-2]['value']['variable'] not in ['with', 'without']:\r
         return None\r
 \r
-    return block_parameters[-2]['value']['variable'] == 'with'
\ No newline at end of file
+    return block_parameters[-2]['value']['variable'] == 'with'\r
+\r
+def _split_contents_at_block(contents, block_name):\r
+    for index, expression in enumerate(contents):\r
+        if 'block' in expression:\r
+            block = parse_block(expression)\r
+\r
+            if expression['block']['name'] == block_name:\r
+                return (contents[:index], block, contents[index + 1:])\r
+\r
+    return None\r
index 399f898f8bfe614ba97bc3852255231ee987c22b..ac5fa1b66952ee3ed0eba1921fd4022d9dd3ca7f 100644 (file)
@@ -77,4 +77,9 @@ across lines #}
 {% include ['special_sidebar.html', 'sidebar.html'] ignore missing %}\r
 {% include "sidebar.html" ignore missing %}\r
 {% include "sidebar.html" ignore missing with context %}\r
-{% include "sidebar.html" ignore missing without context %}
\ No newline at end of file
+{% include "sidebar.html" ignore missing without context %}\r
+{% for item in seq %}\r
+    {{ item }}\r
+{% else %}\r
+    did not iterate\r
+{% endfor %}
\ No newline at end of file