MediaWiki:Gadget-EdytujWNondanych.js: Różnice pomiędzy wersjami

Z Nonsensopedii, polskiej encyklopedii humoru
M (w sumie)
Linia 7: Linia 7:
//button pokazujący, czy dana strona została już uzupełniona w Nondanych
//button pokazujący, czy dana strona została już uzupełniona w Nondanych
var tytul = mw.config.get("wgPageName").replace(/_/g, " ");
var title = mw.config.get("wgPageName").replace(/_/g, " ");
var kodWypelnionej = "<a href='https://dane.nonsa.pl/wiki/" + encodeURI(mw.config.get("wgPageName")) + "?action=formedit'><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' /></a>";
var filledPageCode = "<a href='https://dane.nonsa.pl/wiki/" + encodeURI(mw.config.get("wgPageName")) + "?action=formedit'><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' /></a>";
var kodNiewypelnionej = "<a href='https://dane.nonsa.pl/wiki/" + encodeURI(mw.config.get("wgPageName")) + "?action=formedit'><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' /></a>";
var notFilledPageCode = "<a href='https://dane.nonsa.pl/wiki/" + encodeURI(mw.config.get("wgPageName")) + "?action=formedit'><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' /></a>";
isSinglePageFilled(title)
var api = new mw.ForeignApi("https://dane.nonsa.pl/api.php");
.done(function(filled)
api.post(
{
{
if (filled)
action: 'ask',
{
format: 'json',
$("#firstHeading").append(filledPageCode);
query: '[[Nie posiada typu strony Gry::true]] [[' + tytul + ']]'
}
}).done(function(dane)
else
{
{
var wypelniona = (typeof dane.query.results[tytul] === "undefined");
$("#firstHeading").append(notFilledPageCode);
if (wypelniona)
}
});
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 (
api.post (
Linia 26: Linia 49:
action: 'query',
action: 'query',
format: 'json',
format: 'json',
titles: tytul
titles: title
}).done(function(dane)
}).done(function(data)
{
{
if (typeof dane.query.pages["-1"] === "undefined")
if (typeof data.query.pages["-1"] === "undefined")
{
{
$("#firstHeading").append(kodWypelnionej);
deferred.resolve(true);
}
}
else
else
{
{
deferred.resolve(false);
$("#firstHeading").append(kodNiewypelnionej);
}
}
}).fail(function(error)
}).fail(function(error)
{
{
console.log(error);
console.log(error);
});
});
}
}
else
else
{
{
deferred.resolve(false);
$("#firstHeading").append(kodNiewypelnionej);
}
}
}).fail(function(error)
}).fail(function(error)
{
{
console.log(error);
console.log(error);
deferred.resolve(false);
});
});
}
});
});
return deferred.promise();
}

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

function parsePageLinks()
{
var filledPageLinkCSS = {"text-shadow": "rgba(0, 255, 0, 3) 0em 0em 1em"};
var notFilledPageLinkCSS = {"text-shadow": "rgba(255, 0, 0, 3) 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 SMWPageList = "";
var mapDOMElementsToLinks = {};
links.each(function()
{
//TODO: usuwanie duplikatów w SMWPageList
var $this = $(this), title;
if ($this.attr("title")) //linki wewnętrzne
{
title = $this.attr("title");
}
else //linki zewnętrzne
{
title = getTitleFromExternalUrl($this.attr("href"));
}
title = decodeURI(title);
if (title == null || title.indexOf("Gra:") == -1)
{
return;
}
mapDOMElementsToLinks[title] = mapDOMElementsToLinks[title] || [];
mapDOMElementsToLinks[title].push($this);
SMWPageList += title + "||";
});
//console.dir(mapDOMElementsToLinks);
SMWPageList = SMWPageList.substr(0, SMWPageList.length - 2); //pozbycie się dwóch ostatnich |
var SMWQuery = "[[Nie posiada typu strony Gry::true]] [[" + SMWPageList + "]]";
//console.log(SMWPageList);
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(pagesPossiblyFilled)
{
api.post(
{
action: "query",
format: "json",
formatversion: 2,
titles: SMWPageList.replace("||", "|"),
}).done(function(existingPages)
{
//console.dir(pagesPossiblyFilled);
//console.dir(existingPages);
var missingPages = [];
existingPages.query.pages.forEach(function(page)
{
if (page.missing == "true")
{
missingPages.push(page.title);
}
});
$.each(mapDOMElementsToLinks, function(name, arrayOfDOMObjects)
{
if (typeof pagesPossiblyFilled.query.results[name] === "undefined" &&
!missingPages.includes(name))
{
//console.log("Wypełniona strona " + name);
$(arrayOfDOMObjects).each(function(index, DOMObject)
{
$(DOMObject).css(filledPageLinkCSS).attr("title", ($(DOMObject).attr("title") || name) + " (opisana w Nondanych)");
});
}
else
{
//console.log("Niewypełniona strona " + name);
$(arrayOfDOMObjects).each(function(index, DOMObject)
{
$(DOMObject).css(notFilledPageLinkCSS).attr("title", ($(DOMObject).attr("title") || name) + " (nieopisana w Nondanych)");
});
}
});
}).fail(function(error)
{
console.log(error);
});
}).fail(function(error)
{
console.log(error);
});
});
//console.log(SMWPageList);
}

Wersja z 21:52, 6 lis 2019

$(document).ready(function()
{
	if (mw.config.get("wgNamespaceNumber") == 108)
	{
		//przycisk "Edytuj w Nondanych"
		$("#ca-edit").before("<li id='ca-nondaneEdit'><span><a href='https://dane.nonsa.pl/wiki/" + encodeURI(mw.config.get("wgPageName")) + "?action=formedit'>Edytuj w Nondanych</a></span></li>");
		
		//button pokazujący, czy dana strona została już uzupełniona w Nondanych
		var title = mw.config.get("wgPageName").replace(/_/g, " ");
		var filledPageCode = "<a href='https://dane.nonsa.pl/wiki/" + encodeURI(mw.config.get("wgPageName")) + "?action=formedit'><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' /></a>";
		var notFilledPageCode = "<a href='https://dane.nonsa.pl/wiki/" + encodeURI(mw.config.get("wgPageName")) + "?action=formedit'><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' /></a>";
	
	    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);
				});
			}
			else
			{
				deferred.resolve(false);
			}
		}).fail(function(error)
		{
			console.log(error);
			deferred.resolve(false);
		});
	});
	return deferred.promise();
}

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

function parsePageLinks()
{
	var filledPageLinkCSS = {"text-shadow": "rgba(0, 255, 0, 3) 0em 0em 1em"};
	var notFilledPageLinkCSS = {"text-shadow": "rgba(255, 0, 0, 3) 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 SMWPageList = "";
	var mapDOMElementsToLinks = {};
	links.each(function()
	{
		//TODO: usuwanie duplikatów w SMWPageList
				
		var $this = $(this), title;
		if ($this.attr("title")) //linki wewnętrzne
		{
			title = $this.attr("title");
		}
		else //linki zewnętrzne
		{
			title = getTitleFromExternalUrl($this.attr("href"));
		}
		title = decodeURI(title);
		if (title == null || title.indexOf("Gra:") == -1)
		{
			return;
		}
		
		mapDOMElementsToLinks[title] = mapDOMElementsToLinks[title] || [];
		mapDOMElementsToLinks[title].push($this);
		SMWPageList += title + "||";
	});
	
	//console.dir(mapDOMElementsToLinks);
	SMWPageList = SMWPageList.substr(0, SMWPageList.length - 2); //pozbycie się dwóch ostatnich |
	var SMWQuery = "[[Nie posiada typu strony Gry::true]] [[" + SMWPageList + "]]";
	
	//console.log(SMWPageList);
	
	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(pagesPossiblyFilled)
		{
			api.post(
			{
				action: "query",
				format: "json",
				formatversion: 2,
				titles: SMWPageList.replace("||", "|"),
			}).done(function(existingPages)
			{
				//console.dir(pagesPossiblyFilled);
				//console.dir(existingPages);
				
				var missingPages = [];
				existingPages.query.pages.forEach(function(page)
				{
					if (page.missing == "true")
					{
						missingPages.push(page.title);
					}
				});
				
				$.each(mapDOMElementsToLinks, function(name, arrayOfDOMObjects)
				{
					if (typeof pagesPossiblyFilled.query.results[name] === "undefined" &&
						!missingPages.includes(name))
					{
						//console.log("Wypełniona strona " + name);
						$(arrayOfDOMObjects).each(function(index, DOMObject)
						{
							$(DOMObject).css(filledPageLinkCSS).attr("title", ($(DOMObject).attr("title") || name) + " (opisana w Nondanych)");
						});
					}
					else
					{
						//console.log("Niewypełniona strona " + name);
						$(arrayOfDOMObjects).each(function(index, DOMObject)
						{
							$(DOMObject).css(notFilledPageLinkCSS).attr("title", ($(DOMObject).attr("title") || name) + " (nieopisana w Nondanych)");
						});
					}
				});
			}).fail(function(error)
			{
				console.log(error);
			});
		}).fail(function(error)
		{
			console.log(error);
		});
	});
	
	//console.log(SMWPageList);
}