From 9533ba52400d026564941f2950a756dcdeb55e30 Mon Sep 17 00:00:00 2001 From: craigpepper <33768643+craigpepper@users.noreply.github.com> Date: Tue, 16 Jun 2020 04:50:52 +1000 Subject: [PATCH] Loop vars for object loops (#145) * loops vars for object loops * Fix formatting Co-authored-by: Craig Pepper --- include/inja/renderer.hpp | 15 ++++++++------- single_include/inja/inja.hpp | 15 ++++++++------- test/unit-renderer.cpp | 2 +- 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/include/inja/renderer.hpp b/include/inja/renderer.hpp index b162518..71ccf64 100644 --- a/include/inja/renderer.hpp +++ b/include/inja/renderer.hpp @@ -119,15 +119,15 @@ class Renderer { if (level.loop_type == LoopLevel::Type::Array) { level.data[static_cast(level.value_name)] = level.values.at(level.index); // *level.it; - auto& loopData = level.data["loop"]; - loopData["index"] = level.index; - loopData["index1"] = level.index + 1; - loopData["is_first"] = (level.index == 0); - loopData["is_last"] = (level.index == level.size - 1); } else { level.data[static_cast(level.key_name)] = level.map_it->first; level.data[static_cast(level.value_name)] = *level.map_it->second; } + auto &loopData = level.data["loop"]; + loopData["index"] = level.index; + loopData["index1"] = level.index + 1; + loopData["is_first"] = (level.index == 0); + loopData["is_last"] = (level.index == level.size - 1); } const TemplateStorage& m_included_templates; @@ -494,6 +494,7 @@ class Renderer { level.value_name = bc.str; level.values = std::move(m_stack.back()); level.data = (*m_data); + level.index = 0; m_stack.pop_back(); if (bc.value.is_string()) { @@ -512,6 +513,7 @@ class Renderer { auto sort_lambda = [](const LoopLevel::KeyValue& a, const LoopLevel::KeyValue& b) { return a.first < b.first; }; std::sort(level.map_values.begin(), level.map_values.end(), sort_lambda); level.map_it = level.map_values.begin(); + level.size = level.map_values.size(); } else { if (!level.values.is_array()) { m_loop_stack.pop_back(); @@ -520,7 +522,6 @@ class Renderer { // list iterator level.loop_type = LoopLevel::Type::Array; - level.index = 0; level.size = level.values.size(); } @@ -543,8 +544,8 @@ class Renderer { LoopLevel& level = m_loop_stack.back(); bool done; + level.index += 1; if (level.loop_type == LoopLevel::Type::Array) { - level.index += 1; done = (level.index == level.values.size()); } else { level.map_it += 1; diff --git a/single_include/inja/inja.hpp b/single_include/inja/inja.hpp index bc82c31..ffa10ff 100644 --- a/single_include/inja/inja.hpp +++ b/single_include/inja/inja.hpp @@ -3131,15 +3131,15 @@ class Renderer { if (level.loop_type == LoopLevel::Type::Array) { level.data[static_cast(level.value_name)] = level.values.at(level.index); // *level.it; - auto& loopData = level.data["loop"]; - loopData["index"] = level.index; - loopData["index1"] = level.index + 1; - loopData["is_first"] = (level.index == 0); - loopData["is_last"] = (level.index == level.size - 1); } else { level.data[static_cast(level.key_name)] = level.map_it->first; level.data[static_cast(level.value_name)] = *level.map_it->second; } + auto &loopData = level.data["loop"]; + loopData["index"] = level.index; + loopData["index1"] = level.index + 1; + loopData["is_first"] = (level.index == 0); + loopData["is_last"] = (level.index == level.size - 1); } const TemplateStorage& m_included_templates; @@ -3506,6 +3506,7 @@ class Renderer { level.value_name = bc.str; level.values = std::move(m_stack.back()); level.data = (*m_data); + level.index = 0; m_stack.pop_back(); if (bc.value.is_string()) { @@ -3524,6 +3525,7 @@ class Renderer { auto sort_lambda = [](const LoopLevel::KeyValue& a, const LoopLevel::KeyValue& b) { return a.first < b.first; }; std::sort(level.map_values.begin(), level.map_values.end(), sort_lambda); level.map_it = level.map_values.begin(); + level.size = level.map_values.size(); } else { if (!level.values.is_array()) { m_loop_stack.pop_back(); @@ -3532,7 +3534,6 @@ class Renderer { // list iterator level.loop_type = LoopLevel::Type::Array; - level.index = 0; level.size = level.values.size(); } @@ -3555,8 +3556,8 @@ class Renderer { LoopLevel& level = m_loop_stack.back(); bool done; + level.index += 1; if (level.loop_type == LoopLevel::Type::Array) { - level.index += 1; done = (level.index == level.values.size()); } else { level.map_it += 1; diff --git a/test/unit-renderer.cpp b/test/unit-renderer.cpp index 8da544b..2aad11d 100644 --- a/test/unit-renderer.cpp +++ b/test/unit-renderer.cpp @@ -60,7 +60,7 @@ TEST_CASE("types") { 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 %}{{ 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 type, name in relatives %}{{ loop.index1 }}: {{ type }}: {{ name }}{% if loop.is_last == false %}, {% endif %}{% endfor %}", data) == "1: brother: Chris, 2: mother: Maria, 3: sister: Jenny"); CHECK(env.render("{% for v in vars %}{% if v > 0 %}+{% endif %}{% endfor %}", data) == "+++" ); 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!");