MediaWiki:CategoryIntersection.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 dvou kategorií
 *
 * @file Skript zobrazí seznam stránek nacházejících se v aktuální a v zadané kategorii zároveň
 * @author Slepi, Pavel Dušek
 * @license https://www.gnu.org/licenses/gpl.html GNU General Public License 3.0
 */
var categoryIntersection = {

	/**
	 * Obecné proměnné
	 */
	
	/* pole obsahových stránek */
	contentPages: [],

	/* pole shodných stránek */
	foundPages: [],
	
	/**
	 * Získání všech obsahových článků v dané kategorii
	 * 
	 * @param {category} Zadaná kategorie, v níž se bude hledat seznam článků
	 * @param {allpagesContinue} Začátek seznamu článků (získán z API při rekurzivním volání)
	 */
	getAPIpages: function(category, allpagesContinue)
	{
		$.ajax({
			url: mw.util.wikiScript("api"),
			data: {
				format: "json",
				action: "query",
				list: "categorymembers",
				cmlimit: "500",
				cmnamespace: "0|1",
				/* hlavní, diskuse */
				cmtype: "page",
				cmcontinue: ((typeof(allpagesContinue) !== "undefined") ? allpagesContinue : ""),
				cmtitle: category
			},
			dataType: 'json',
			type: 'GET',
			success: function(data) {
				/* zapíšu výsledný seznam článků do pole contentPages */
				if (data && data.query && data.query.categorymembers) {
					$.each(data.query.categorymembers, function(i, value) {
						/* zapíšu jen název článku, jmenný prostor vyřadíme, u LiquidThreads vysosáme název článku */
						var title = categoryIntersection.processValue(value);
						categoryIntersection.contentPages.push(title);
					});
				}
				categoryIntersection.loader("Načteno " + categoryIntersection.contentPages.length + " článků z " + category + ".");
				
				/* pokud není seznam kompletní, rekurzivně zavolám funkcí znovu pro dalších 500 článků */
				if (typeof data.continue !== "undefined") {
					categoryIntersection.getAPIpages(category, data.continue.cmcontinue);
				/* pokud je seznam kompletní, končím a jdu zjistit portály */
				} else {
					categoryIntersection.getAPIsecond(window.prompt("Zadejte prosím druhou kategorii k průniku s kategorií " + mw.config.get("wgTitle") + ".", "Ke zpracování"));
				}
			}
		});
	},

	/**
	 * Získání všech obsahových článků v dané kategorii
	 * 
	 * @param {category} Zadaná kategorie, v níž se bude hledat seznam článků
	 * @param {allpagesContinue} Začátek seznamu článků (získán z API při rekurzivním volání)
	 */
	getAPIsecond: function(category, allpagesContinue)
	{
		/* do API dotazu patří kompletní jméno kategorie s podtržítkem */
		var categoryName = "Kategorie:" + category.replace(" ", "_");
		$.ajax({
			url: mw.util.wikiScript("api"),
			data: {
				format: "json",
				action: "query",
				list: "categorymembers",
				cmlimit: "500",
				cmnamespace: "0|1",
				/* hlavní, diskuse */
				cmtype: "page",
				cmcontinue: ((typeof(allpagesContinue) !== "undefined") ? allpagesContinue : ""),
				cmtitle: categoryName
			},
			dataType: 'json',
			type: 'GET',
			success: function(data) {
				/* zjistím průnik kategorií */
				if (data && data.query && data.query.categorymembers) {
					$.each(data.query.categorymembers, function(i, value) {
						/* v úvahu beru jen název článku, jmenný prostor vyřadíme */
						var title = categoryIntersection.processValue(value);
						var index = categoryIntersection.contentPages.indexOf(title);
						/* pokud je článek nalezen v seznamu z první kategorie, dám jej do výsledkového pole */
						if (index > -1) {
							categoryIntersection.foundPages.push(title);
						}
					});
				}

				/* pokud není seznam kompletní, rekurzivně zavolám funkcí znovu pro dalších 500 článků */
				if (typeof data.continue !== "undefined") {
					categoryIntersection.getAPIsecond(category, data.continue.cmcontinue);
				/* pokud je seznam kompletní, končím a jdu to vypsat na obrazovku */
				} else {
					categoryIntersection.loader("Hotovo, provádím výpis.");
					categoryIntersection.printArticles(category);
				}
			}
		});
	},

	/**
	 * Zpracování názvu článku z API (osekání jmenných prostorů a podstránek)
	 * 
	 * @param {value} pole informací o článku z API
	 */
	processValue: function(value)
	{
		var title;
		switch (value.ns) {
			/* diskuse */
			case 1:
				title = value.title.substring(value.title.indexOf(":") + 1);
				break;
				/* thread z LiquidThreads (může obsahovat jmenný prostor nejen "Thread:", ale i "Thread:Diskuse:"...) */
			case 90:
				/* smažu Thread */
				title = value.title.replace("Thread:", "");
				/* smažu případné Diskuse, pokud je indexOf -1, tak stejně ten string vezmu od nuly */
				title = title.substring(title.indexOf(":") + 1, title.indexOf("/"));
				break;
				/* články */
			default:
				title = value.title;
		}
		return title;
	},

	/**
	 * Výpis článků na obrazovku
	 * 
	 * @param {category} Jméno kategorie, se kterou se hledá průnik.
	 */
	printArticles: function(category)
	{
		var vypis = "<h1 id='firstHeading'>Články s průnikem dvou kategorií</h1>" + "<p>Níže je uveden seznam článků, které jsou začleněny v kategoriích <strong>" + mw.config.get("wgTitle") + "</strong> a <strong>" + category + "</strong>. " + "Počítají se jen obsahové články v hlavním jmenném prostoru (včetně svých diskusních stránek). " + "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 < categoryIntersection.foundPages.length; i++) {
			vypis += "<li><a href='" + mw.config.get("wgServer") + mw.config.get("wgScriptPath") + "/index.php?title=" + categoryIntersection.foundPages[i] + "' target='_new'>" + categoryIntersection.foundPages[i] + "</a></li>";
		}
		
		vypis += "</ul>";
		document.getElementById("content")
			.innerHTML = vypis;
	},

	/**
	 * Zobrazení odkazu v menu
	 */
	displayMenuLink: function()
	{
		mw.util.addPortletLink('p-editorial-links', 'javascript:categoryIntersection.start();', 'Průnik kategorií', 'n-prunik-kategorii', 'Najde články, které jsou vloženy do této a další (vámi zadané) kategorie');
	},

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

	/**
	 * Nastartovat skript
	 */
	start: function()
	{
		/* zobrazit loader */
		categoryIntersection.loader();
		categoryIntersection.loader("Načítám seznam článků.");
		/* spustit API pro články */
		categoryIntersection.getAPIpages(mw.config.get("wgPageName"));
	}
};

/* START! */
$(function() {
	categoryIntersection.displayMenuLink();
});