MediaWiki:MissingPortalLinks.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 bez odkazu na portálu
*
* @file Skript zobrazí seznam stránek bez odkazu z jakéhokoli portálu
* @author Slepi, Pavel Dušek
* @license https://www.gnu.org/licenses/gpl.html GNU General Public License 3.0
*/
var missingPortalLinks = {
/**
* Obecné proměnné
*/
/* pole obsahových stránek */
contentPages: [],
/* pole portálů */
portals: [],
/* počet zpracovaných portálů */
mpCount: 0,
/**
* Získání všech obsahových článků
*
* @param {allpagesContinue} Začátek seznamu článků (získán z API při rekurzivním volání)
*/
getAPIpages: function(allpagesContinue)
{
$.ajax({
url: mw.util.wikiScript("api"),
data: {
format: "json",
action: "query",
list: "allpages",
aplimit: "500",
apnamespace: "0",
apfilterredir: "nonredirects",
apfrom: ((typeof(allpagesContinue) !== "undefined") ? allpagesContinue : "")
},
dataType: 'json',
type: 'GET',
success: function(data) {
/* zapíšu výsledný seznam článků do pole contentPages */
if (data && data.query && data.query.allpages) {
$.each(data.query.allpages, function(i, value) {
/* zapíšu jen nerozcestníkové články, rozcestníky vyřadíme */
if (value.title.indexOf("rozcestník") === -1) {
missingPortalLinks.contentPages.push(value.title);
}
});
}
/* pokud není seznam kompletní, rekurzivně zavolám funkcí znovu pro dalších 500 článků */
if (typeof data.continue !== "undefined" && typeof data.continue.apcontinue !== "undefined") {
missingPortalLinks.getAPIpages(data.continue.apcontinue);
missingPortalLinks.loader("Načteno " + missingPortalLinks.contentPages.length + " článků.");
/* pokud je seznam kompletní, končím a jdu zjistit portály */
} else {
missingPortalLinks.loader("Načítám seznam hesel ve WikiSkriptech.");
missingPortalLinks.getAPIterms();
}
}
});
},
/**
* Filtr hesel
*
* @param {alltermsContinue} Začátek seznamu článků v kategorii Heslo (získán z API při rekurzivním volání)
*/
getAPIterms: function(alltermsContinue)
{
$.ajax({
url: mw.util.wikiScript("api"),
data: {
format: "json",
action: "query",
list: "categorymembers",
cmlimit: "500",
cmtitle: "Category:Heslo",
apfilterredir: "nonredirects",
cmcontinue: ((typeof(alltermsContinue) !== "undefined") ? alltermsContinue : "")
},
dataType: 'json',
type: 'GET',
success: function(data) {
/* zapíšu výsledný seznam do pole contentPages */
if (data && data.query && data.query.categorymembers) {
$.each(data.query.categorymembers, function(i, value) {
/* zapíšu jen neheslové články */
var index = missingPortalLinks.contentPages.indexOf(value.title);
if (index > -1) {
missingPortalLinks.contentPages.splice(index, 1);
}
});
}
/* pokud není seznam kompletní, rekurzivně zavolám funkcí znovu pro dalších 500 článků */
if (typeof data.continue !== "undefined" && typeof data.continue.cmcontinue !== "undefined") {
missingPortalLinks.getAPIterms(data.continue.cmcontinue);
/* pokud je seznam kompletní, končím a jdu zjistit portály */
} else {
missingPortalLinks.loader("Načítám seznam portálů ve WikiSkriptech.");
missingPortalLinks.getAPIportals();
}
}
});
},
/**
* Získání všech portálů
*
* @param {allportalsContinue} Začátek seznamu portálů (získán z API při rekurzivním volání)
*/
getAPIportals: function(allportalsContinue)
{
$.ajax({
url: mw.util.wikiScript("api"),
data: {
format: 'json',
action: 'query',
list: 'allpages',
apnamespace: '100',
aplimit: '500',
apfilterredir: 'nonredirects',
apfrom: ((typeof(allportalsContinue) !== "undefined") ? allportalsContinue : "")
},
dataType: 'json',
type: 'GET',
success: function(data) {
/* zapíšu výsledný seznam do pole portals */
if (data && data.query && data.query.allpages) {
$.each(data.query.allpages, function(i, value) {
/* zapíšu jen neotázkové portály */
if (value.title.indexOf("tázky") === -1) {
missingPortalLinks.portals.push(value.title);
}
});
}
/* pokud není seznam kompletní, rekurzivně zavolám funkcí znovu pro dalších 500 portálů */
if (typeof data.continue !== "undefined" && typeof data.continue.apcontinue !== "undefined") {
missingPortalLinks.getAPIportals(data.continue.apcontinue);
missingPortalLinks.loader("Načteno " + missingPortalLinks.portals.length + " portálů.");
/* pokud je seznam kompletní, končím a jdu zjistit portály */
} else {
missingPortalLinks.loader("Seznam článků a portálů je hotov, zpracovávám data.");
missingPortalLinks.processData();
}
}
});
},
/**
* Získání odkazů z daného portálu
*
* @param {portal} Název portálu, odkud čerpat odkazy
*/
getPortalLinks: function(portal)
{
$.ajax({
url: mw.util.wikiScript("api"),
data: {
format: "json",
action: "query",
prop: "links",
pllimit: "500",
titles: portal,
plnamespace: "0"
},
dataType: 'json',
type: 'GET',
success: function(data) {
/* všechny získané odkazy porovnám s existujícím polem contentPages */
if (typeof data.query !== "undefined" && typeof data.query.pages !== "undefined") {
for (var i in data.query.pages) {
if (typeof data.query.pages[i].links !== "undefined") {
$.each(data.query.pages[i].links, function(j, value) {
var index = missingPortalLinks.contentPages.indexOf(value.title);
if (index !== -1) {
missingPortalLinks.contentPages.splice(index, 1);
}
});
}
}
}
missingPortalLinks.mpCount++;
missingPortalLinks.loader("Procházím odkazy z portálů, mám hotovo " + Math.floor(100 * missingPortalLinks.mpCount / missingPortalLinks.portals.length) + " %.");
missingPortalLinks.printArticles();
}
});
},
/**
* Zpracování dat z portálů
*/
processData: function()
{
for (i = 0; i < missingPortalLinks.portals.length; i++) {
missingPortalLinks.getPortalLinks(missingPortalLinks.portals[i]);
}
},
/**
* Výpis článků na obrazovku
*/
printArticles: function()
{
/* zkontrolovat, zda je už výpis kompletní, jinak se funkce spustí při dalším cyklu */
if (missingPortalLinks.mpCount === missingPortalLinks.portals.length) {
var vypis = "<h1 id='firstHeading'>Články bez odkazu z některého portálu</h1>" +
"<p>Níže je uveden seznam " + missingPortalLinks.contentPages.length + " článků, které nemají svůj odkaz na některém portále. " +
"Nepočítají se hesla, přesměrování ani rozcestníky. " +
"Naopak jsme započetli články, které mají odkaz jen na portále vypracovaných otázek. " +
"Odkazy se vám otevřou v novém okně, takže žádné strachy a vzhůru do práce! :-) " +
"Pokud narazíte na chybu, napište prosím <a href='" + mw.config.get("wgServer") + mw.config.get("wgScriptPath") + "/index.php?title=User:Slepi'>" +
"Slepimu</a>, ten rád pomůže a případnou chybu opraví." +
"<ul>";
for (i = 0; i < missingPortalLinks.contentPages.length; i++) {
vypis += "<li><a href='" + mw.config.get("wgServer") + mw.config.get("wgScriptPath") + "/index.php?title=" + missingPortalLinks.contentPages[i] + "' target='_new'>" + missingPortalLinks.contentPages[i] + "</a></li>";
}
vypis += "</ul>";
document.getElementById("content")
.innerHTML = vypis;
}
},
/**
* Zobrazení odkazu v menu
*/
displayMenuLink: function()
{
mw.util.addPortletLink('p-editorial-links', 'javascript:missingPortalLinks.start();', 'Chybí na portálech', 'n-chybi-na-portalech', 'Články, které nejsou odkazovány z žádného portálu');
},
/**
* Zobrazit loader
*/
loader: function(text)
{
if (typeof text === "undefined") {
document.getElementById("content")
.innerHTML = '<p><span class="spinner-border spinner-border-sm text-secondary" role="status"></span> Prosím o chvíli strpení…</p><p id="loaderMisPort"></p>';
} else if (document.getElementById("loaderMisPort")) {
document.getElementById("loaderMisPort")
.innerHTML = '<small style="padding-left: 2rem;">— ' + text + '</small>';
}
},
/**
* Nastartovat skript
*/
start: function()
{
/* zobrazit loader */
missingPortalLinks.loader();
missingPortalLinks.loader("Načítám seznam článků.");
/* spustit API pro články */
missingPortalLinks.getAPIpages();
}
};
/* START! */
$(function() {
missingPortalLinks.displayMenuLink();
});