diff options
Diffstat (limited to 'lib/mstch/src/render_context.cpp')
| -rw-r--r-- | lib/mstch/src/render_context.cpp | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/lib/mstch/src/render_context.cpp b/lib/mstch/src/render_context.cpp new file mode 100644 index 0000000..90b2ffc --- /dev/null +++ b/lib/mstch/src/render_context.cpp @@ -0,0 +1,72 @@ +#include "render_context.hpp" +#include "state/outside_section.hpp" +#include "visitor/get_token.hpp" + +using namespace mstch; + +const mstch::node render_context::null_node; + +render_context::push::push(render_context& context, const mstch::node& node): + m_context(context) +{ + context.m_nodes.emplace_front(node); + context.m_node_ptrs.emplace_front(&node); + context.m_state.push(std::unique_ptr<render_state>(new outside_section)); +} + +render_context::push::~push() { + m_context.m_nodes.pop_front(); + m_context.m_node_ptrs.pop_front(); + m_context.m_state.pop(); +} + +std::string render_context::push::render(const template_type& templt) { + return m_context.render(templt); +} + +render_context::render_context( + const mstch::node& node, + const std::map<std::string, template_type>& partials): + m_partials(partials), m_nodes(1, node), m_node_ptrs(1, &node) +{ + m_state.push(std::unique_ptr<render_state>(new outside_section)); +} + +const mstch::node& render_context::find_node( + const std::string& token, + std::list<node const*> current_nodes) +{ + 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; +} + +const mstch::node& render_context::get_node(const std::string& token) { + return find_node(token, m_node_ptrs); +} + +std::string render_context::render( + const template_type& templt, const std::string& prefix) +{ + std::string output; + bool prev_eol = true; + for (auto& token: templt) { + if (prev_eol && prefix.length() != 0) + output += m_state.top()->render(*this, {prefix}); + output += m_state.top()->render(*this, token); + prev_eol = token.eol(); + } + return output; +} + +std::string render_context::render_partial( + const std::string& partial_name, const std::string& prefix) +{ + return m_partials.count(partial_name) ? + render(m_partials.at(partial_name), prefix) : ""; +} |
