Introduce buildQueryData helper in SearchRenderer

This commit is contained in:
Matthieu Gautier 2022-05-05 17:42:16 +02:00
parent bbdde93f49
commit f0dd34b6db
4 changed files with 36 additions and 13 deletions

View File

@ -75,6 +75,9 @@ class SearchRenderer
~SearchRenderer();
/**
* Set the search pattern used to do the search
*/
void setSearchPattern(const std::string& pattern);
/**

View File

@ -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; });

View File

@ -665,7 +665,7 @@ std::unique_ptr<Response> 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());

View File

@ -102,7 +102,7 @@
}
</style>
<title>Search: {{searchPattern}}</title>
<title>Search: {{query.pattern}}</title>
</head>
<body bgcolor="white">
<div class="header">
@ -113,11 +113,11 @@
</b> of <b>
{{count}}
</b> for <b>
"{{{searchPattern}}}"
"{{{query.pattern}}}"
</b>
{{/hasResults}}
{{^hasResults}}
No results were found for <b>"{{{searchPattern}}}"</b>
No results were found for <b>"{{{query.pattern}}}"</b>
{{/hasResults}}
</div>
@ -148,7 +148,7 @@
{{#pagination.pages}}
<li>
<a {{#current}}class="selected"{{/current}}
href="{{searchProtocolPrefix}}pattern={{searchPatternEncoded}}{{#contentId}}&content={{.}}{{/contentId}}&start={{start}}&pageLength={{pagination.itemsPerPage}}">
href="{{{query.unpaginatedQuery}}}&start={{start}}&pageLength={{pagination.itemsPerPage}}">
{{label}}
</a>
</li>