diff --git a/pagelistrenderer.cpp b/pagelistrenderer.cpp new file mode 100644 index 0000000..fc70e4c --- /dev/null +++ b/pagelistrenderer.cpp @@ -0,0 +1,66 @@ +#include "pagelistrenderer.h" +#include "grouper.h" + +PageListRenderer::PageListRenderer(Template &templ, UrlProvider &provider, Database &database) +{ + this->templ = &templ; + this->urlProvider = &provider; + this->database = &database; +} + +std::string PageListRenderer::render(const std::vector &pagelist, std::string type) const +{ + TemplatePage pagelistrendergroup = this->templ->loadResolvedPart("pagelistrender_group"); + TemplatePage pagelistlink = this->templ->loadResolvedPart("pagelistrender_link"); + + + std::function lesser = [](const std::string &a, const std::string &b) -> bool { + return a < b; + }; + + std::function greater = [](const std::string &a, const std::string &b) -> bool { + return a > b; + }; + + using Grouper = Grouper>; + + Grouper grouper = (type == "letter") ? Grouper(lesser) : Grouper(greater); + if(type == "letter") + { + auto az = [&](const Page &p) -> std::string { + int upper = toupper(p.title[0]); // TODO: this is not unicode safe. + return { (char)upper }; + }; + grouper.group(az, pagelist); + } + else + { + auto revisionDao = this->database->createRevisionDao(); + auto creationdate = [&revisionDao](const Page &p) -> std::string { + return utils::formatLocalDate(revisionDao->getRevisionForPage(p.name, 1).value().timestamp, "%Y-%m"); + }; + grouper.group(creationdate, pagelist); + } + + std::stringstream stream; + std::string lastGroup = ""; + + for(auto &entry : grouper.getResults()) + { + std::string groupname = entry.first; + const std::vector &pages = entry.second; + if(lastGroup != groupname) + { + lastGroup = groupname; + pagelistrendergroup.setVar("groupname", groupname); + stream << pagelistrendergroup.render(); + } + for(const Page *p : pages) + { + pagelistlink.setVar("inner", p->title); + pagelistlink.setVar("href", this->urlProvider->page(p->name)); + stream << pagelistlink.render(); + } + } + return stream.str(); +} diff --git a/pagelistrenderer.h b/pagelistrenderer.h new file mode 100644 index 0000000..3b97027 --- /dev/null +++ b/pagelistrenderer.h @@ -0,0 +1,27 @@ +#ifndef PAGELISTRENDERER_H +#define PAGELISTRENDERER_H +#include "utils.h" +#include "page.h" +#include "template.h" +#include "htmllink.h" +#include "urlprovider.h" +#include "database/database.h" + +class PageListRenderer +{ +private: + Template *templ; + UrlProvider *urlProvider; + Database *database; + +public: + PageListRenderer(Template &templ, UrlProvider &provider, Database &database); + + std::string render(const std::vector &pages, std::string type) const; + + inline static const std::string RENDER_GROUP_BY_LETTER { "letter" }; + inline static const std::string RENDER_GROUP_BY_CREATIONDATE { "creationdate" }; + + +}; +#endif diff --git a/template/quitesimple/pagelistrender b/template/quitesimple/pagelistrender new file mode 100644 index 0000000..ec9cadf --- /dev/null +++ b/template/quitesimple/pagelistrender @@ -0,0 +1,3 @@ +{qswiki:include:pagelistrender_header} +{qswiki:var:pagelistcontent} +{qswiki:include:pagelistrender_footer} diff --git a/template/quitesimple/pagelistrender_footer b/template/quitesimple/pagelistrender_footer new file mode 100644 index 0000000..e69de29 diff --git a/template/quitesimple/pagelistrender_group b/template/quitesimple/pagelistrender_group new file mode 100644 index 0000000..0d11b3e --- /dev/null +++ b/template/quitesimple/pagelistrender_group @@ -0,0 +1 @@ +
{qswiki:var:groupname}
diff --git a/template/quitesimple/pagelistrender_header b/template/quitesimple/pagelistrender_header new file mode 100644 index 0000000..49d12c0 --- /dev/null +++ b/template/quitesimple/pagelistrender_header @@ -0,0 +1 @@ +Sort by: A-Z - Creation date diff --git a/template/quitesimple/pagelistrender_link b/template/quitesimple/pagelistrender_link new file mode 100644 index 0000000..f44ee24 --- /dev/null +++ b/template/quitesimple/pagelistrender_link @@ -0,0 +1 @@ +{qswiki:var:inner}