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í&hellip;</p><p id="loaderMisPort"></p>';
		} else if (document.getElementById("loaderMisPort")) {
			document.getElementById("loaderMisPort")
				.innerHTML = '<small style="padding-left: 2rem;">&mdash;&nbsp;' + 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();
});