Move function to convert and use tags inside otherTools.

This commit is contained in:
Matthieu Gautier 2020-01-30 14:28:38 +01:00
parent b63827196c
commit 7275f9b8e3
3 changed files with 92 additions and 70 deletions

View File

@ -21,6 +21,7 @@
#define KIWIX_OTHERTOOLS_H #define KIWIX_OTHERTOOLS_H
#include <string> #include <string>
#include <vector>
namespace pugi { namespace pugi {
class xml_node; class xml_node;
@ -28,9 +29,18 @@ namespace pugi {
namespace kiwix namespace kiwix
{ {
void sleep(unsigned int milliseconds); void sleep(unsigned int milliseconds);
std::string nodeToString(const pugi::xml_node& node); std::string nodeToString(const pugi::xml_node& node);
std::string converta2toa3(const std::string& a2code); std::string converta2toa3(const std::string& a2code);
/*
* Convert all format tag string to new format
*/
std::vector<std::string> convertTags(const std::string& tags_str);
std::string getTagValueFromTagList(const std::vector<std::string>& tagList,
const std::string& tagName);
bool convertStrToBool(const std::string& value);
} }
#endif #endif

View File

@ -22,6 +22,8 @@
#include <zim/search.h> #include <zim/search.h>
#include "tools/otherTools.h"
inline char hi(char v) inline char hi(char v)
{ {
char hex[] = "0123456789abcdef"; char hex[] = "0123456789abcdef";
@ -352,43 +354,6 @@ string Reader::getLicense() const
METADATA("License") METADATA("License")
} }
std::vector<std::string> convertTags(const std::string& tags_str)
{
auto tags = split(tags_str, ";");
std::vector<std::string> tagsList;
bool picSeen(false), vidSeen(false), detSeen(false), indexSeen(false);
for (auto tag: tags) {
picSeen |= (tag == "nopic" || startsWith(tag, "_pictures:"));
vidSeen |= (tag == "novid" || startsWith(tag, "_videos:"));
detSeen |= (tag == "nodet" || startsWith(tag, "_details:"));
indexSeen |= startsWith(tag, "_ftindex");
if (tag == "nopic") {
tagsList.push_back("_pictures:no");
} else if (tag == "novid") {
tagsList.push_back("_videos:no");
} else if (tag == "nodet") {
tagsList.push_back("_details:no");
} else if (tag == "_ftindex") {
tagsList.push_back("_ftindex:yes");
} else {
tagsList.push_back(tag);
}
}
if (!indexSeen) {
tagsList.push_back("_ftindex:no");
}
if (!picSeen) {
tagsList.push_back("_pictures:yes");
}
if (!vidSeen) {
tagsList.push_back("_videos:yes");
}
if (!detSeen) {
tagsList.push_back("_details:yes");
}
return tagsList;
}
string Reader::getTags(bool original) const string Reader::getTags(bool original) const
{ {
string tags_str; string tags_str;
@ -400,26 +365,6 @@ string Reader::getTags(bool original) const
return join(tags, ";"); return join(tags, ";");
} }
string getTagValueFromTagList(const std::vector<std::string>& tagList, const std::string& tagName)
{
for (auto tag: tagList) {
if (tag[0] == '_') {
auto delimPos = tag.find(':');
if (delimPos == string::npos) {
// No delimiter... what to do ?
continue;
}
auto cTagName = tag.substr(1, delimPos-1);
auto cTagValue = tag.substr(delimPos+1);
if (cTagName == tagName) {
return cTagValue;
}
}
}
std::stringstream ss;
ss << tagName << " cannot be found";
throw std::out_of_range(ss.str());
}
string Reader::getTagStr(const std::string& tagName) const string Reader::getTagStr(const std::string& tagName) const
{ {
@ -430,16 +375,7 @@ string Reader::getTagStr(const std::string& tagName) const
bool Reader::getTagBool(const std::string& tagName) const bool Reader::getTagBool(const std::string& tagName) const
{ {
auto tagValue = getTagStr(tagName); return convertStrToBool(getTagStr(tagName));
if (tagValue == "yes") {
return true;
} else if (tagValue == "no") {
return false;
} else {
std::stringstream ss;
ss << "Tag value '" << tagValue << "' for " << tagName << " cannot be converted to bool.";
throw std::domain_error(ss.str());
}
} }
string Reader::getRelation() const string Reader::getRelation() const

View File

@ -25,7 +25,10 @@
#include <unistd.h> #include <unistd.h>
#endif #endif
#include "tools/stringTools.h"
#include <map> #include <map>
#include <sstream>
#include <pugixml.hpp> #include <pugixml.hpp>
@ -204,3 +207,76 @@ std::string kiwix::nodeToString(const pugi::xml_node& node)
std::string kiwix::converta2toa3(const std::string& a2code){ std::string kiwix::converta2toa3(const std::string& a2code){
return codeisomapping.at(a2code); return codeisomapping.at(a2code);
} }
std::vector<std::string> kiwix::convertTags(const std::string& tags_str)
{
auto tags = kiwix::split(tags_str, ";");
std::vector<std::string> tagsList;
bool picSeen(false), vidSeen(false), detSeen(false), indexSeen(false);
for (auto tag: tags) {
picSeen |= (tag == "nopic" || startsWith(tag, "_pictures:"));
vidSeen |= (tag == "novid" || startsWith(tag, "_videos:"));
detSeen |= (tag == "nodet" || startsWith(tag, "_details:"));
indexSeen |= kiwix::startsWith(tag, "_ftindex");
if (tag == "nopic") {
tagsList.push_back("_pictures:no");
} else if (tag == "novid") {
tagsList.push_back("_videos:no");
} else if (tag == "nodet") {
tagsList.push_back("_details:no");
} else if (tag == "_ftindex") {
tagsList.push_back("_ftindex:yes");
} else {
tagsList.push_back(tag);
}
}
if (!indexSeen) {
tagsList.push_back("_ftindex:no");
}
if (!picSeen) {
tagsList.push_back("_pictures:yes");
}
if (!vidSeen) {
tagsList.push_back("_videos:yes");
}
if (!detSeen) {
tagsList.push_back("_details:yes");
}
return tagsList;
}
std::string kiwix::getTagValueFromTagList(
const std::vector<std::string>& tagList, const std::string& tagName)
{
for (auto tag: tagList) {
if (tag[0] == '_') {
auto delimPos = tag.find(':');
if (delimPos == std::string::npos) {
// No delimiter... what to do ?
continue;
}
auto cTagName = tag.substr(1, delimPos-1);
auto cTagValue = tag.substr(delimPos+1);
if (cTagName == tagName) {
return cTagValue;
}
}
}
std::stringstream ss;
ss << tagName << " cannot be found";
throw std::out_of_range(ss.str());
}
bool kiwix::convertStrToBool(const std::string& value)
{
if (value == "yes") {
return true;
} else if (value == "no") {
return false;
}
std::stringstream ss;
ss << "Tag value '" << value << "' cannot be converted to bool.";
throw std::domain_error(ss.str());
}