]> Creatis software - cpPlugins.git/blobdiff - lib/mstch/state/in_section.cpp
Moved to version 1.0
[cpPlugins.git] / lib / mstch / state / in_section.cpp
diff --git a/lib/mstch/state/in_section.cpp b/lib/mstch/state/in_section.cpp
new file mode 100644 (file)
index 0000000..a139913
--- /dev/null
@@ -0,0 +1,34 @@
+#include "in_section.hpp"
+#include "outside_section.hpp"
+#include "visitor/is_node_empty.hpp"
+#include "visitor/render_section.hpp"
+
+using namespace mstch;
+
+in_section::in_section(type type, const token& start_token):
+    m_type(type), m_start_token(start_token), m_skipped_openings(0)
+{
+}
+
+std::string in_section::render(render_context& ctx, const token& token) {
+  if (token.token_type() == token::type::section_close)
+    if (token.name() == m_start_token.name() && m_skipped_openings == 0) {
+      auto& node = ctx.get_node(m_start_token.name());
+      std::string out;
+
+      if (m_type == type::normal && !visit(is_node_empty(), node))
+        out = visit(render_section(ctx, m_section, m_start_token.delims()), node);
+      else if (m_type == type::inverted && visit(is_node_empty(), node))
+        out = render_context::push(ctx).render(m_section);
+
+      ctx.set_state<outside_section>();
+      return out;
+    } else
+      m_skipped_openings--;
+  else if (token.token_type() == token::type::inverted_section_open ||
+      token.token_type() == token::type::section_open)
+    m_skipped_openings++;
+
+  m_section << token;
+  return "";
+}