
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. Ihr findet eure monobook-Dateien unter [[Benutzername/monobook.js]] für JavaScript und [[Benutzername/monobook.css]] für CSS-Angaben. 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 verschieben
Die Art wie die [Bearbeiten]-Links für einzelne Abschnitte in Artikeln dargestellt werden ist sehr unpraktisch:
Es kommt vor allem bei Artikeln mit vielen Bildern am rechten Rand oft zu Fehldarstellungen, bei denen die Links nach unten verrutschen und in den falschen Abschnitten erscheinen. Dass diese Links für den jeweils nächsten Abschnitt eigentlich am Ende des vorherigen stehen ist unlogisch und immer wieder gibt es Anfragen unerfahrener Benutzer, die sich nicht erklären können warum sie immer im falschen Abschnitt landen. Außerdem ist es bei breitem Browserfenster und Artikeln mit vielen auf einander folgenden Überschriften unpraktisch, dass die Links so weit am rechten Rand stehen.
Dieses Script verschiebt diese sogenannten „Editsection“-Buttons direkt neben die jeweiligen Überschrift. Kein Verrutschen mehr, logischere Dokumentenstruktur, keine Suche bei breitem Browserfenster.
monobook.js
/* * moveEditsection * Dieses Script verschiebt die Editsection-Buttons von rechts oberhalb * der Überschriften in die Überschriften. * 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[1-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 addOnloadHook(moveEditsection); /* * Ende moveEditsection */
Links in Artikel
Dieses Script dient dazu die Suche nach mehrfach vorkommenden Links in Artikeln zu vereinfachen.
Es baut links in der Werkzeugleiste einen neuen Abschnitt ein, in den eine alphabetisch sortierte Liste aller Wikilinks im Artikel eingeblendet werden kann. Direkt im Artikel werden dann alle mehrfach vorkommenden Links gekennzeichnet: Die Zahl in Klammern hinter dem Link gibt an um den wievielten Link auf das gleiche Ziehl es sich handelt. Redirects werden jedoch nicht aufgelöst. Beim Überfahren einen Links in der Liste oder im Artikel werden alle anderen mit dem gleichen Ziel hervorgehoben.
Achtung: Auf Seiten mit sehr vielen Links (z.B. Wartungslisten) kann es durchaus ein paar Sekunden dauern, bis der Browser nach Anklicken des Aktivieren-Links wieder reagiert. Bisher nur mit Gecko erfolgreich getestet.
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. * 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 addOnloadHook(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.
Verwendet werden die Klassen redundantLinkMark
für die „Linkzähler“ und highlight
für die Hervorhebung beim Überfahen von Links mit der Maus.
Hier ein Beispiel wie die Angaben aussehen könnten:
/* 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 wird 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:
- 05:20, 10. Feb 2006 Dbenzhuser Bild:Wappen seelow.gif wurde gelöscht (NowCommons: Wappen Seelow.png)
monobook.js
/* * autoFill * Vorbelegung bei Formularfeldern per GET-Parameter. * dbenzhuser (de:Benutzer:Dbenzhuser) */ //Eintragen der übergebenen Daten in Formularfelder. 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 addOnloadHook(autoFill); // Erstellt zusätzliche GET-Parameter, die mit autoFill auf Folgeseiten in // Formulare eingetragen werden. function createAutoFillLinks() { // NowCommons // Benötigt eingebaute NowCommons-Vorlage und Löschknopf if (document.getElementById("Vorlage_NowCommons") && document.getElementById("ca-delete")) { // Sammeln aller Links innerhalb der Vorlage var links = document.getElementById("Vorlage_NowCommons").getElementsByTagName("a"); var url; var img; for (var i=0; i<links.length; ++i) { // korrigieren von Links, die ein Image: zuviel enthalten if (links[i].getAttribute("href").search(/Image\:Image\:/) != -1) { links[i].setAttribute("href", links[i].getAttribute("href").replace(/Image\:Image\:/, "Image:")); var span = document.createElement("span"); var spanText = document.createTextNode(" (korr.)"); links[i].appendChild(span); span.appendChild(spanText); span.style.color = "red"; } 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 addOnloadHook(createAutoFillLinks); /* * Ende autoFill */