diff --git a/iparser.h b/iparser.h index c619338..da37009 100644 --- a/iparser.h +++ b/iparser.h @@ -23,6 +23,10 @@ class IParser } virtual std::string parse(const PageDao &pagedao, UrlProvider &provider, const std::string &content, const std::function &callback) const = 0; + + virtual std::string parseDynamics( + const std::string &content, + const std::function &callback) const = 0; virtual std::vector extractCategories(const std::string &content) const = 0; virtual ~IParser(){}; diff --git a/parser.cpp b/parser.cpp index 1ec0b48..9fe679d 100644 --- a/parser.cpp +++ b/parser.cpp @@ -30,7 +30,8 @@ SOFTWARE. std::vector Parser::extractHeadlines(const std::string &content) const { std::vector result; - std::string reg = R"(\[h(1|2|3)\](.*?)\[/h\1\])"; + + std::string reg = R"(\[h(1|2|3)\](\[.*?\])*(.*?)\[.*?\]*\[\/h\1\])"; std::regex headerfinder(reg); auto begin = std::sregex_iterator(content.begin(), content.end(), headerfinder); auto end = std::sregex_iterator(); @@ -40,7 +41,7 @@ std::vector Parser::extractHeadlines(const std::string &content) const auto smatch = *it; Headline h; h.level = utils::toUInt(smatch.str(1)); - h.title = smatch.str(2); + h.title = smatch.str(3); result.push_back(h); } return result; @@ -122,7 +123,7 @@ std::string Parser::parse(const PageDao &pagedao, UrlProvider &provider, const s std::string result; // we don't care about commands, but we nevertheless replace them with empty strings std::regex tagfinder( - R"(\[(b|i|u|li||ul|ol|link|wikilink|h\d|cmd:rename|cmd:redirect|cmd:pagetitle|category|dynamic:postlist|dynamic:includepage)*?\]((\s|\S)*?)\[/\1])"); + R"(\[(b|i|u|li||ul|ol|link|wikilink|h\d|cmd:rename|cmd:redirect|cmd:pagetitle|category|dynamic:postlist|dynamic:includepage|dynamic:getvar|dynamic:setvar)*?\]((\s|\S)*?)\[/\1])"); result = utils::regex_callback_replacer( tagfinder, content, [&](std::smatch &match) @@ -150,3 +151,11 @@ std::string Parser::parse(const PageDao &pagedao, UrlProvider &provider, const s result = utils::strreplace(result, "\r\n", "
"); return result; } + +std::string Parser::parseDynamics(const std::string &content, + const std::function &callback) const +{ + std::regex tagfinder(R"(\[(dynamic:\w+)*?\]((\s|\S)*?)\[/\1])"); + return utils::regex_callback_replacer(tagfinder, content, + [&](std::smatch &match) { return callback(match.str(1), match.str(2)); }); +} diff --git a/parser.h b/parser.h index 2c5a82a..863e034 100644 --- a/parser.h +++ b/parser.h @@ -15,6 +15,9 @@ class Parser : public IParser virtual std::string parse( const PageDao &pagedao, UrlProvider &provider, const std::string &content, const std::function &callback) const override; + std::string parseDynamics( + const std::string &content, + const std::function &callback) const override; using IParser::IParser; };