aboutsummaryrefslogtreecommitdiff
path: root/lib/mstch/src/state/in_section.cpp
blob: a1399132a2c2752b345dfa9343ba7de88e09e7b0 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
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 "";
}