Loop vars for object loops (#145)

* loops vars for object loops

* Fix formatting

Co-authored-by: Craig Pepper <craig.a.pepper@boeing.com>
This commit is contained in:
craigpepper
2020-06-16 04:50:52 +10:00
committed by GitHub
parent d055973479
commit 9533ba5240
3 changed files with 17 additions and 15 deletions

View File

@@ -119,15 +119,15 @@ class Renderer {
if (level.loop_type == LoopLevel::Type::Array) {
level.data[static_cast<std::string>(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<std::string>(level.key_name)] = level.map_it->first;
level.data[static_cast<std::string>(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;

View File

@@ -3131,15 +3131,15 @@ class Renderer {
if (level.loop_type == LoopLevel::Type::Array) {
level.data[static_cast<std::string>(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<std::string>(level.key_name)] = level.map_it->first;
level.data[static_cast<std::string>(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;

View File

@@ -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!");