Użytkownik:209po/common.js

Z Nondanych
< Użytkownik:209po
Wersja z dnia 19:54, 26 kwi 2020 autorstwa 209po (dyskusja • edycje) (Utworzono nową stronę "// źródło: https://nonsa.pl/wiki/MediaWiki:Gadget-EdytujWNondanych.js // autorzy: Expert3222 (wersja oryginalna), 209po (dostosowanie do tutejszych potrzeb) var MAX_...")
(różn.) ← poprzednia wersja • przejdź do aktualnej wersji (różn.) • następna wersja → (różn.)

Uwaga: aby zobaczyć zmiany po opublikowaniu, może zajść potrzeba wyczyszczenia pamięci podręcznej przeglądarki.

  • Firefox / Safari: Przytrzymaj Shift podczas klikania Odśwież bieżącą stronę, lub naciśnij klawisze Ctrl+F5, lub Ctrl+R (⌘-R na komputerze Mac)
  • Google Chrome: Naciśnij Ctrl-Shift-R (⌘-Shift-R na komputerze Mac)
  • Internet Explorer / Edge: Przytrzymaj Ctrl, jednocześnie klikając Odśwież, lub naciśnij klawisze Ctrl+F5
  • Opera: Naciśnij klawisze Ctrl+F5.
// źródło: https://nonsa.pl/wiki/MediaWiki:Gadget-EdytujWNondanych.js
// autorzy: Expert3222 (wersja oryginalna), 209po (dostosowanie do tutejszych potrzeb)

var MAX_PAGES_IN_SMW_QUERY = 11,
	MAX_PAGES_IN_EXIST_QUERY = 50;

if (mw.config.get("wgUserGroups").indexOf("sysop") != -1 || mw.config.get("wgUserGroups").indexOf("bot") != -1)
{
	MAX_PAGES_IN_EXIST_QUERY = 500;
}

$(document).ready(function()
{
		//button pokazujący, czy dana strona została już uzupełniona w Nondanych
		var title = mw.config.get("wgPageName").replace(/_/g, " ");
		var filledPageCode = "<img id='nondaneEditedButton' src='https://upload.wikimedia.org/wikipedia/commons/1/1e/Button_Icon_GreenForest.svg' width='20px' height='20px' style='padding: 0px 0px 3px 10px;' title='Ta strona została już uzupełniona w Nondanych' />";
		var notFilledPageCode = "<img id='nondaneEditedButton' src='https://upload.wikimedia.org/wikipedia/commons/0/07/Button_Icon_Red.svg' width='20px' height='20px' style='padding: 0px 0px 3px 10px;' title='Ta strona nie została jeszcze uzupełniona w Nondanych' />";
	
	    isSinglePageFilled(title)
		.done(function(filled)
		{
			if (filled)
			{
				$("#firstHeading").append(filledPageCode);
			}
			else
			{
				$("#firstHeading").append(notFilledPageCode);
			}
		});
		
		parsePageLinks();
});

function isSinglePageFilled(title)
{
	var deferred = $.Deferred();
	mw.loader.using("mediawiki.ForeignApi", function()
	{
		var api = new mw.ForeignApi("https://dane.nonsa.pl/api.php");
		
		api.post(
		{
			action: 'ask',
			format: 'json',
			query: '[[Nie posiada typu strony Gry::true]] [[' + title + ']]'
		}).done(function(data)
		{
			var possiblyFilled = (typeof data.query.results[title] === "undefined");
			if (possiblyFilled)
			{
				api.post (
				{
					action: 'query',
					format: 'json',
					titles: title
				}).done(function(data)
				{
					if (typeof data.query.pages["-1"] === "undefined")
					{
						deferred.resolve(true);
					}
					else
					{
						deferred.resolve(false);
					}
				}).fail(function(error)
				{
					console.log(error);
					deferred.resolve(false);
				});
			}
			else
			{
				deferred.resolve(false);
			}
		}).fail(function(error)
		{
			console.log(error);
			deferred.resolve(false);
		});
	});
	return deferred.promise();
}

function getTitleFromUrl(url)
{
	var match = url.match(/((?:\?title=)|(?:\/wiki\/))([^&\?#]*)/); //raz link wewnętrzny jest przez index.php?title, raz przez /wiki/...
	return match ? match[2] : null;
}

function parsePageLinks()
{
	var filledPageLinkCSS = {"text-shadow": "rgba(0, 255, 0, 3) 0em 0em 1em, rgba(0, 255, 0, 0.5) 0em 0em 1em"}; //celowo powtórzone, żeby cień był mocniejszy
	var notFilledPageLinkCSS = {"text-shadow": "rgba(255, 0, 0, 3) 0em 0em 1em, rgba(255, 0, 0, 0.5) 0em 0em 1em"};
	
	var links = $(".mw-parser-output a[href]");
	//dlaczego nie ma klasy dla linków występujących bezpośrednio w wikitekście, a nie dodawanych automatycznie (np. do edycji sekcji lub do obrazków)...?
	links = links.filter(function()
	{
		var $this = $(this);
		/*console.log($this.parent());
		console.log($this.parent().hasClass("mw-editsection"));*/
		return ($this.parent().hasClass("mw-editsection") == false && $this.hasClass("image") == false);
	});
	
	//console.dir(links);
		
	var allPages = [];
	var mapDOMElementsToLinks = {};
	links.each(function()
	{
		//TODO: usuwanie duplikatów w allPages
				
		var $this = $(this),
		title = getTitleFromUrl($this.attr("href"));
		title = decodeURIComponent(title).replace(/_/g, " ");
		if (title.indexOf("Gra:") == -1)
		{
			return;
		}
		
		mapDOMElementsToLinks[title] = mapDOMElementsToLinks[title] || []; //początkowo zmienna będzie undefined, a przez to stanie się pustą tablicą, co pozwoli użyć metody push
		mapDOMElementsToLinks[title].push($this);
		allPages.push(title);
	});
	
	//console.dir(mapDOMElementsToLinks);
	
	mw.loader.using("mediawiki.ForeignApi", function()
	{
		var api = new mw.ForeignApi("https://dane.nonsa.pl/api.php");
		
		SMWQueryFull(allPages)
		.done(function(pagesPossiblyFilled)
		{
			pagesMissingQueryFull(allPages)
			.done(function(pagesMissing)
			{
				/*console.dir(pagesMissing);
				console.dir(allPages);*/
				$.each(mapDOMElementsToLinks, function(name, arrayOfDOMLinkObjects)
				{
					if (typeof pagesPossiblyFilled[name] === "undefined" &&
						typeof pagesMissing[name] === "undefined")
					{
						//console.log("Wypełniona strona " + name);
						$(arrayOfDOMLinkObjects).each(function(index, DOMLinkObject)
						{
							$(DOMLinkObject).css(filledPageLinkCSS).attr("title", ($(DOMLinkObject).attr("title") || name) + " (opisana w Nondanych)");
						});
					}
					else
					{
						//console.log("Niewypełniona strona " + name);
						$(arrayOfDOMLinkObjects).each(function(index, DOMLinkObject)
						{
							$(DOMLinkObject).css(notFilledPageLinkCSS).attr("title", ($(DOMLinkObject).attr("title") || name) + " (nieopisana w Nondanych)");
						});
					}
				});
			}).fail(function(error)
			{
				console.log(error);
			});
		}).fail(function(error)
		{
			console.log(error);
		});
	});
	
	//console.log(SMWPageList);
}

function SMWQueryPartial(allPages, startingIndex, pagesPossiblyFilled)
{
	var deferred = $.Deferred(),
		currentPages = allPages.slice(startingIndex, Math.min(allPages.length, startingIndex + MAX_PAGES_IN_SMW_QUERY)),
		SMWQuery = "[[Nie posiada typu strony Gry::true]] [[" + currentPages.join("||") + "]]";
		
	mw.loader.using("mediawiki.ForeignApi", function()
	{
		var api = new mw.ForeignApi("https://dane.nonsa.pl/api.php");
	
		api.post(
		{
			action: 'ask',
			format: 'json',
			query: SMWQuery
		}).done(function(data)
		{
			$.each(data.query.results, function(name, value)
			{
				pagesPossiblyFilled[name] = true;
			});
			deferred.resolve();
		}).fail(function(error)
		{
			console.log(error);
			deferred.reject();
		});
	});
	return deferred.promise();
}

function SMWQueryFull(allPages)
{
	var numPartialQueries = Math.ceil(allPages.length / MAX_PAGES_IN_SMW_QUERY),
		deferred = $.Deferred(),
		completed = 0,
		pagesPossiblyFilled = {}; //obiekt, żeby można było używać jako tablicy asocjacyjnej
	
	for (var index = 0, i = 0; i < numPartialQueries; ++i, index += MAX_PAGES_IN_SMW_QUERY)
	{
		SMWQueryPartial(allPages, index, pagesPossiblyFilled)
		.always(function()
		{
			++completed;
			if (completed == numPartialQueries)
			{
				deferred.resolve(pagesPossiblyFilled);
			}
		});
	}
		
	return deferred.promise();
}

function pagesMissingQueryPartial(allPages, startingIndex, pagesMissing)
{
	var deferred = $.Deferred(),
		currentPages = allPages.slice(startingIndex, Math.min(allPages.length, startingIndex + MAX_PAGES_IN_EXIST_QUERY));
		
	mw.loader.using("mediawiki.ForeignApi", function()
	{
		var api = new mw.ForeignApi("https://dane.nonsa.pl/api.php");
	
		api.post(
		{
			action: "query",
			format: "json",
			formatversion: 2,
			titles: currentPages.join("|"),
		}).done(function(data)
		{
			data.query.pages.forEach(function(page)
			{
				if (page.missing == true)
				{
					pagesMissing[page.title] = true;
				}
			});
			deferred.resolve();
		}).fail(function(error)
		{
			console.log(error);
			deferred.reject();
		});
	});
	return deferred.promise();
}

function pagesMissingQueryFull(allPages)
{
	var numPartialQueries = Math.ceil(allPages.length / MAX_PAGES_IN_EXIST_QUERY),
		deferred = $.Deferred(),
		completed = 0,
		pagesMissing = {};
	
	for (var index = 0, i = 0; i < numPartialQueries; ++i, index += MAX_PAGES_IN_EXIST_QUERY)
	{
		pagesMissingQueryPartial(allPages, index, pagesMissing)
		.always(function()
		{
			++completed;
			if (completed == numPartialQueries)
			{
				deferred.resolve(pagesMissing);
			}
		});
	}
		
	return deferred.promise();
}