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