From 534d9f74e7df03bc600b9767d97353464deacf36 Mon Sep 17 00:00:00 2001 From: Albert S Date: Sat, 24 Apr 2021 12:10:57 +0200 Subject: [PATCH] ParserMarkdown: Implement processLink --- parsermarkdown.cpp | 41 ++++++++++++++++++++++++++++++++++++++--- parsermarkdown.h | 5 +++-- 2 files changed, 41 insertions(+), 5 deletions(-) diff --git a/parsermarkdown.cpp b/parsermarkdown.cpp index 1a2e890..407a8b5 100644 --- a/parsermarkdown.cpp +++ b/parsermarkdown.cpp @@ -1,8 +1,36 @@ #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 @@ -21,6 +49,13 @@ std::string ParserMarkdown::parse(const PageDao &pagedao, UrlProvider &provider, { std::shared_ptr config = std::make_shared(); auto maddy = std::make_shared(config); - std::stringstream s { content }; - return maddy->Parse(s); + + 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; } diff --git a/parsermarkdown.h b/parsermarkdown.h index 4ec30f5..da284fc 100644 --- a/parsermarkdown.h +++ b/parsermarkdown.h @@ -5,10 +5,11 @@ #include "maddy/parser.h" class ParserMarkdown : public Parser { -public: - ParserMarkdown(); +private: + std::string processLink(const PageDao &pageDao, UrlProvider &urlProvider, std::smatch &match) const; public: + ParserMarkdown(); std::vector extractHeadlines(std::string content) const; std::string parse(const PageDao &pagedao, UrlProvider &provider, std::string content) const; };