]> Creatis software - cpPlugins.git/blobdiff - lib/mstch/render_context.cpp
Moved to version 1.0
[cpPlugins.git] / lib / mstch / render_context.cpp
diff --git a/lib/mstch/render_context.cpp b/lib/mstch/render_context.cpp
new file mode 100644 (file)
index 0000000..90b2ffc
--- /dev/null
@@ -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) : "";
+}