diff --git a/include/mstch/mstch.hpp b/include/mstch/mstch.hpp index 58d3330..de0c05e 100644 --- a/include/mstch/mstch.hpp +++ b/include/mstch/mstch.hpp @@ -103,11 +103,13 @@ using object = internal::object_t; using lambda = internal::lambda_t; using map = std::map; using array = std::vector; +using partial_callback = std::function; std::string render( const std::string& tmplt, const node& root, const std::map& partials = - std::map()); + std::map(), + partial_callback partial_cb = partial_callback()); } diff --git a/src/mstch.cpp b/src/mstch.cpp index 4d84e97..7cc7b9c 100644 --- a/src/mstch.cpp +++ b/src/mstch.cpp @@ -7,14 +7,14 @@ using namespace mstch; std::function mstch::config::escape; -std::string mstch::render( - const std::string& tmplt, +std::string mstch::render(const std::string& tmplt, const node& root, - const std::map& partials) + const std::map& partials, + partial_callback partial_cb) { std::map partial_templates; for (auto& partial: partials) partial_templates.insert({partial.first, {partial.second}}); - return render_context(root, partial_templates).render(tmplt); + return render_context(root, partial_templates, partial_cb).render(tmplt); } diff --git a/src/render_context.cpp b/src/render_context.cpp index 90b2ffc..35e4504 100644 --- a/src/render_context.cpp +++ b/src/render_context.cpp @@ -24,10 +24,9 @@ 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& partials): - m_partials(partials), m_nodes(1, node), m_node_ptrs(1, &node) +render_context::render_context(const mstch::node& node, + const std::map& partials, const partial_callback partial_cb): + m_partials(partials), m_nodes(1, node), m_node_ptrs(1, &node), m_partial_cb(partial_cb) { m_state.push(std::unique_ptr(new outside_section)); } @@ -67,6 +66,11 @@ std::string render_context::render( 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) : ""; + if(m_partials.count(partial_name)) { + return render(m_partials.at(partial_name), prefix); + } else if (m_partial_cb) { + return render({m_partial_cb(partial_name)}, prefix); + } else { + return ""; + } } diff --git a/src/render_context.hpp b/src/render_context.hpp index b97d41b..a5fb5df 100644 --- a/src/render_context.hpp +++ b/src/render_context.hpp @@ -25,7 +25,8 @@ class render_context { render_context( const mstch::node& node, - const std::map& partials); + const std::map& partials, + const partial_callback partial_cb); const mstch::node& get_node(const std::string& token); std::string render( const template_type& templt, const std::string& prefix = ""); @@ -46,6 +47,7 @@ class render_context { std::deque m_nodes; std::list m_node_ptrs; std::stack> m_state; + partial_callback m_partial_cb; }; }