MediaWiki:PrunikPortalu.js
Z WikiSkript
Poznámka: Po zveřejnění musíte vyprázdnit cache vašeho prohlížeče, jinak změny neuvidíte.
- Firefox / Safari: Při kliknutí na Aktualizovat držte Shift nebo stiskněte Ctrl-F5 nebo Ctrl-R (na Macu ⌘-R)
- Google Chrome: Stiskněte Ctrl-Shift-R (na Macu ⌘-Shift-R)
- Internet Explorer / Edge: Při kliknutí na Aktualizovat držte Ctrl nebo stiskněte Ctrl-F5
- Opera: Stiskněte Ctrl-F5.
/**
* Zjištění stránek v průniku:
* - redakční kategorie článku či jeho diskusní stránky a
* - portálu odkazujícího na článek samotný.
*
* @author User:Slepi
* @license https://www.gnu.org/licenses/gpl.html GNU General Public License 3.0
*/
let prunikPortalu = {
/* pole portálů */
portalsList: [],
/* pole kategorií */
categoriesList: [],
/* pole obsahových stránek ve vybraném portálu */
portalPages: [],
/* pole článků a diskusních stránek ve vybrané kategorii */
catPages: [],
/* značka hotového zpracování článků z API */
done: false,
/* pole shodných stránek */
foundPages: [],
/**
* Zobrazení odkazu v menu.
*/
displayMenuLink: function() {
mw.util.addPortletLink('p-editorial-links', 'javascript:prunikPortalu.start();', 'Průniky kat. a port.', 'n-prunik-portalu', 'Články s průnikem redakční kategorie a odkazu z portálu');
},
/**
* Nastartovat skript.
*/
start: function() {
document.getElementById("content").innerHTML = '<h2>Průnik portálů a kategorií</h2><p>Vyberte prosím portál a kategorii k průniku.</p><div id="prunikPortaluForm" class="form-group"></div><button class="btn btn-primary" onclick="prunikPortalu.getIntersection()">Načíst články</button><hr><div id="prunikPortaluRes"></div>';
prunikPortalu.getPortals();
prunikPortalu.getCategories();
},
/**
* Seřadit podle české abecedy.
*/
czechSort: function(s1, s2) {
return s1.localeCompare(s2 ,"cz", {sensitivity: "accent"});
},
/**
* Zjistit portály ve wiki.
*/
getPortals: function(cont) {
$.ajax({
url: mw.util.wikiScript("api"),
data: {
format: "json",
action: "query",
list: "allpages",
aplimit: "500",
apnamespace: "100", /* portál */
apcontinue: ((typeof(cont) !== "undefined") ? cont : ""),
},
dataType: "json",
type: "GET",
success: data => {
if (data && data.query && data.query.allpages) {
$.each(data.query.allpages, function(i, value) {
prunikPortalu.portalsList.push(value.title);
});
if(typeof data.continue !== "undefined") {
prunikPortalu.getPortals(data.continue.apcontinue);
} else {
prunikPortalu.portalsList = prunikPortalu.portalsList.sort(prunikPortalu.czechSort);
let output = '<label>Portály:</label><select id="prunikPor" class="form-control">';
for (let i=0; i<prunikPortalu.portalsList.length; i++) {
output += `<option value="${prunikPortalu.portalsList[i]}">${prunikPortalu.portalsList[i].replace('Portál:', '')}</option>`;
}
output += "</select>";
document.getElementById("prunikPortaluForm").innerHTML += output;
}
}
}
});
},
/**
* Zjistit kategorie ve wiki.
*/
getCategories: function(cont) {
$.ajax({
url: mw.util.wikiScript("api"),
data: {
format: "json",
action: "query",
list: "allpages",
aplimit: "500",
apnamespace: "14", /* kategorie */
apcontinue: ((typeof(cont) !== "undefined") ? cont : ""),
},
dataType: "json",
type: "GET",
success: data => {
if (data && data.query && data.query.allpages) {
$.each(data.query.allpages, function(i, value) {
prunikPortalu.categoriesList.push(value.title);
});
if(typeof data.continue !== "undefined") {
prunikPortalu.getCategories(data.continue.apcontinue);
} else {
prunikPortalu.categoriesList = prunikPortalu.categoriesList.sort(prunikPortalu.czechSort);
let output = '<label>Kategorie:</label><select id="prunikKat" class="form-control">';
for (let i=0; i<prunikPortalu.categoriesList.length; i++) {
output += `<option value="${prunikPortalu.categoriesList[i]}">${prunikPortalu.categoriesList[i].replace('Kategorie:', '')}</option>`;
}
output += "</select>";
document.getElementById("prunikPortaluForm").innerHTML += output;
}
}
}
});
},
/**
* Zjistit články ve vybrané kategorii (vč. diskusních stránek).
*/
getCatPages: function(cat, cont) {
$.ajax({
url: mw.util.wikiScript("api"),
data: {
format: "json",
action: "query",
list: "categorymembers",
cmtitle: cat,
cmlimit: "500",
cmnamespace: "0|1", /* hlavní a diskuse */
cmcontinue: ((typeof(cont) !== "undefined") ? cont : ""),
},
dataType: "json",
type: "GET",
success: data => {
if (data && data.query && data.query.categorymembers) {
$.each(data.query.categorymembers, function(i, value) {
let ppItem = value.title.replace("Diskuse:", "");
if(prunikPortalu.catPages.indexOf(ppItem) === -1)
prunikPortalu.catPages.push(ppItem);
});
if (typeof data.continue !== "undefined") {
prunikPortalu.getCatPages(cat, data.continue.cmcontinue);
} else if (prunikPortalu.done === true) {
prunikPortalu.finish();
} else {
prunikPortalu.done = true;
}
}
}
});
},
/**
* Získat odkazy z daného portálu.
*
* @todo prop=links neumožňuje prázdný parametr plcontinue, proto toto není rekurzivní
* (ale asi zatím žádný portál nemá >500 článků)
*/
getPorPages: function(por) {
$.ajax({
url: mw.util.wikiScript("api"),
data: {
format: "json",
action: "query",
prop: "links",
titles: por,
pllimit: "500",
plnamespace: "0", /* hlavní */
},
dataType: "json",
type: "GET",
success: data => {
if (data && data.query && data.query.pages) {
$.each(data.query.pages[Object.keys(data.query.pages)[0]].links, function(i, value) {
prunikPortalu.portalPages.push(value.title);
});
if (prunikPortalu.done === true)
prunikPortalu.finish();
else
prunikPortalu.done = true;
}
}
});
},
/**
* Získat články z API.
*/
getIntersection: function() {
let psel = document.getElementById("prunikPor");
let csel = document.getElementById("prunikKat");
let portal = psel.options[psel.selectedIndex].value;
let kat = csel.options[csel.selectedIndex].value;
document.getElementById("prunikPortaluRes").innerHTML = `<p><span class="spinner-border spinner-border-sm text-secondary" role="status"></span>` +
` Načítají se výsledky průniku ${portal} a ${kat}.</p>`;
prunikPortalu.getCatPages(kat);
prunikPortalu.getPorPages(portal);
},
/**
* Vypsat výsledky na obrazovku.
*/
finish: function() {
let divRes = document.getElementById("prunikPortaluRes");
for (i=0; i<prunikPortalu.portalPages.length; i++) {
if (prunikPortalu.catPages.indexOf(prunikPortalu.portalPages[i]) > -1)
prunikPortalu.foundPages.push(prunikPortalu.portalPages[i]);
}
prunikPortalu.foundPages = prunikPortalu.foundPages.sort(prunikPortalu.czechSort);
divRes.innerHTML = "<ul>";
for (i=0; i<prunikPortalu.foundPages.length; i++) {
divRes.innerHTML += `<li><a href="${mw.config.get("wgServer") + mw.config.get("wgScript") + "?title=" + prunikPortalu.foundPages[i]}" target="_blank">${prunikPortalu.foundPages[i]}</a></li>`;
}
if (prunikPortalu.foundPages.length === 0)
divRes.innerHTML += "<li>Nebyl nalezen žádný průnik daného portálu a vybrané kategorie.</li>";
divRes.innerHTML += "</ul>";
prunikPortalu.portalsList = [];
prunikPortalu.categoriesList = [];
prunikPortalu.foundPages = [];
prunikPortalu.portalPages = [];
prunikPortalu.catPages = [];
prunikPortalu.done = false;
}
};
/* START! */
$(function(){
prunikPortalu.displayMenuLink();
});