#include "parsermarkdown.h" #include "logger.h" #include "htmllink.h" std::string ParserMarkdown::processLink(const PageDao &pageDao, UrlProvider &urlProvider, std::smatch &match) const { std::string inner = match.str(1); std::string link = match.str(2); HtmlLink htmllink; htmllink.href = link; htmllink.innervalue = inner; if(link.find("http://") == 0 || link.find("https://") == 0) { return htmllink.render(); } if(pageDao.exists(link)) { htmllink.cssclass = "exists"; } else { htmllink.cssclass = "notexists"; } htmllink.href = urlProvider.page(htmllink.href); return htmllink.render(); } ParserMarkdown::ParserMarkdown() { } std::vector ParserMarkdown::extractHeadlines(std::string content) const { std::vector result; utils::regex_callback_extractor(std::regex(R"((#{1,6}) (.*))"), content, [&](std::smatch &smatch) { Headline h; h.level = smatch.str(1).length(); h.title = smatch.str(2); result.push_back(h); }); return result; } std::string ParserMarkdown::parse(const PageDao &pagedao, UrlProvider &provider, std::string content) const { std::shared_ptr config = std::make_shared(); auto maddy = std::make_shared(config); auto linkParser = std::make_shared(); linkParser->setCallback([&](std::smatch &match) { return processLink(pagedao, provider, match); }); maddy->setLinkParser(linkParser); // TODO: hack because the parser breaks if there is an \r content = utils::strreplace(content, "\r", ""); std::stringstream s{content}; std::string result = maddy->Parse(s); return result; } std::string ParserMarkdown::extractCommand(std::string cmdname, std::string content) const { return ""; } std::vector ParserMarkdown::extractCategories(std::string content) const { return { }; }