diff --git a/www/css/app.css b/www/css/app.css
index 012407f3..404ff1db 100644
--- a/www/css/app.css
+++ b/www/css/app.css
@@ -415,6 +415,10 @@ pre {
margin-bottom: 15% !important;
}
+#dl-panel-body::before, #dl-panel-body::after {
+ content: '' !important;
+}
+
/*********************************/
/******* Custom checkboxes *******/
/*********************************/
diff --git a/www/js/lib/kiwixServe.js b/www/js/lib/kiwixServe.js
index aac49125..5c27a5b1 100644
--- a/www/js/lib/kiwixServe.js
+++ b/www/js/lib/kiwixServe.js
@@ -208,6 +208,7 @@ define([], function () {
pms: 'Piemontèis (Piedmontese)',
ps: 'پښتو (Pashto)',
pt: 'Português (Portuguese)',
+ ptbr: 'Português brasileiro (Brazilian Portuguese)',
qu: 'Runa Simi (Quechua)',
rm: 'Rumantsch (Raeto Romance)',
rmy: 'Romani / रोमानी (Romani)',
@@ -549,11 +550,17 @@ define([], function () {
}
dropdownDate += '\r\n';
}
+ //Add language, subject and date spans to doc
+ if (/^(?:[^._]+\.stack(?:exchange|overflow)|askubuntu|stackapps|stackoverflow|superuser|serverfault)/mi.test(doc)) {
+ doc = doc.replace(/^([^>\n\r]+>(?:.+(stackoverflow)|([^.\n\r]+))\.([^_\n\r]+)_([^_\n\r]+)_.*?(\d[\d-]+)\.zi[mp].+)$[\n\r]*/img, '$1
');
+ } else {
+ doc = doc.replace(/^([^_\n\r]+_([^_\n\r]+)_((?:[^_]|_(?!maxi|mini|nopic|\d\d\d\d))+)_.*?(\d[\d-]+)\.zi[mp].+)$[\n\r]*/img, '$1
');
+ }
+ // Normalize languages with a - (from Stackexchange)
+ doc = doc.replace(/(lang="\w+)-(\w+")/, '$1$2');
doc = dropdownDate ? doc.replace(/<\/h3>/i, '' + (dropdownLang || dropdownSubj ? '' : '\r\n
\r\n') + '
Date: ' + dropdownDate + '
\r\n
\r\n') : doc;
doc = dropdownSubj ? doc.replace(/<\/h3>/i, '' + (dropdownLang ? '' : '\r\n\r\n') + '
Subject: ' + dropdownSubj + '
\r\n' + (dropdownDate ? '' : '
\r\n')) : doc;
doc = dropdownLang ? doc.replace(/<\/h3>/i, '\r\n\r\n
Language: ' + dropdownLang + '
\r\n' + (dropdownSubj || dropdownDate ? '' : '
\r\n')) : doc;
- //Add language and date spans to doc
- doc = doc.replace(/^([^_\n\r]+_([^_\n\r]+)_([^_\n\r]+)_.*?(\d[\d-]+)\.zi[mp].+)$[\n\r]*/img, '$1
');
}
downloadLinks.innerHTML = doc;
var langSel = document.getElementById('langs');
@@ -572,7 +579,7 @@ define([], function () {
if (subjSel) subjSel.value = subj || 'All';
if (dateSel) dateSel.value = kiwixDate || 'All';
}
- if (typeof langArray !== "undefined") {
+ if (langArray && langSel) {
//Set up event listener for language selector
langSel.addEventListener("change", function () {
var dateID = dateSel ? dateSel.options[dateSel.selectedIndex].value : '';
@@ -604,7 +611,8 @@ define([], function () {
var subjList = subjectArray.join('\r\n');
subjList = subjList.replace(/^(.*)[\r\n]*/mg, function (p0, p1) {
// DEV: innerText doesn't include hidden items
- if (p1 !== 'All' && !~langPanel.innerText.indexOf('_' + p1 + '_')) return '';
+ var rgxSubject = new RegExp('_?' + p1 + '[._]', 'i');
+ if (p1 !== 'All' && !rgxSubject.test(langPanel.innerText)) return '';
return '';
});
subjSel.innerHTML = subjList;
@@ -618,7 +626,7 @@ define([], function () {
}
});
}
- if (typeof subjectArray !== "undefined") {
+ if (subjectArray && subjSel) {
//Set up event listener for subject selector
subjSel.addEventListener("change", function () {
var langID = langSel ? langSel.options[langSel.selectedIndex].value : '';
@@ -636,9 +644,11 @@ define([], function () {
// Prune the language list
if (langID === 'All') {
var langList = langArray.join('\r\n');
+ // We need to normalize language codes in langPanel (for Stackexchange)
+ // DEV: innerText doesn't include hidden items
+ var langTestPanel = langPanel.innerText.replace(/(_\w+)-(\w+_)/, '$1$2');
langList = langList.replace(/^(.*)[\r\n]*/mg, function (p0, p1) {
- // DEV: innerText doesn't include hidden items
- if (p1 !== 'All' && !~langPanel.innerText.indexOf('_' + p1 + '_')) return '';
+ if (p1 !== 'All' && !~langTestPanel.indexOf('_' + p1 + '_')) return '';
return '';
});
langSel.innerHTML = langList;
@@ -662,7 +672,7 @@ define([], function () {
}
});
}
- if (typeof dateArray !== "undefined") {
+ if (dateArray && dateSel) {
//Set up event listener for date selector
dateSel.addEventListener("change", function () {
var langID = langSel ? langSel.options[langSel.selectedIndex].value : '';
@@ -680,9 +690,11 @@ define([], function () {
// Prune the language list
if (langID === 'All') {
var langList = langArray.join('\r\n');
+ // We need to normalize language codes in langPanel (for Stackexchange)
+ // DEV: innerText doesn't include hidden items
+ var langTestPanel = langPanel.innerText.replace(/(_\w+)-(\w+_)/, '$1$2');
langList = langList.replace(/^(.*)[\r\n]*/mg, function (p0, p1) {
- // DEV: innerText doesn't include hidden items
- if (p1 !== 'All' && !~langPanel.innerText.indexOf('_' + p1 + '_')) return '';
+ if (p1 !== 'All' && !~langTestPanel.indexOf('_' + p1 + '_')) return '';
return '';
});
langSel.innerHTML = langList;
@@ -692,7 +704,8 @@ define([], function () {
var subjList = subjectArray.join('\r\n');
subjList = subjList.replace(/^(.*)[\r\n]*/mg, function (p0, p1) {
// DEV: innerText doesn't include hidden items
- if (p1 !== 'All' && !~langPanel.innerText.indexOf('_' + p1 + '_')) return '';
+ var rgxSubject = new RegExp('_?' + p1 + '[._]', 'i');
+ if (p1 !== 'All' && !rgxSubject.test(langPanel.innerText)) return '';
return '';
});
subjSel.innerHTML = subjList;
@@ -707,7 +720,7 @@ define([], function () {
});
}
var links = downloadLinks.getElementsByTagName("a");
- for (var i = 0; i < links.length; i++) {
+ for (i = 0; i < links.length; i++) {
//Store the href - seems it's not useful?
//links[i].setAttribute("data-kiwix-dl", links[i].href);
links[i].href = "#";
@@ -737,11 +750,11 @@ define([], function () {
// Standardize the document for array extraction
function getStandardizedDoc(fromDoc) {
//Add back any missing carriage returns
- var std = fromDoc.replace(/<\/span>