Benutzer:Dbenzhuser/Monobook

Dies ist eine alte Version dieser Seite, zuletzt bearbeitet am 10. Februar 2006 um 07:09 Uhr durch Dbenzhuser (Diskussion | Beiträge) (Admin-Helfer: Automatischer NowCommons-Text). Sie kann sich erheblich von der aktuellen Version unterscheiden.

Diese Seite dient zur Vorstellung meiner Scripte für monobook.js, bzw. monobook.css und soll es auch Laien ermöglichen in den Genuss der schönen Funktionen zu kommen ;)

Falls nicht anders erwähnt, wurden die Scripte mit der aktuellen Version des Firefox getestet. Falls es bei anderen Browsern zu Problemen kommt freue ich mich immer über Hinweise oder Lösungsvorschläge.

Die einzelnen Scripte sind voneinander unabhängig. Durch einfaches Kopieren der Abschnitte in die eigenen monobook-Dateien sollte alles funktionieren. Nach dem Abspeichern muss meist noch der Cache gelehrt werden. Auch brauchen die Server manchmal eine Zeit lang, bis neue Versionen ausgeliefert werden.

[Bearbeiten]-Links für Abschnitte werden direkt neben die jeweiligen Überschrift verschoben. Kein Verrutschen mehr, keine Suche bei breitem Browserfenster, logischere Struktur.

monobook.js

/*
 * moveEditsection
 * Dieses Script verschiebt die Editsection-Buttons von oberhalb der
 * Überschriften in die Überschriften.
 * Dies vermeidet zum einen die Fehldarstellungen, die bisher durch die
 * float-Werte hervorgerufen wurden, und ergibt zum anderen eine logischere
 * Dokumentenstruktur (Editsection gehört nicht zum vorherigen Abschnitt)
 * Positiv getestet unter: Firefox 1.0, Opera 8.0, Internet Explorer 6.0
 * Anmerkungen, Verbesserungen, Hinweise, Nörgeleien jederzeit gerne gesehen!
 * dbenzhuser (de:Benutzer:Dbenzhuser)
 */

function moveEditsection() {
	// Sammelt alle div-Elemente der Klasse "editsection".
	var editsections = new Array();
	var divs = document.getElementById("bodyContent").getElementsByTagName("div");
	for(var i = 0; i < divs.length; i++) {
		if(divs[i].className == "editsection") {
			editsections.push(divs[i]);
		}
	}
	// Wenn die Seite Editsection-Buttons enthält.
	if (editsections.length != 0) {
		// Sucht zu jedem Editsection-Button die dazugehörige Überschrfift.
		var i = 0;
		var element, heading;
		while (editsections[i] != null) {
			element = editsections[i];
			heading = element.nextSibling;
			while(!/^H[2-6]$/.test(heading.nodeName)) {
				heading = heading.nextSibling;
			}
			// Erstellt innerhalb der Überschrift ein per CSS formatiertes span-Element.
			// Dort hinein wird dann der Editsection-Link verschoben.
			// Anschließend werden die Reste des alten Editsection-Buttons entfernt.
			var spanElement = document.createElement("span");
			var spaceNode = document.createTextNode(" ");
			heading.appendChild(spaceNode);
			heading.appendChild(spanElement);
		
			spanElement.style.fontSize = "x-small";
			spanElement.style.fontWeight = "normal";
		
			while (element.childNodes.length != 0) {
				spanElement.appendChild(element.childNodes[0]);
			}
			element.parentNode.removeChild(element);
			i++;
		}
	}
}
// onload
aOnloadFunctions[aOnloadFunctions.length] = moveEditsection;

/*
 * Ende moveEditsection
 */


Baut unter der Werkzeugleiste links einen Link ein, mit dem eine alphabetisch sortierte Liste aller Wikilinks im Artikel aktiviert wird. Gleichzeitig werden direkt im Artikel alle mehrfach vorkommenden Links gekennzeichnet. Achtung: Seiten wie Wikipedia:Artikelwünsche/Ding-Liste/S mit knapp 8500 (meist sinnbefreiten) Links benötigen mit meinem 2 Ghz Athlon schon mal 20 bis 30 Sekunden bis der Browser nach Anklicken des Aktivieren-Links wieder reagiert. Bisher nur mit Gecko erfolgreich getestet. Klappt jetzt durch einen kleinen Fix auch in der Vorschau.

monobook.js

/*
 * showRedundantLinks
 * In der Navigationsleiste am Rand wird eine sortierte Liste aller im Artikel
 * vorkommenden Links erstellt. Mehrfach vorkommende Links werden im Artikel
 * gekennzeichnet.
 * Beim Überfahren von Links mit der Maus werden alle Vorkommen des
 * entsprechenden Links mit der Klasse "highlight" ausgestattet. Dies kann mit
 * CSS sichtbar gemacht werden (siehe de:Benutzer:Dbenzhuser/monobook.css für
 * ein Beispiel).
 * Ziel ist es auch bei längeren Artikeln leicht mehrfach vorkommende Links
 * ausfindig zu machen.
 * Scheint bislang nur mit Gecko-Browsern zu funktionieren.
 * Anmerkungen, Verbesserungen, Hinweise, Nörgeleien jederzeit gerne gesehen!
 * dbenzhuser (de:Benutzer:Dbenzhuser)
 */

// Zutun: Links an der Seite mit Sonderfunktionen belegen.
// Z.B. dauerhaft markieren, Sprung zu Link.

// Mergesort für Arrays
// Wegen kleiner Modifikationen (siehe Kommentare) nur zur Verwendung bei der
// Erstellung der Linkleiste.
var b;
Array.prototype.mergesort = function(lo, hi) {
	if (lo<hi) {
		var mid = ((hi+lo)-(hi+lo)%2) / 2;
		this.mergesort(lo, mid);
		this.mergesort(mid+1, hi);
		var i=0;
		var j=lo;
		while (j<=mid) {
			b[i++]=this[j++];
		}
		var i=0;
		var k=lo;
		while (k<j && j<=hi) {
			// Sortiert wird nach Title-Attribut der Links.
			// '[0].getAttribute("title")' entfernen für normalen Mergesort.
			if (b[i][0].getAttribute("title")<=this[j][0].getAttribute("title")) {
				this[k++]=b[i++];
			}
			else {
				this[k++]=this[j++];
			}
		}
		while (k<j) {
			this[k++]=b[i++];
		}
	}
}

// Fügt einem Attribut einen weiteren durch Leerzeichen abgetrennten Wert hinzu.
Node.prototype.addAttributeValue = function(key, value) {
	if (!this.getAttribute(key)) {
		this.setAttribute(key, value);
	}
	else {
		this.setAttribute(key, this.getAttribute(key)+ " " +value);
	}
}

// Löscht einen Wert aus einem Attribut.
Node.prototype.removeAttributeValue = function(key, value) {
	var newvalue = this.getAttribute(key);
	var reg = new RegExp("(^|\\s)"+value+"(\\s|$)");
	newvalue = newvalue.replace(reg, " ");
 	newvalue = newvalue.replace(/^\s+/g, "");
 	newvalue = newvalue.replace(/\s+$/g, "");
	this.setAttribute(key, newvalue);
}

// Markierungen werden bei allen Links der übergebenen Klasse ein bzw ausgeblendet.
function highlight(cname, on) {
	var objects = document.getElementsByTagName("a");
	cname = cname.replace("(", "\\(");
 	cname = cname.replace(")", "\\)");
	var reg = new RegExp("(^|\\s)"+cname+"(\\s|$)"); 
	var length = objects.length
	for(var i = 0; i < length; i++) {
		if(objects[i].className.search(reg) != -1) {
			if(on) {
				objects[i].addAttributeValue("class", "highlight");
			}
			else {
				objects[i].removeAttributeValue("class", "highlight");
			}
		}
	}
}

// Nach dem Vorbild der bereits vorhandenen Listen wird eine neue Box in der
// Navigationsleiste installiert, die einen Link zum Aktivieren des
// Linksammlers enthält.
function createLinksSidebar() {
	// Elemente der Box erstellen.
	var divPortlet = document.createElement("div");
	var h5 = document.createElement("h5");
	var h5Text = document.createTextNode("Links im Artikel");
	var divPbody = document.createElement("div");
	var ul = document.createElement("ul");
	// Mit Attributen ausrüsten.
	divPortlet.setAttribute("id", "p-link");
	divPortlet.setAttribute("class", "portlet");
	divPbody.setAttribute("class", "pBody");
	ul.setAttribute("id", "u-link")
	// Spalte suchen.
	var column = document.getElementById("column-one");
	// Box einbauen.
	column.appendChild(divPortlet);
	divPortlet.appendChild(h5);
	h5.appendChild(h5Text);
	divPortlet.appendChild(divPbody);
	divPbody.appendChild(ul);
	// Aktivierunglink erstellen.
	var li = document.createElement("li");  
	li.style.whiteSpace = "nowrap";
	ul.appendChild(li);
	var a = document.createElement("a");
	a.setAttribute("href", "javascript:showRedundantLinks()");
	a.setAttribute("title", "Aktivieren!");
	li.appendChild(a);
	var aText = document.createTextNode("Aktivieren");
	a.appendChild(aText);
}

// Alle Wikilinks innerhalb des Artikels werden gesammelt.
// Anschließend werden sie in der Liste angezeigt und mehrfache Links im
// Artikeltext markiert.
function showRedundantLinks() {
	// "Aktivieren"-Link (inkl Listenelement) entfernen.
	var ul = document.getElementById("u-link");
	ul.removeChild(ul.firstChild);
	// Alle Links im Artikeltext sammeln.
	var links = document.getElementById("bodyContent").getElementsByTagName("a");
	// Regexps zur Bestimmung der relevanten Links.
	var regexpExist = /^\/wiki\/(.+)$/;
	var regexpNotExist = /^\/w\/index\.php\?title=(.+)\&action=edit$/;
	var regexpExclude = /^\/w(iki)?\/(index\.php\?title=)?(Bild|Benutzer|Benutzer_Diskussion)\:(.+)$/;
	// Nur relevante Links in neues Array speichern.
	// Dabei werden jeweils eine Referenz auf den Link im Artikel und ein Klon
	// für die Linkleiste gespeichert.
	var linkCount1 = links.length;
	var linkNodes = new Array();
	for (var i=0; i < linkCount1; ++i) {
		if (links[i].getAttribute("title") && !regexpExclude.test(links[i].getAttribute("href")) && (regexpExist.test(links[i].getAttribute("href")) || regexpNotExist.test(links[i].getAttribute("href")))) {
			linkNodes.push(new Array(links[i].cloneNode(true), links[i]));
		}
	}
	// Bei Links für Linkleiste den Linktext mit Title-Attribut überschreiben.
	var linkCount2 = linkNodes.length;
	for (var i=0; i < linkCount2; ++i) {
		var linkTitle = linkNodes[i][0].getAttribute("title");
		var linkText = document.createTextNode(linkTitle);
		linkNodes[i][0].replaceChild(linkText, linkNodes[i][0].firstChild);
		// Attribute und Funktionsaufrufe für Highlighting.
		// Leerzeichen werden durch Unterstriche ersetzt.
		var linkTitleClass = linkTitle;
		linkTitleClass = linkTitleClass.replace(/\s/g, "_");
		linkNodes[i][0].addAttributeValue("class", linkTitleClass);
		linkNodes[i][0].setAttribute("onmouseover", "highlight(\""+linkTitleClass+"\", true)");
		linkNodes[i][0].setAttribute("onmouseout", "highlight(\""+linkTitleClass+"\", false)");
		linkNodes[i][1].addAttributeValue("class", linkTitleClass);
		linkNodes[i][1].setAttribute("onmouseover", "highlight(\""+linkTitleClass+"\", true)");
		linkNodes[i][1].setAttribute("onmouseout", "highlight(\""+linkTitleClass+"\", false)");
	}
	// Hilfsarray vorbereiten und Sortierungsfunktion aufrufen.
	b = new Array(((linkNodes.length)-(linkNodes.length%2))/2);
	linkNodes.mergesort(0, linkNodes.length-1);
	// Links im Artikeltext mit Zähler ausstatten.
	for (var i=1; i < linkCount2; ++i) {
		var equal = true;
		var j = 1;
		while (equal == true) {
			if(i >= j && (linkNodes[i][0].firstChild.nodeValue == linkNodes[i-j][0].firstChild.nodeValue)) {
				j++;
			}
			else {
				equal = false;
				// Nur bei mehrfachvorkommenden Links Zähler einfügen.
				if (j != 1) {
					var span = document.createElement("span");
					linkNodes[i][1].appendChild(span);
					var spanText = document.createTextNode(" (" + j + ")");
					span.appendChild(spanText);
					span.setAttribute("class", "redundantLinkMark"); // Klasse für (n).
				}
			}
		}
	}
	// Links in Linkleiste schreiben (jeweils mit Listenelement).
	for (var i=0; i < linkCount2; ++i) {
		var li = document.createElement("li");
		ul.appendChild(li);
		li.style.whiteSpace = "nowrap";
		li.appendChild(linkNodes[i][0]);
	}
}
// onload
aOnloadFunctions[aOnloadFunctions.length] = createLinksSidebar;

/*
 * Ende showRedundantLinks
 */

monobook.css

Im obigen Script werden zur Hervorhebung der Links lediglich Klassen in die Tags eingesetzt, sichtbar werden diese erst, wenn man dazu Angaben im Stylesheet macht. Vorteil: Farbliche Anpassungen an die eigenen Vorlieben sind ohne Eingriffe im Script möglich. Nachteil: Ihr müsst euch selbst drum kümmern wenn ihr was sehen wollt. Naja, ich hab da mal was vorbereitet:

/* Angaben für showRedundantLinks */
.redundantLinkMark {
    color:green;
    font-weight:bold;
}
.highlight {
    background-color:#ffaa00;
}


Admin-Helfer: Automatischer NowCommons-Text

Noch sehr frisch, daher wenig getestet: Nach einem Klick auf den Löschen-Knopf bei einer Seite mit eingebauter NowCommons-Vorlage ist das Eingabefeld für den Löschgrund bereits mit einem Link auf den neuen Speicherort auf den Commons vorbelegt. Sehr gewissenhafte Admins, die Wert darauf legen, dass aus dem Lösch-Logbuch schon hervorgeht durch welches Bild das gelöschte ersetzt wurde, sparen sich die Zeit für ein Copy&Paste. Alle anderen müssen jetzt kein „NC“ mehr ins Feld hämmern.

Sieht im Lösch-Logbuch dann z.B. so aus:

monobook.js

/*
 * autoFill
 * Vorbelegung bei Formularfeldern per GET-Parameter.
 */

function autoFill() {
	if (window.location.search != "") {
		var pairs;
		var get =  window.location.search.substr(1).split("&");
		for (var i=0; i<get.length; ++i) {
			pairs = get[i].split("=");
			if (pairs[0] != "title" && pairs[0] != "action" && document.getElementById(pairs[0])) {
				document.getElementById(pairs[0]).value = decodeURIComponent(pairs[1]);
			}
		}
	}
}
// onload
aOnloadFunctions[aOnloadFunctions.length] = autoFill;

/*
 * Ende autoFill
 */
 
/*
 * createAutoFillLinks
 * Erstellt zusätzliche GET-Parameter, die mit autoFill auf Folgeseiten in
 * Formulare eingetragen werden.
 */

function createAutoFillLinks() {
	// NowCommons
	if (document.getElementById("Vorlage_NowCommons")) {
		var links = document.getElementById("Vorlage_NowCommons").getElementsByTagName("a");
		var url;
		var img;
		for (var i=0; i<links.length; ++i) {
			url = links[i].getAttribute("href").split(":");
			if (url[1] == "//commons.wikimedia.org/wiki/Image") {
				img = url[2];
			}
		}
		img = decodeURIComponent(img).replace(/_/g, " ");
		var deleteLink = document.getElementById("ca-delete").getElementsByTagName("a")[0];
		var newHref = deleteLink.getAttribute("href") + "&wpReason=" + encodeURIComponent("NowCommons: [[Commons:Image:" + img + "|" + img + "]]");
		deleteLink.setAttribute("href", newHref);
	}
}
// onload
aOnloadFunctions[aOnloadFunctions.length] = createAutoFillLinks;

/*
 * Ende createAutoFillLinks
 */