Benutzer:CennoxX/js/bkl-replace.js

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen

Hinweis: Leere nach dem Veröffentlichen den Browser-Cache, um die Änderungen sehen zu können.

  • Firefox/Safari: Umschalttaste drücken und gleichzeitig Aktualisieren anklicken oder entweder Strg+F5 oder Strg+R (⌘+R auf dem Mac) drücken
  • Google Chrome: Umschalttaste+Strg+R (⌘+Umschalttaste+R auf dem Mac) drücken
  • Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
// Script from [[User:CennoxX]]
// CC BY-SA 3.0
// beta version 0.4.6
//
// Dieses Script ermöglicht das schnelle Korrigieren von Links auf Begriffsklärungen mithilfe von Auswahllisten.
// In den Auswahllisten werden alle auf der entsprechenden Begriffsklärungsseite angegebenen Links aufgeführt.
// Sobald alle geöffneten Auswahllisten in einem Artikel ausgefüllt wurden, werden die Änderungen gespeichert.
// Die Seite wird daraufhin aktualisiert.

(function($, mw){
	var pageTitle = mw.config.get("wgRelevantPageName");
	var bkls = $(".mw-disambig");
	var unsolvedBkls = 0;
	var changes = [];
	bkls.each(addEditButton);
	function addEditButton(index,bkl){
		var editButton = $("<span role='button' style='color:green;cursor:pointer;'>✎</span>");
		$(bkl).after(editButton);
		$(editButton).on("click", function(o){
			replaceButtons(this);
			addSelectBox(bkl);
		});
	}
	function replaceButtons(editButton){
		unsolvedBkls++;
		var deleteButton = $("<span role='button' style='color:red;cursor:pointer;'>✘</span>");
		deleteButton.on("click", deleteSelectBox);
		$(editButton).after(deleteButton);
		$(editButton).remove();
	}
	function deleteSelectBox(e){
		var selectBox = $(e.target).prev()[0];
		var link = selectBox[0].value;
		var label = selectBox[0].innerText;
		var bklLink = $("<a href='/wiki/" + link + "' class='stub mw-disambig' title='" + link + "'>" + label + "</a>");
		$(selectBox).replaceWith(bklLink);
		var deleteButton = e.target;
		$(deleteButton).remove();
		addEditButton(null,bklLink[0]);
		if (changes.filter(i => i.old == selectBox[0].value)[0])
		{
			changes.pop(changes.filter(i => i.old==selectBox[0].value)[0]);
		}
		//if all Bkls resolved
		else if(--unsolvedBkls === 0 && changes.length !== 0)
		{
			getWikiText();
		}
	}
	function addSelectBox(bkl){
		//get article name
		var link = decodeURIComponent(bkl.href.replace(/.*\/wiki\//,"").replace(/_/g," "));
		var innerOptions = "";
		var selectBox = $("<select style='color:#723;background-color:#f99;'></select>");
		$.get(
			mw.util.wikiScript("api"),
			{
				format: "json",
				action: "query",
				prop: "links",
				titles: link,
				pllimit: 50,
				plnamespace: 0
			},
			"json"
		).done(function(data){
			try{
				var pageId = Object.keys(data.query.pages)[0];
				//create an option for every link
				$.each(data.query.pages[pageId].links, function(i,e){
					innerOptions += "<option style='color:#000;background-color:#fff;' value='" + e.title + "'>" + e.title + "</option>";
				});
				selectBox.html("<option disabled selected style='display:none;color:#723;background-color:#f99;' value='" + link + "'>" + bkl.innerText + "</option>" + innerOptions);
				$(bkl).replaceWith(selectBox);
			}
			catch(e)
			{
				errorHandling();
			}
		})
		.fail(errorHandling);
		selectBox.on("change", selectBoxChosen);		
	}
	function selectBoxChosen(e){
		$(e.target).css({"color":"#000","background-color":"#fff"});
		if (changes.filter(e => e.old == this[0].value)[0])
		{
			changes.filter(e => e.old == this[0].value)[0].new = this.value;
		}
		else
		{
			changes.push({old: this[0].value, new: this.value});
			//if all Bkls resolved
			if(--unsolvedBkls === 0 && changes.length !== 0)
			{
				getWikiText();
			}
		}
	}
	
	function getWikiText(){
		$.get(
			mw.util.wikiScript("api"),
			{
				format: "json",
				action: "query",
				prop: "revisions",
				rvprop: "content",
				rvslots: "*",
				rvlimit: 1,
				titles: pageTitle
			},
			"json"
		)
		.done(function(data){
			var page, wikitext;
			try
			{
				for (page in data.query.pages){
					wikitext = editText(data.query.pages[page].revisions[0].slots.main["*"]);
					getToken(wikitext);
				}
			}
			catch(e)
			{
				errorHandling();
			}
		})
		.fail(errorHandling);
	}
	function editText(wikitext){
		$.each(changes, function(i,c){
			wikitext = wikitext.replace("[["+c.old+"]]","[["+c.new+"|"+c.old+"]]");
			wikitext = wikitext.replace("[["+c.old+"|","[["+c.new+"|");
		});
		return wikitext;		
	}
	function getToken(wikitext){
		$.get(
			mw.util.wikiScript("api"),
			{
				format: "json",
				action: "query",
				meta: "tokens"
			},
			"json"
		).done(function(tokendata){
			try
			{
				var token = tokendata.query.tokens.csrftoken;
				editPage({
					title: pageTitle,
					text: wikitext,
					summary: "BKL ersetzt mit [[Benutzer:CennoxX/js/bkl-replace.js|bkl-replace]]",
					token: token
				});
			}
			catch(e)
			{
				errorHandling();
			}
		})
		.fail(errorHandling);
	}
	function editPage(info){
		mw.notify("Änderung speichern …", {title: "Begriffsklärungen ersetzen", tag: "bkl-replace"});
		$.post(
			mw.util.wikiScript("api"),
			{
				format: "json",
				action: "edit",
				title: info.title,
				text: info.text,
				summary: info.summary,
				token: info.token,
				minor: true
			},
			"json"
		)
		.done (function(data){
			if(data && data.edit && data.edit.result && data.edit.result == "Success")
			{
				location.reload();
			}
			else
			{
				errorHandling();
			}
		})
		.fail(errorHandling);
	}
	function errorHandling(){
		console.log("Ein Fehler ist aufgetreten");
	}
}(jQuery, mediaWiki));