mirror of https://github.com/kiwix/libkiwix.git
Introduce buildQueryData helper in SearchRenderer
This commit is contained in:
parent
bbdde93f49
commit
f0dd34b6db
|
@ -75,6 +75,9 @@ class SearchRenderer
|
||||||
|
|
||||||
~SearchRenderer();
|
~SearchRenderer();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set the search pattern used to do the search
|
||||||
|
*/
|
||||||
void setSearchPattern(const std::string& pattern);
|
void setSearchPattern(const std::string& pattern);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -58,7 +58,7 @@ SearchRenderer::SearchRenderer(zim::SearchResultSet srs, NameMapper* mapper, Lib
|
||||||
mp_nameMapper(mapper),
|
mp_nameMapper(mapper),
|
||||||
mp_library(library),
|
mp_library(library),
|
||||||
protocolPrefix("zim://"),
|
protocolPrefix("zim://"),
|
||||||
searchProtocolPrefix("search://?"),
|
searchProtocolPrefix("search://"),
|
||||||
estimatedResultCount(estimatedResultCount),
|
estimatedResultCount(estimatedResultCount),
|
||||||
resultStart(start)
|
resultStart(start)
|
||||||
{}
|
{}
|
||||||
|
@ -68,12 +68,12 @@ SearchRenderer::~SearchRenderer() = default;
|
||||||
|
|
||||||
void SearchRenderer::setSearchPattern(const std::string& pattern)
|
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)
|
void SearchRenderer::setProtocolPrefix(const std::string& prefix)
|
||||||
|
@ -86,6 +86,21 @@ void SearchRenderer::setSearchProtocolPrefix(const std::string& prefix)
|
||||||
this->searchProtocolPrefix = 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(
|
kainjow::mustache::data buildPagination(
|
||||||
unsigned int pageLength,
|
unsigned int pageLength,
|
||||||
unsigned int resultsCount,
|
unsigned int resultsCount,
|
||||||
|
@ -181,6 +196,14 @@ std::string SearchRenderer::getHtml()
|
||||||
|
|
||||||
auto resultEnd = min(resultStart+pageLength, estimatedResultCount);
|
auto resultEnd = min(resultStart+pageLength, estimatedResultCount);
|
||||||
|
|
||||||
|
kainjow::mustache::data query = buildQueryData(
|
||||||
|
searchProtocolPrefix,
|
||||||
|
searchPattern,
|
||||||
|
searchContent
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
std::string template_str = RESOURCE::templates::search_result_html;
|
std::string template_str = RESOURCE::templates::search_result_html;
|
||||||
kainjow::mustache::mustache tmpl(template_str);
|
kainjow::mustache::mustache tmpl(template_str);
|
||||||
|
|
||||||
|
@ -188,14 +211,11 @@ std::string SearchRenderer::getHtml()
|
||||||
allData.set("results", results);
|
allData.set("results", results);
|
||||||
allData.set("hasResults", estimatedResultCount != 0);
|
allData.set("hasResults", estimatedResultCount != 0);
|
||||||
allData.set("count", kiwix::beautifyInteger(estimatedResultCount));
|
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("resultStart", to_string(resultStart + 1));
|
||||||
allData.set("resultEnd", to_string(resultEnd));
|
allData.set("resultEnd", to_string(resultEnd));
|
||||||
allData.set("protocolPrefix", this->protocolPrefix);
|
allData.set("protocolPrefix", this->protocolPrefix);
|
||||||
allData.set("searchProtocolPrefix", this->searchProtocolPrefix);
|
|
||||||
allData.set("contentId", this->searchContent);
|
|
||||||
allData.set("pagination", pagination);
|
allData.set("pagination", pagination);
|
||||||
|
allData.set("query", query);
|
||||||
|
|
||||||
std::stringstream ss;
|
std::stringstream ss;
|
||||||
tmpl.render(allData, [&ss](const std::string& str) { ss << str; });
|
tmpl.render(allData, [&ss](const std::string& str) { ss << str; });
|
||||||
|
|
|
@ -665,7 +665,7 @@ std::unique_ptr<Response> InternalServer::handle_search(const RequestContext& re
|
||||||
renderer.setSearchPattern(searchInfo.pattern);
|
renderer.setSearchPattern(searchInfo.pattern);
|
||||||
renderer.setSearchContent(searchInfo.bookName);
|
renderer.setSearchContent(searchInfo.bookName);
|
||||||
renderer.setProtocolPrefix(m_root + "/");
|
renderer.setProtocolPrefix(m_root + "/");
|
||||||
renderer.setSearchProtocolPrefix(m_root + "/search?");
|
renderer.setSearchProtocolPrefix(m_root + "/search");
|
||||||
renderer.setPageLength(pageLength);
|
renderer.setPageLength(pageLength);
|
||||||
auto response = ContentResponse::build(*this, renderer.getHtml(), "text/html; charset=utf-8");
|
auto response = ContentResponse::build(*this, renderer.getHtml(), "text/html; charset=utf-8");
|
||||||
response->set_taskbar(searchInfo.bookName, archive.get());
|
response->set_taskbar(searchInfo.bookName, archive.get());
|
||||||
|
|
|
@ -102,7 +102,7 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
</style>
|
</style>
|
||||||
<title>Search: {{searchPattern}}</title>
|
<title>Search: {{query.pattern}}</title>
|
||||||
</head>
|
</head>
|
||||||
<body bgcolor="white">
|
<body bgcolor="white">
|
||||||
<div class="header">
|
<div class="header">
|
||||||
|
@ -113,11 +113,11 @@
|
||||||
</b> of <b>
|
</b> of <b>
|
||||||
{{count}}
|
{{count}}
|
||||||
</b> for <b>
|
</b> for <b>
|
||||||
"{{{searchPattern}}}"
|
"{{{query.pattern}}}"
|
||||||
</b>
|
</b>
|
||||||
{{/hasResults}}
|
{{/hasResults}}
|
||||||
{{^hasResults}}
|
{{^hasResults}}
|
||||||
No results were found for <b>"{{{searchPattern}}}"</b>
|
No results were found for <b>"{{{query.pattern}}}"</b>
|
||||||
{{/hasResults}}
|
{{/hasResults}}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -148,7 +148,7 @@
|
||||||
{{#pagination.pages}}
|
{{#pagination.pages}}
|
||||||
<li>
|
<li>
|
||||||
<a {{#current}}class="selected"{{/current}}
|
<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}}
|
{{label}}
|
||||||
</a>
|
</a>
|
||||||
</li>
|
</li>
|
||||||
|
|
Loading…
Reference in New Issue