Archived
1
0

more nntpchan-daemon stuff

This commit is contained in:
Jeff Becker
2017-10-11 09:48:27 -04:00
parent ec7a17a647
commit 12bb8c4936
66 changed files with 1061 additions and 119 deletions

View File

@@ -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 "";
}

View File

@@ -0,0 +1,24 @@
#pragma once
#include <sstream>
#include <vector>
#include "render_state.hpp"
#include "../template_type.hpp"
namespace mstch {
class in_section: public render_state {
public:
enum class type { inverted, normal };
in_section(type type, const token& start_token);
std::string render(render_context& context, const token& token) override;
private:
const type m_type;
const token& m_start_token;
template_type m_section;
int m_skipped_openings;
};
}

View File

@@ -0,0 +1,32 @@
#include "outside_section.hpp"
#include "../visitor/render_node.hpp"
#include "in_section.hpp"
#include "../render_context.hpp"
using namespace mstch;
std::string outside_section::render(
render_context& ctx, const token& token)
{
using flag = render_node::flag;
switch (token.token_type()) {
case token::type::section_open:
ctx.set_state<in_section>(in_section::type::normal, token);
break;
case token::type::inverted_section_open:
ctx.set_state<in_section>(in_section::type::inverted, token);
break;
case token::type::variable:
return visit(render_node(ctx, flag::escape_html), ctx.get_node(token.name()));
case token::type::unescaped_variable:
return visit(render_node(ctx, flag::none), ctx.get_node(token.name()));
case token::type::text:
return token.raw();
case token::type::partial:
return ctx.render_partial(token.name(), token.partial_prefix());
default:
break;
}
return "";
}

View File

@@ -0,0 +1,12 @@
#pragma once
#include "render_state.hpp"
namespace mstch {
class outside_section: public render_state {
public:
std::string render(render_context& context, const token& token) override;
};
}

View File

@@ -0,0 +1,17 @@
#pragma once
#include <memory>
#include "../token.hpp"
namespace mstch {
class render_context;
class render_state {
public:
virtual ~render_state() {}
virtual std::string render(render_context& context, const token& token) = 0;
};
}