From 208dd96edd45da54b8d389e59a5155a3db27ab69 Mon Sep 17 00:00:00 2001 From: Veloman Yunkan Date: Mon, 8 Sep 2025 18:38:05 +0400 Subject: [PATCH] Catalog-only mode of nojs welcome page --- src/html_dumper.cpp | 5 ++- src/server/internalServer.cpp | 7 +++- static/templates/no_js_library_page.html | 4 +- test/library_server.cpp | 47 ++++++++++++++++++++++++ 4 files changed, 58 insertions(+), 5 deletions(-) diff --git a/src/html_dumper.cpp b/src/html_dumper.cpp index d07d7375..ce610dc4 100644 --- a/src/html_dumper.cpp +++ b/src/html_dumper.cpp @@ -30,7 +30,7 @@ std::string humanFriendlyTitle(std::string title) kainjow::mustache::object getLangTag(const std::vector& bookLanguages) { std::string langShortString = ""; std::string langFullString = "???"; - + //if more than 1 languages then show "mul" else show the language if(bookLanguages.size() > 1) { std::vector mulLanguages; @@ -44,7 +44,7 @@ kainjow::mustache::object getLangTag(const std::vector& bookLanguag langShortString = bookLanguages[0]; langFullString = getLanguageSelfName(langShortString); } - + kainjow::mustache::object langTag; langTag["langShortString"] = langShortString; langTag["langFullString"] = langFullString; @@ -130,6 +130,7 @@ std::string HTMLDumper::dumpPlainHTML(kiwix::Filter filter) const RESOURCE::templates::no_js_library_page_html, kainjow::mustache::object{ {"root", rootLocation}, + {"contentServerUrl", onlyAsNonEmptyMustacheValue(contentServerUrl)}, {"books", booksData }, {"searchQuery", searchQuery}, {"languages", languages}, diff --git a/src/server/internalServer.cpp b/src/server/internalServer.cpp index 6e5443cc..7e599458 100644 --- a/src/server/internalServer.cpp +++ b/src/server/internalServer.cpp @@ -857,12 +857,17 @@ std::unique_ptr InternalServer::handle_no_js(const RequestContext& req HTMLDumper htmlDumper(mp_library.get(), mp_nameMapper.get()); htmlDumper.setRootLocation(m_root); htmlDumper.setLibraryId(getLibraryId()); + if ( !m_contentServerUrl.empty() ) { + htmlDumper.setContentServerUrl(m_contentServerUrl); + } else if ( !m_catalogOnlyMode ) { + htmlDumper.setContentServerUrl(m_root); + } auto userLang = request.get_user_language(); htmlDumper.setUserLanguage(userLang); std::string content; if (urlParts.size() == 1) { - auto filter = get_search_filter(request); + auto filter = get_search_filter(request, "", m_catalogOnlyMode); try { if (request.get_argument("category") == "") { filter.clearCategory(); diff --git a/static/templates/no_js_library_page.html b/static/templates/no_js_library_page.html index aaf61fa7..fdaece84 100644 --- a/static/templates/no_js_library_page.html +++ b/static/templates/no_js_library_page.html @@ -108,7 +108,7 @@

{{translations.count-of-matching-books}}

{{#books}}
- + {{#contentServerUrl}}{{/contentServerUrl}} - + {{#contentServerUrl}}{{/contentServerUrl}}
{{langTag.langShortString}}
diff --git a/test/library_server.cpp b/test/library_server.cpp index 7ffed4c1..03da70a6 100644 --- a/test/library_server.cpp +++ b/test/library_server.cpp @@ -1388,6 +1388,32 @@ TEST_F(LibraryServerTest, no_name_mapper_catalog_v2_individual_entry_access) "
\n" \ "
\n" +#define INACCESSIBLEZIMFILE_BOOK_HTML \ + " \n" + #define FINAL_HTML_TEXT \ "
\n" \ "
\n" \ @@ -1523,4 +1549,25 @@ TEST_F(LibraryServerTest, noJS) { EXPECT_EQ(r->body, RAY_CHARLES_UNCTZ_DOWNLOAD); } +TEST_F(LibraryServerTest, noJS_catalogOnlyMode) { + const std::string contentServerUrl = "https://demo.kiwix.org"; + const auto fixContentLinks = [=](std::string s) -> std::string { + s = replace(s, "/ROOT%23%3F/content", contentServerUrl + "/content"); + return s; + }; + resetServer(ZimFileServer::CATALOG_ONLY_MODE, contentServerUrl); + + auto r = zfs1_->GET("/ROOT%23%3F/nojs"); + EXPECT_EQ(r->status, 200); + EXPECT_EQ(r->body, + HTML_PREAMBLE + FILTERS_HTML("") + HOME_BODY_TEXT("4") + + fixContentLinks(CHARLES_RAY_BOOK_HTML) + + fixContentLinks(INACCESSIBLEZIMFILE_BOOK_HTML) + + fixContentLinks(RAY_CHARLES_BOOK_HTML) + + fixContentLinks(RAY_CHARLES_UNCTZ_BOOK_HTML) + + FINAL_HTML_TEXT); +} + #undef EXPECT_SEARCH_RESULTS