From f0dd34b6db6844cbb6db021460968f31adb18d26 Mon Sep 17 00:00:00 2001 From: Matthieu Gautier Date: Thu, 5 May 2022 17:42:16 +0200 Subject: [PATCH] Introduce buildQueryData helper in SearchRenderer --- include/search_renderer.h | 3 +++ src/search_renderer.cpp | 36 ++++++++++++++++++++++------- src/server/internalServer.cpp | 2 +- static/templates/search_result.html | 8 +++---- 4 files changed, 36 insertions(+), 13 deletions(-) diff --git a/include/search_renderer.h b/include/search_renderer.h index 627699a69..cd499d13d 100644 --- a/include/search_renderer.h +++ b/include/search_renderer.h @@ -75,6 +75,9 @@ class SearchRenderer ~SearchRenderer(); + /** + * Set the search pattern used to do the search + */ void setSearchPattern(const std::string& pattern); /** diff --git a/src/search_renderer.cpp b/src/search_renderer.cpp index 34478dcad..0381d424d 100644 --- a/src/search_renderer.cpp +++ b/src/search_renderer.cpp @@ -58,7 +58,7 @@ SearchRenderer::SearchRenderer(zim::SearchResultSet srs, NameMapper* mapper, Lib mp_nameMapper(mapper), mp_library(library), protocolPrefix("zim://"), - searchProtocolPrefix("search://?"), + searchProtocolPrefix("search://"), estimatedResultCount(estimatedResultCount), resultStart(start) {} @@ -68,12 +68,12 @@ SearchRenderer::~SearchRenderer() = default; void SearchRenderer::setSearchPattern(const std::string& pattern) { - this->searchPattern = pattern; + searchPattern = pattern; } -void SearchRenderer::setSearchContent(const std::string& name) +void SearchRenderer::setSearchContent(const std::string& content) { - this->searchContent = name; + searchContent = content; } void SearchRenderer::setProtocolPrefix(const std::string& prefix) @@ -86,6 +86,21 @@ void SearchRenderer::setSearchProtocolPrefix(const std::string& prefix) this->searchProtocolPrefix = prefix; } +kainjow::mustache::data buildQueryData +( + const std::string& searchProtocolPrefix, + const std::string& pattern, + const std::string& searchContent +) { + kainjow::mustache::data query; + query.set("pattern", kiwix::encodeDiples(pattern)); + std::ostringstream ss; + ss << searchProtocolPrefix << "?pattern=" << urlEncode(pattern, true); + ss << "&content=" << urlEncode(searchContent, true); + query.set("unpaginatedQuery", ss.str()); + return query; +} + kainjow::mustache::data buildPagination( unsigned int pageLength, unsigned int resultsCount, @@ -181,6 +196,14 @@ std::string SearchRenderer::getHtml() auto resultEnd = min(resultStart+pageLength, estimatedResultCount); + kainjow::mustache::data query = buildQueryData( + searchProtocolPrefix, + searchPattern, + searchContent + ); + + + std::string template_str = RESOURCE::templates::search_result_html; kainjow::mustache::mustache tmpl(template_str); @@ -188,14 +211,11 @@ std::string SearchRenderer::getHtml() allData.set("results", results); allData.set("hasResults", estimatedResultCount != 0); allData.set("count", kiwix::beautifyInteger(estimatedResultCount)); - allData.set("searchPattern", kiwix::encodeDiples(this->searchPattern)); - allData.set("searchPatternEncoded", urlEncode(this->searchPattern)); allData.set("resultStart", to_string(resultStart + 1)); allData.set("resultEnd", to_string(resultEnd)); allData.set("protocolPrefix", this->protocolPrefix); - allData.set("searchProtocolPrefix", this->searchProtocolPrefix); - allData.set("contentId", this->searchContent); allData.set("pagination", pagination); + allData.set("query", query); std::stringstream ss; tmpl.render(allData, [&ss](const std::string& str) { ss << str; }); diff --git a/src/server/internalServer.cpp b/src/server/internalServer.cpp index abafbba38..efe395244 100644 --- a/src/server/internalServer.cpp +++ b/src/server/internalServer.cpp @@ -665,7 +665,7 @@ std::unique_ptr InternalServer::handle_search(const RequestContext& re renderer.setSearchPattern(searchInfo.pattern); renderer.setSearchContent(searchInfo.bookName); renderer.setProtocolPrefix(m_root + "/"); - renderer.setSearchProtocolPrefix(m_root + "/search?"); + renderer.setSearchProtocolPrefix(m_root + "/search"); renderer.setPageLength(pageLength); auto response = ContentResponse::build(*this, renderer.getHtml(), "text/html; charset=utf-8"); response->set_taskbar(searchInfo.bookName, archive.get()); diff --git a/static/templates/search_result.html b/static/templates/search_result.html index e252bacc6..cca32af1d 100644 --- a/static/templates/search_result.html +++ b/static/templates/search_result.html @@ -102,7 +102,7 @@ } - Search: {{searchPattern}} + Search: {{query.pattern}}
@@ -113,11 +113,11 @@ of {{count}} for - "{{{searchPattern}}}" + "{{{query.pattern}}}" {{/hasResults}} {{^hasResults}} - No results were found for "{{{searchPattern}}}" + No results were found for "{{{query.pattern}}}" {{/hasResults}}
@@ -148,7 +148,7 @@ {{#pagination.pages}}
  • + href="{{{query.unpaginatedQuery}}}&start={{start}}&pageLength={{pagination.itemsPerPage}}"> {{label}}