From 1766793fd59b81a69587e4d9874aa7d3f74e55a9 Mon Sep 17 00:00:00 2001 From: pantor Date: Mon, 19 Mar 2018 11:09:23 +0100 Subject: [PATCH] Allow index in nested loops --- src/inja.hpp | 7 +++++++ test/src/unit-renderer.cpp | 1 + 2 files changed, 8 insertions(+) diff --git a/src/inja.hpp b/src/inja.hpp index 105f6a6..d4fbca6 100644 --- a/src/inja.hpp +++ b/src/inja.hpp @@ -544,6 +544,13 @@ public: const std::vector list = eval_expression>(element_loop->list, data); for (unsigned int i = 0; i < list.size(); i++) { json data_loop = data; + /* For nested loops, use parent/index */ + if (data_loop.count ("index") == 1 && data_loop.count ("index") == 1) { + data_loop["parent"]["index"] = data_loop["index"]; + data_loop["parent"]["index1"] = data_loop["index1"]; + data_loop["parent"]["is_first"] = data_loop["is_first"]; + data_loop["parent"]["is_last"] = data_loop["is_last"]; + } data_loop[element_loop->value] = list[i]; data_loop["index"] = i; data_loop["index1"] = i + 1; diff --git a/test/src/unit-renderer.cpp b/test/src/unit-renderer.cpp index ffc3331..242d5dd 100644 --- a/test/src/unit-renderer.cpp +++ b/test/src/unit-renderer.cpp @@ -59,6 +59,7 @@ TEST_CASE("types") { data["empty_loop"] = {}; CHECK( env.render("{% for name in empty_loop %}a{% endfor %}", data) == "" ); + CHECK( env.render("{% for name in {} %}a{% endfor %}", data) == "" ); CHECK_THROWS_WITH( env.render("{% for name ins names %}a{% endfor %}", data), "[inja.exception.parser_error] unknown loop statement: for name ins names" ); // CHECK_THROWS_WITH( env.render("{% for name in relatives %}{{ name }}{% endfor %}", data), "[inja.exception.json_error] [json.exception.type_error.302] type must be array, but is object" );