From a28c2973e98a235797d385ab3280acf901a4fd29 Mon Sep 17 00:00:00 2001 From: Nikhil Tanwar <2002nikhiltanwar@gmail.com> Date: Tue, 11 Jul 2023 15:42:51 +0530 Subject: [PATCH] Introduce readLanguagesFromFeed() Added a new function to read languages stored in an OPDS feed --- include/tools.h | 9 ++++++++ src/meson.build | 1 + src/tools/opdsParsingTools.cpp | 41 ++++++++++++++++++++++++++++++++++ 3 files changed, 51 insertions(+) create mode 100644 src/tools/opdsParsingTools.cpp diff --git a/include/tools.h b/include/tools.h index 23c28e864..4b8181660 100644 --- a/include/tools.h +++ b/include/tools.h @@ -26,6 +26,8 @@ #include namespace kiwix { +typedef std::pair LangNameCodePair; +typedef std::vector FeedLanguages; /** * Return the current directory. @@ -226,5 +228,12 @@ std::string getBestPublicIp(); */ std::string beautifyFileSize(uint64_t number); +/** + * Load languages stored in an OPDS stream. + * + * @param content the OPDS stream. + * @return vector containing pairs of language code and their corresponding full language name. + */ +FeedLanguages readLanguagesFromFeed(const std::string& content); } #endif // KIWIX_TOOLS_H diff --git a/src/meson.build b/src/meson.build index 818eb4f9f..a73fbc9e7 100644 --- a/src/meson.build +++ b/src/meson.build @@ -17,6 +17,7 @@ kiwix_sources = [ 'tools/regexTools.cpp', 'tools/stringTools.cpp', 'tools/networkTools.cpp', + 'tools/opdsParsingTools.cpp', 'tools/otherTools.cpp', 'tools/archiveTools.cpp', 'kiwixserve.cpp', diff --git a/src/tools/opdsParsingTools.cpp b/src/tools/opdsParsingTools.cpp new file mode 100644 index 000000000..4bedb483b --- /dev/null +++ b/src/tools/opdsParsingTools.cpp @@ -0,0 +1,41 @@ +#include "tools.h" +#include + +namespace kiwix +{ + +namespace +{ +#define VALUE(name) entryNode.child(name).child_value() +FeedLanguages parseLanguages(const pugi::xml_document& doc) +{ + pugi::xml_node feedNode = doc.child("feed"); + FeedLanguages langs; + + for (pugi::xml_node entryNode = feedNode.child("entry"); entryNode; + entryNode = entryNode.next_sibling("entry")) { + auto title = VALUE("title"); + auto code = VALUE("dc:language"); + langs.push_back({code, title}); + } + + return langs; +} + +} // unnamed namespace + +FeedLanguages readLanguagesFromFeed(const std::string& content) +{ + pugi::xml_document doc; + pugi::xml_parse_result result + = doc.load_buffer((void*)content.data(), content.size()); + + if (result) { + auto langs = parseLanguages(doc); + return langs; + } + + return FeedLanguages(); +} + +} // namespace kiwix