diff --git a/dynamic/dynamiccontent.h b/dynamic/dynamiccontent.h index 44505ca..c07592a 100644 --- a/dynamic/dynamiccontent.h +++ b/dynamic/dynamiccontent.h @@ -11,9 +11,15 @@ class DynamicContent Database *database; UrlProvider *urlProvider; + std::string argument; + public: DynamicContent(Template &templ, Database &database, UrlProvider &urlProvider); virtual std::string render() = 0; + virtual void setArgument(std::string argument) + { + this->argument = argument; + } virtual ~DynamicContent() { } diff --git a/dynamic/dynamiccontentincludepage.cpp b/dynamic/dynamiccontentincludepage.cpp new file mode 100644 index 0000000..52e1ac4 --- /dev/null +++ b/dynamic/dynamiccontentincludepage.cpp @@ -0,0 +1,14 @@ +#include "dynamiccontentincludepage.h" +#include "../parser.h" +std::string DynamicContentIncludePage::render() +{ + auto revisionDao = this->database->createRevisionDao(); + auto rev = revisionDao->getCurrentForPage(this->argument); + if(rev) + { + Parser parser; + auto result = parser.parse(*this->database->createPageDao(), *this->urlProvider, rev->content); + return result; + } + return {}; +} diff --git a/dynamic/dynamiccontentincludepage.h b/dynamic/dynamiccontentincludepage.h new file mode 100644 index 0000000..a18b227 --- /dev/null +++ b/dynamic/dynamiccontentincludepage.h @@ -0,0 +1,12 @@ +#ifndef DYNAMICCONTENTINCLUDEPAGE_H +#define DYNAMICCONTENTINCLUDEPAGE_H +#include "dynamiccontent.h" +class DynamicContentIncludePage : public DynamicContent +{ + public: + using DynamicContent::DynamicContent; + + std::string render(); +}; + +#endif // DYNAMICCONTENTINCLUDEPAGE_H diff --git a/dynamic/dynamiccontentpostlist.cpp b/dynamic/dynamiccontentpostlist.cpp index 4d18133..9c3d439 100644 --- a/dynamic/dynamiccontentpostlist.cpp +++ b/dynamic/dynamiccontentpostlist.cpp @@ -1,11 +1,6 @@ #include #include "dynamiccontentpostlist.h" -void DynamicContentPostList::setCategory(std::string catname) -{ - this->catname = catname; -} - std::string DynamicContentPostList::render() { auto categoryDao = this->database->createCategoryDao(); @@ -13,7 +8,7 @@ std::string DynamicContentPostList::render() auto revisionDao = this->database->createRevisionDao(); QueryOption option; option.includeInvisible = false; - auto members = categoryDao->fetchMembers(this->catname, option); + auto members = categoryDao->fetchMembers(this->argument, option); std::vector> pageList; for(std::string &member : members) { diff --git a/dynamic/dynamiccontentpostlist.h b/dynamic/dynamiccontentpostlist.h index 55d982f..6d940ba 100644 --- a/dynamic/dynamiccontentpostlist.h +++ b/dynamic/dynamiccontentpostlist.h @@ -4,12 +4,8 @@ #include "dynamiccontent.h" class DynamicContentPostList : public DynamicContent { - private: - std::string catname; - public: using DynamicContent::DynamicContent; - void setCategory(std::string catname); std::string render() override; }; diff --git a/handlers/handlerpageview.cpp b/handlers/handlerpageview.cpp index 5dfb0e0..3599c69 100644 --- a/handlers/handlerpageview.cpp +++ b/handlers/handlerpageview.cpp @@ -24,6 +24,7 @@ SOFTWARE. #include "../parser.h" #include "../htmllink.h" #include "../dynamic/dynamiccontentpostlist.h" +#include "../dynamic/dynamiccontentincludepage.h" bool HandlerPageView::canAccess(std::string page) { return effectivePermissions(page).canRead(); @@ -142,9 +143,15 @@ Response HandlerPageView::handleRequest(PageDao &pageDao, std::string pagename, if(key == "dynamic:postlist") { std::shared_ptr postlist = createDynamic(); - postlist->setCategory(std::string(value)); + postlist->setArgument(std::string(value)); return postlist->render(); } + if(key == "dynamic:includepage") + { + std::shared_ptr includePage = createDynamic(); + includePage->setArgument(std::string(value)); + return includePage->render(); + } return std::string{}; }; if(revisionid > 0) diff --git a/parser.cpp b/parser.cpp index 3f971c8..1ec0b48 100644 --- a/parser.cpp +++ b/parser.cpp @@ -122,7 +122,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)*?\]((\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)*?\]((\s|\S)*?)\[/\1])"); result = utils::regex_callback_replacer( tagfinder, content, [&](std::smatch &match)