Properly set "language" parameter in `opensearch::Query` tag.

This commit is contained in:
Matthieu Gautier 2022-06-03 12:00:25 +02:00
parent ee01859984
commit bfcf317f09
2 changed files with 36 additions and 3 deletions

View File

@ -87,6 +87,16 @@ void SearchRenderer::setSearchProtocolPrefix(const std::string& prefix)
this->searchProtocolPrefix = prefix; this->searchProtocolPrefix = prefix;
} }
std::string extractValueFromQuery(const std::string& query, const std::string& key) {
const std::string p = key + "=";
const size_t i = query.find(p);
if (i == std::string::npos) {
return "";
}
std::string r = query.substr(i + p.size());
return r.substr(0, r.find("&"));
}
kainjow::mustache::data buildQueryData kainjow::mustache::data buildQueryData
( (
const std::string& searchProtocolPrefix, const std::string& searchProtocolPrefix,
@ -99,6 +109,10 @@ kainjow::mustache::data buildQueryData
ss << searchProtocolPrefix << "?pattern=" << urlEncode(pattern, true); ss << searchProtocolPrefix << "?pattern=" << urlEncode(pattern, true);
ss << "&" << bookQuery; ss << "&" << bookQuery;
query.set("unpaginatedQuery", ss.str()); query.set("unpaginatedQuery", ss.str());
auto lang = extractValueFromQuery(bookQuery, "books.filter.lang");
if(!lang.empty()) {
query.set("lang", lang);
}
return query; return query;
} }

View File

@ -499,14 +499,27 @@ TEST_F(TaskbarlessServerTest, searchResults)
return url; return url;
} }
std::string getPattern() const std::string extractQueryValue(const std::string& key) const
{ {
const std::string p = "pattern="; const std::string p = key + "=";
const size_t i = query.find(p); const size_t i = query.find(p);
if (i == std::string::npos) {
return "";
}
std::string r = query.substr(i + p.size()); std::string r = query.substr(i + p.size());
return r.substr(0, r.find("&")); return r.substr(0, r.find("&"));
} }
std::string getPattern() const
{
return extractQueryValue("pattern");
}
std::string getLang() const
{
return extractQueryValue("books.filter.lang");
}
std::string url() const std::string url() const
{ {
return makeUrl(query, start, resultsPerPage); return makeUrl(query, start, resultsPerPage);
@ -522,7 +535,7 @@ TEST_F(TaskbarlessServerTest, searchResults)
<opensearch:itemsPerPage>ITEMCOUNT</opensearch:itemsPerPage> <opensearch:itemsPerPage>ITEMCOUNT</opensearch:itemsPerPage>
<atom:link rel="search" type="application/opensearchdescription+xml" href="/ROOT/search/searchdescription.xml"/> <atom:link rel="search" type="application/opensearchdescription+xml" href="/ROOT/search/searchdescription.xml"/>
<opensearch:Query role="request" <opensearch:Query role="request"
searchTerms="PATTERN" searchTerms="PATTERN"LANGQUERY
startIndex="FIRSTRESULT" startIndex="FIRSTRESULT"
count="ITEMCOUNT" count="ITEMCOUNT"
/>)"; />)";
@ -533,6 +546,12 @@ TEST_F(TaskbarlessServerTest, searchResults)
header = replace(header, "ITEMCOUNT", to_string(realResultsPerPage)); header = replace(header, "ITEMCOUNT", to_string(realResultsPerPage));
header = replace(header, "RESULTCOUNT", to_string(totalResultCount)); header = replace(header, "RESULTCOUNT", to_string(totalResultCount));
header = replace(header, "PATTERN", getPattern()); header = replace(header, "PATTERN", getPattern());
auto queryLang = getLang();
if (queryLang.empty()) {
header = replace(header, "LANGQUERY", "");
} else {
header = replace(header, "LANGQUERY", "\n language=\""+queryLang+"\"");
}
return header; return header;
} }