diff --git a/include/library.h b/include/library.h index fa8f24263..3fefa140e 100644 --- a/include/library.h +++ b/include/library.h @@ -120,6 +120,8 @@ class Filter { Filter& maxSize(size_t size); Filter& query(std::string query, bool partial=true); Filter& name(std::string name); + Filter& clearLang(); + Filter& clearCategory(); bool hasQuery() const; const std::string& getQuery() const { return _query; } diff --git a/src/html_dumper.cpp b/src/html_dumper.cpp index d11a0b5da..31aae9259 100644 --- a/src/html_dumper.cpp +++ b/src/html_dumper.cpp @@ -2,6 +2,7 @@ #include "libkiwix-resources.h" #include "tools/otherTools.h" #include "tools.h" +#include "tools/regexTools.h" namespace kiwix { @@ -18,6 +19,13 @@ HTMLDumper::~HTMLDumper() namespace { +std::string humanFriendlyTitle(std::string title) +{ + std::string humanFriendlyString = replaceRegex(title, "_", " "); + humanFriendlyString[0] = toupper(humanFriendlyString[0]); + return humanFriendlyString; +} + kainjow::mustache::list getTagList(std::string tags) { const auto tagsList = kiwix::split(tags, ";", true, false); @@ -38,6 +46,22 @@ std::string HTMLDumper::dumpPlainHTML(kiwix::Filter filter) const kainjow::mustache::list booksData; const auto filteredBooks = library->filter(filter); const auto searchQuery = filter.getQuery(); + auto languages = getLanguageData(); + auto categories = getCategoryData(); + + for (auto &category : categories) { + const auto categoryName = category.get("name")->string_value(); + if (categoryName == filter.getCategory()) { + category["selected"] = true; + } + category["hf_name"] = humanFriendlyTitle(categoryName); + } + + for (auto &language : languages) { + if (language.get("lang_code")->string_value() == filter.getLang()) { + language["selected"] = true; + } + } for ( const auto& bookId : filteredBooks ) { const auto bookObj = library->getBookById(bookId); @@ -70,7 +94,9 @@ std::string HTMLDumper::dumpPlainHTML(kiwix::Filter filter) const {"root", rootLocation}, {"books", booksData }, {"searchQuery", searchQuery}, - {"resultsCount", to_string(filteredBooks.size())} + {"resultsCount", to_string(filteredBooks.size())}, + {"languages", languages}, + {"categories", categories} } ); } diff --git a/src/library.cpp b/src/library.cpp index 4982a70bd..4ce865b7f 100644 --- a/src/library.cpp +++ b/src/library.cpp @@ -878,6 +878,18 @@ Filter& Filter::name(std::string name) return *this; } +Filter& Filter::clearLang() +{ + activeFilters &= ~LANG; + return *this; +} + +Filter& Filter::clearCategory() +{ + activeFilters &= ~CATEGORY; + return *this; +} + #define ACTIVE(X) (activeFilters & (X)) #define FILTER(TAG, TEST) if (ACTIVE(TAG) && !(TEST)) { return false; } bool Filter::hasQuery() const diff --git a/src/library_dumper.cpp b/src/library_dumper.cpp index 81880db3b..04aeaefd7 100644 --- a/src/library_dumper.cpp +++ b/src/library_dumper.cpp @@ -2,7 +2,6 @@ #include "tools/stringTools.h" #include "tools/otherTools.h" #include "tools.h" -#include "tools/regexTools.h" namespace kiwix { diff --git a/src/server/internalServer.cpp b/src/server/internalServer.cpp index 060d41860..799ed8e5b 100644 --- a/src/server/internalServer.cpp +++ b/src/server/internalServer.cpp @@ -783,7 +783,17 @@ std::unique_ptr InternalServer::handle_no_js(const RequestContext& req std::string content; if (urlParts.size() == 1) { - const auto filter = get_search_filter(request); + auto filter = get_search_filter(request); + try { + if (request.get_argument("category") == "") { + filter.clearCategory(); + } + } catch (...) {} + try { + if (request.get_argument("lang") == "") { + filter.clearLang(); + } + } catch (...) {} content = htmlDumper.dumpPlainHTML(filter); } else if ((urlParts.size() == 3) && (urlParts[1] == "download")) { try { diff --git a/static/templates/no_js_library_page.html b/static/templates/no_js_library_page.html index 9a791b050..d96f2ed7f 100644 --- a/static/templates/no_js_library_page.html +++ b/static/templates/no_js_library_page.html @@ -66,6 +66,24 @@
+
+
+ +
+
+ +
+