mirror of
https://github.com/pantor/inja.git
synced 2026-06-23 11:04:17 +00:00
use loop object for loop variables
This commit is contained in:
@@ -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."
|
||||
|
||||
+6
-9
@@ -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;
|
||||
|
||||
@@ -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") {
|
||||
|
||||
Reference in New Issue
Block a user