2015-04-12 15:35:13 +02:00
|
|
|
#include "render_context.hpp"
|
2015-04-12 17:11:49 +02:00
|
|
|
#include "utils.hpp"
|
2015-04-13 02:15:51 +02:00
|
|
|
#include "state/outside_section.hpp"
|
2015-04-16 21:05:59 +02:00
|
|
|
#include "visitor/get_token.hpp"
|
2015-04-21 15:04:11 +02:00
|
|
|
#include "visitor/has_token.hpp"
|
2015-04-09 20:41:27 +02:00
|
|
|
|
|
|
|
using namespace mstch;
|
2015-04-23 12:54:08 +02:00
|
|
|
using namespace mstch::visitor;
|
2015-04-09 20:41:27 +02:00
|
|
|
|
|
|
|
const mstch::node render_context::null_node;
|
|
|
|
|
2015-04-16 21:05:59 +02:00
|
|
|
render_context::push::push(render_context& context, const mstch::node& node):
|
2015-04-23 12:54:08 +02:00
|
|
|
context(context)
|
2015-04-09 20:41:27 +02:00
|
|
|
{
|
2015-04-23 12:54:08 +02:00
|
|
|
context.nodes.emplace_front(node);
|
|
|
|
context.state.push(std::unique_ptr<state::render_state>(
|
|
|
|
new state::outside_section));
|
2015-04-13 02:15:51 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
render_context::push::~push() {
|
2015-04-23 12:54:08 +02:00
|
|
|
context.nodes.pop_front();
|
|
|
|
context.state.pop();
|
2015-04-13 02:15:51 +02:00
|
|
|
}
|
|
|
|
|
2015-04-16 00:49:45 +02:00
|
|
|
std::string render_context::push::render(const template_type& templt) {
|
2015-04-23 12:54:08 +02:00
|
|
|
return context.render(templt);
|
2015-04-09 20:41:27 +02:00
|
|
|
}
|
|
|
|
|
2015-04-10 12:56:08 +02:00
|
|
|
render_context::render_context(
|
2015-04-23 12:54:08 +02:00
|
|
|
const mstch::node& node,
|
|
|
|
const std::map<std::string, template_type>& partials):
|
|
|
|
partials{partials},
|
|
|
|
nodes{node}
|
2015-04-09 20:41:27 +02:00
|
|
|
{
|
2015-04-23 12:54:08 +02:00
|
|
|
state.push(std::unique_ptr<state::render_state>(
|
|
|
|
new state::outside_section));
|
2015-04-09 20:41:27 +02:00
|
|
|
}
|
|
|
|
|
2015-04-21 15:04:11 +02:00
|
|
|
const mstch::node& render_context::find_node(
|
2015-04-23 12:54:08 +02:00
|
|
|
const std::string& token,
|
|
|
|
const std::deque<node>& current_nodes)
|
2015-04-10 12:56:08 +02:00
|
|
|
{
|
2015-04-23 12:54:08 +02:00
|
|
|
if (token != "." && token.find('.') != std::string::npos)
|
|
|
|
return find_node(
|
|
|
|
token.substr(token.rfind('.') + 1),
|
|
|
|
{find_node(token.substr(0, token.rfind('.')), current_nodes)});
|
|
|
|
else
|
|
|
|
for (auto& node: current_nodes)
|
|
|
|
if (visit(has_token(token), node))
|
|
|
|
return visit(get_token(token, node), node);
|
|
|
|
return null_node;
|
2015-04-09 20:41:27 +02:00
|
|
|
}
|
|
|
|
|
2015-04-21 15:04:11 +02:00
|
|
|
const mstch::node& render_context::get_node(const std::string& token) {
|
2015-04-23 12:54:08 +02:00
|
|
|
return find_node(token, nodes);
|
2015-04-09 20:41:27 +02:00
|
|
|
}
|
|
|
|
|
2015-04-16 00:49:45 +02:00
|
|
|
std::string render_context::render(const template_type& templt) {
|
2015-04-23 12:54:08 +02:00
|
|
|
std::string output;
|
|
|
|
for (auto& token: templt)
|
|
|
|
output += state.top()->render(*this, token);
|
|
|
|
return output;
|
2015-04-09 20:41:27 +02:00
|
|
|
}
|
2015-04-12 17:11:49 +02:00
|
|
|
|
|
|
|
std::string render_context::render_partial(const std::string& partial_name) {
|
2015-04-23 12:54:08 +02:00
|
|
|
return (partials.count(partial_name))?render(partials.at(partial_name)):"";
|
2015-04-12 17:11:49 +02:00
|
|
|
}
|