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();
});