diff --git a/static/resources_list.txt b/static/resources_list.txt
index a440e1841..6e92fbaac 100644
--- a/static/resources_list.txt
+++ b/static/resources_list.txt
@@ -24,8 +24,6 @@ skin/download.png
skin/hash.png
skin/search-icon.svg
skin/taskbar.js
-skin/langList.js
-skin/categoryList.js
skin/iso6391To3.js
skin/isotope.pkgd.min.js
skin/index.js
diff --git a/static/skin/categoryList.js b/static/skin/categoryList.js
deleted file mode 100644
index 80d36e9da..000000000
--- a/static/skin/categoryList.js
+++ /dev/null
@@ -1,19 +0,0 @@
-// eslint-disable-next-line no-unused-vars
-const categoryList = {
- "other": "Other",
- "gutenberg": "Gutenberg",
- "mooc": "Mooc",
- "phet": "Phet",
- "psiram": "Psiram",
- "stack_exchange": "Stack Exchange",
- "ted": "Ted",
- "vikidia": "Vikidia",
- "wikibooks": "Wikibooks",
- "wikinews": "Wikinews",
- "wikipedia": "Wikipedia",
- "wikiquote": "Wikiquote",
- "wikisource": "Wikisource",
- "wikiversity": "Wikiversity",
- "wikivoyage": "Wikivoyage",
- "wiktionary": "Wiktionary"
-}
\ No newline at end of file
diff --git a/static/skin/index.js b/static/skin/index.js
index 966da31ce..7e9e0c971 100644
--- a/static/skin/index.js
+++ b/static/skin/index.js
@@ -4,7 +4,6 @@
start: 0,
count: viewPortToCount()
};
- const filterTypes = ['lang', 'category', 'q'];
const bookOrderMap = new Map();
const filterCookieName = 'filters';
const oneDayDelta = 86400000;
@@ -51,7 +50,12 @@
quotient = quotient < units.length ? quotient : units.length - 1;
fileSize /= (1000 ** quotient);
return `${+fileSize.toFixed(2)} ${units[quotient]}`;
- };
+ };
+
+ const humanFriendlyTitle = (title) => {
+ title = title.replace(/_/g, ' ');
+ return htmlEncode(title[0].toUpperCase() + title.slice(1));
+ }
function htmlEncode(str) {
return str.replace(/[\u00A0-\u9999<>\&]/gim, (i) => `${i.charCodeAt(0)};`);
@@ -66,11 +70,16 @@
}
function generateBookHtml(book, sort = false) {
- const link = book.querySelector('link').getAttribute('href');
+ const link = book.querySelector('link[type="text/html"]').getAttribute('href');
+ let iconUrl;
+ book.querySelectorAll('link[rel="http://opds-spec.org/image/thumbnail"]').forEach(link => {
+ if (link.getAttribute('type').split(';')[1] == 'width=48' && !iconUrl) {
+ iconUrl = link.getAttribute('href');
+ }
+ });
const title = getInnerHtml(book, 'title');
const description = getInnerHtml(book, 'summary');
const id = getInnerHtml(book, 'id');
- const iconUrl = getInnerHtml(book, 'icon');
const language = getInnerHtml(book, 'language');
const tags = getInnerHtml(book, 'tags');
let tagHtml = tags.split(';').filter(tag => {return !(tag.split(':')[0].startsWith('_'))})
@@ -85,7 +94,7 @@
} catch {
downloadLink = '';
}
- humanFriendlyZimSize = humanFriendlySize(zimSize);
+ const humanFriendlyZimSize = humanFriendlySize(zimSize);
const divTag = document.createElement('div');
divTag.setAttribute('class', 'book');
@@ -209,11 +218,17 @@
});
}
- async function loadAndDisplayOptions(nodeQuery, query) {
- // currently taking an object in place of query, will replace it with query while fetching data from backend later on.
- document.querySelector(nodeQuery).innerHTML += Object.keys(query)
- .map((option) => {return ``})
- .join('');
+ async function loadAndDisplayOptions(nodeQuery, query, valueEntryNode) {
+ await fetch(query).then(async (resp) => {
+ const data = new window.DOMParser().parseFromString(await resp.text(), 'application/xml');
+ let optionStr = '';
+ data.querySelectorAll('entry').forEach(entry => {
+ const title = getInnerHtml(entry, 'title');
+ const value = getInnerHtml(entry, valueEntryNode);
+ optionStr += ``;
+ });
+ document.querySelector(nodeQuery).innerHTML += optionStr;
+ });
}
function checkAndInjectEmptyMessage() {
@@ -363,15 +378,20 @@
fadeOutDiv = document.getElementById('fadeOut');
loader = document.querySelector('.loader');
await loadAndDisplayBooks();
- await loadAndDisplayOptions('#languageFilter', langList);
- await loadAndDisplayOptions('#categoryFilter', categoryList);
+ await loadAndDisplayOptions('#languageFilter', `${root}/catalog/v2/languages`, 'language');
+ await loadAndDisplayOptions('#categoryFilter', `${root}/catalog/v2/categories`, 'title');
document.querySelectorAll('.filter').forEach(filter => {
filter.addEventListener('change', () => {resetAndFilter(filter.name, filter.value)});
});
if (filters) {
window.history.pushState({}, null, `${window.location.href.split('?')[0]}?${params.toString()}`);
}
- params.forEach((value, key) => {document.getElementsByName(key)[0].value = value});
+ params.forEach((value, key) => {
+ const selectBox = document.getElementsByName(key)[0];
+ if (selectBox) {
+ selectBox.value = value
+ }
+ });
document.getElementById('kiwixSearchForm').onsubmit = (event) => {event.preventDefault()};
if (!window.location.search) {
const browserLang = navigator.language.split('-')[0];
diff --git a/static/skin/langList.js b/static/skin/langList.js
deleted file mode 100644
index 9e6142687..000000000
--- a/static/skin/langList.js
+++ /dev/null
@@ -1,124 +0,0 @@
-// eslint-disable-next-line no-unused-vars
-const langList = {
- "aar": "Afaraf",
- "afr": "Afrikaans",
- "aka": "Akan",
- "amh": "አማርኛ",
- "ara": "اللغة العربية",
- "asm": "অসমীয়া",
- "aze": "azərbaycan dili",
- "bak": "башҡорт теле",
- "bel": "беларуская мова",
- "bul": "български език",
- "bam": "bamanankan",
- "ben": "বাংলা",
- "bod": "བོད་ཡིག",
- "bre": "brezhoneg",
- "bos": "bosanski jezik",
- "cat": "Català",
- "che": "нохчийн мотт",
- "cos": "corsu",
- "ces": "čeština",
- "chv": "чӑваш чӗлхи",
- "cym": "Cymraeg",
- "dan": "dansk",
- "deu": "Deutsch",
- "dzo": "རྫོང་ཁ",
- "ewe": "Eʋegbe",
- "eng": "English",
- "spa": "Español",
- "est": "eesti",
- "eus": "euskara",
- "fas": "فارسی",
- "ful": "Fulfulde",
- "fin": "suomi",
- "fao": "føroyskt",
- "fra": "Français",
- "gle": "Gaeilge",
- "glg": "galego",
- "grn": "Avañe'ẽ",
- "guj": "ગુજરાતી",
- "glv": "Gaelg",
- "hau": "هَوُسَ",
- "heb": "עברית",
- "hin": "हिन्दी",
- "hrv": "hrvatski jezik",
- "hun": "magyar",
- "hye": "Հայերեն",
- "ind": "Bahasa Indonesia",
- "ibo": "Asụsụ Igbo",
- "isl": "Íslenska",
- "ita": "Italiano",
- "iku": "ᐃᓄᒃᑎᑐᑦ",
- "jpn": "日本語",
- "jav": "basa Jawa",
- "kat": "ქართული",
- "kik": "Gĩkũyũ",
- "kaz": "қазақ тілі",
- "khm": "ខេមរភាសា",
- "kan": "ಕನ್ನಡ",
- "kor": "한국어",
- "kas": "कश्मीरी",
- "kur": "Kurdî",
- "cor": "Kernewek",
- "kir": "Кыргызча",
- "ltz": "Lëtzebuergesch",
- "lug": "Luganda",
- "lin": "Lingála",
- "lao": "ພາສາ",
- "lit": "lietuvių kalba",
- "lav": "latviešu valoda",
- "mlg": "fiteny malagasy",
- "mri": "te reo Māori",
- "mkd": "македонски јазик",
- "mal": "മലയാളം",
- "mon": "Монгол хэл",
- "mar": "मराठी",
- "mlt": "Malti",
- "mya": "ဗမာစာ",
- "nld": "Nederlands",
- "nya": "chiCheŵa",
- "orm": "Afaan Oromoo",
- "pol": "język polski",
- "por": "Português",
- "que": "Runa Simi",
- "roh": "rumantsch grischun",
- "run": "Ikirundi",
- "ron": "Română",
- "rus": "Русский",
- "kin": "Ikinyarwanda",
- "san": "संस्कृतम्",
- "snd": "सिन्धी",
- "sag": "yângâ tî sängö",
- "sin": "සිංහල",
- "slk": "slovenčina",
- "slv": "slovenski jezik",
- "sna": "chiShona",
- "som": "Soomaaliga",
- "sqi": "Shqip",
- "srp": "српски језик",
- "ssw": "SiSwati",
- "swe": "svenska",
- "tam": "தமிழ்",
- "tel": "తెలుగు",
- "tgk": "тоҷикӣ",
- "tha": "ไทย",
- "tir": "ትግርኛ",
- "tuk": "Türkmen",
- "tsn": "Setswana",
- "tur": "Türkçe",
- "tso": "Xitsonga",
- "tat": "татар теле",
- "uig": "ئۇيغۇرچە",
- "ukr": "Українська",
- "urd": "اردو",
- "uzb": "Ўзбек",
- "ven": "Tshivenḓa",
- "vie": "Tiếng Việt",
- "wln": "walon",
- "wol": "Wollof",
- "xho": "isiXhosa",
- "yor": "Yorùbá",
- "zho": "中文",
- "zul": "isiZulu"
-}
\ No newline at end of file
diff --git a/static/templates/catalog_v2_languages.xml b/static/templates/catalog_v2_languages.xml
index 8a5b74cce..7e377f16a 100644
--- a/static/templates/catalog_v2_languages.xml
+++ b/static/templates/catalog_v2_languages.xml
@@ -1,7 +1,8 @@
+ xmlns:opds="https://specs.opds.io/opds-1.2"
+ xmlns:thr="http://purl.org/syndication/thread/1.0">
{{feed_id}}
-
-
diff --git a/test/server.cpp b/test/server.cpp
index d45e576e2..f67e57fd3 100644
--- a/test/server.cpp
+++ b/test/server.cpp
@@ -1028,7 +1028,8 @@ TEST_F(LibraryServerTest, catalog_v2_languages)
const char expected_output[] = R"(
+ xmlns:opds="https://specs.opds.io/opds-1.2"
+ xmlns:thr="http://purl.org/syndication/thread/1.0">
12345678-90ab-cdef-1234-567890abcdef