BareGit
#include "macrodown.h"
#include "block_parser.h"
#include "converter.h"
#include "standard_library.h"

namespace macrodown
{

MacroDown::MacroDown()
{
    StandardLibrary::registerMacros(evaluator_);
}

std::unique_ptr<Node> MacroDown::parse(const std::string& input)
{
    auto block_root = BlockParser::parse(input);
    auto macro_nodes = Converter::convert(block_root.get(), prefix_markups_, delimited_markups_);

    if(macro_nodes.empty())
    {
        return std::make_unique<Node>(Group{});
    }

    if(macro_nodes.size() == 1)
    {
        return std::move(macro_nodes[0]);
    }

    Group root_group;
    for(auto& node : macro_nodes)
    {
        root_group.addChild(std::move(node));
    }

    return std::make_unique<Node>(std::move(root_group));
}

std::string MacroDown::render(const Node& root)
{
    return evaluator_.evaluate(root);
}

void MacroDown::definePrefixMarkup(const PrefixMarkup& markup)
{
    prefix_markups_.push_back(markup);
}

void MacroDown::defineDelimitedMarkup(const DelimitedMarkup& markup)
{
    delimited_markups_.push_back(markup);
}

} // namespace macrodown