diff --git a/README.md b/README.md index 4bb870c..8a48d5d 100644 --- a/README.md +++ b/README.md @@ -128,7 +128,7 @@ Statements can be written either with the `{% ... %}` syntax or the `##` syntax // Combining loops and line statements render(R"(Guest List: ## for guest in guests - {{ index1 }}: {{ guest }} + {{ loop/index1 }}: {{ guest }} ## endfor )", data) /* Guest List: @@ -136,7 +136,7 @@ render(R"(Guest List: 2: Tom 3: Patrick */ ``` -In a loop, the special variables `index (number)`, `index1 (number)`, `is_first (boolean)` and `is_last (boolean)` are available. You can also iterate over objects like `{% for key, value in time %}`. +In a loop, the special variables `loop/index (number)`, `loop/index1 (number)`, `loop/is_first (boolean)` and `loop/is_last (boolean)` are defined. In nested loops, the parent loop variables are available e.g. via `loop/parent/index`. You can also iterate over objects like `{% for key, value in time %}`. #### Conditions @@ -176,7 +176,7 @@ render("Hello {{ upper(neighbour) }}!", data); // "Hello PETER!" render("Hello {{ lower(neighbour) }}!", data); // "Hello peter!" // Range function, useful for loops -render("{% for i in range(4) %}{{ index1 }}{% endfor %}", data); // "1234" +render("{% for i in range(4) %}{{ loop/index1 }}{% endfor %}", data); // "1234" // Length function (please don't combine with range, use list directly...) render("I count {{ length(guests) }} guests.", data); // "I count 3 guests." diff --git a/src/inja.hpp b/src/inja.hpp index dc0f80c..47298f6 100644 --- a/src/inja.hpp +++ b/src/inja.hpp @@ -557,17 +557,14 @@ public: 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("index1") == 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"]; + if (data_loop.count("loop") == 1) { + data_loop["loop"]["parent"] = data_loop["loop"]; } data_loop[element_loop->value] = list[i]; - data_loop["index"] = i; - data_loop["index1"] = i + 1; - data_loop["is_first"] = (i == 0); - data_loop["is_last"] = (i == list.size() - 1); + data_loop["loop"]["index"] = i; + data_loop["loop"]["index1"] = i + 1; + data_loop["loop"]["is_first"] = (i == 0); + data_loop["loop"]["is_last"] = (i == list.size() - 1); result.append( render(Template(*element_loop), data_loop) ); } break; diff --git a/test/src/unit-renderer.cpp b/test/src/unit-renderer.cpp index 58c2d23..19ee0bc 100644 --- a/test/src/unit-renderer.cpp +++ b/test/src/unit-renderer.cpp @@ -51,11 +51,11 @@ TEST_CASE("types") { SECTION("loops") { CHECK( env.render("{% for name in names %}a{% endfor %}", data) == "aa" ); CHECK( env.render("Hello {% for name in names %}{{ name }} {% endfor %}!", data) == "Hello Jeff Seb !" ); - CHECK( env.render("Hello {% for name in names %}{{ index }}: {{ name }}, {% endfor %}!", data) == "Hello 0: Jeff, 1: Seb, !" ); + CHECK( env.render("Hello {% for name in names %}{{ loop/index }}: {{ name }}, {% endfor %}!", data) == "Hello 0: Jeff, 1: Seb, !" ); CHECK( env.render("{% for type, name in relatives %}{{ type }}: {{ name }}, {% endfor %}", data) == "brother: Chris, mother: Maria, sister: Jenny, " ); CHECK( env.render("{% for v in vars %}{% if v > 0 %}+{% endif %}{% endfor %}", data) == "+++" ); - CHECK( env.render("{% for name in names %}{{ index }}: {{ name }}{% if not is_last %}, {% endif %}{% endfor %}!", data) == "0: Jeff, 1: Seb!" ); - CHECK( env.render("{% for name in names %}{{ index }}: {{ name }}{% if is_last == false %}, {% endif %}{% endfor %}!", data) == "0: Jeff, 1: Seb!" ); + CHECK( env.render("{% for name in names %}{{ loop/index }}: {{ name }}{% if not loop/is_last %}, {% endif %}{% endfor %}!", data) == "0: Jeff, 1: Seb!" ); + CHECK( env.render("{% for name in names %}{{ loop/index }}: {{ name }}{% if loop/is_last == false %}, {% endif %}{% endfor %}!", data) == "0: Jeff, 1: Seb!" ); data["empty_loop"] = {}; CHECK( env.render("{% for name in empty_loop %}a{% endfor %}", data) == "" ); @@ -284,7 +284,7 @@ TEST_CASE("combinations") { CHECK( env.render("{% if upper(\"Peter\") == \"PETER\" %}TRUE{% endif %}", data) == "TRUE" ); CHECK( env.render("{% if lower(upper(name)) == \"peter\" %}TRUE{% endif %}", data) == "TRUE" ); - CHECK( env.render("{% for i in range(4) %}{{ index1 }}{% endfor %}", data) == "1234" ); + CHECK( env.render("{% for i in range(4) %}{{ loop/index1 }}{% endfor %}", data) == "1234" ); } TEST_CASE("templates") {