Benutzer:Dbenzhuser/monobook.js
aus Wikipedia, der freien Enzyklopädie
Hinweis: Leere nach dem Speichern den Browser-Cache, um die Änderungen zu sehen: Mozilla/Firefox: Shift-Strg-R, Internet Explorer: Strg-F5, Opera: F5, Safari: ⌘-R, Konqueror: Strg-R.
/* * 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. var linkNodes = new Array(); // Mergesort für Arrays // Wegen kleiner Modifikationen (siehe Kommentare) nur zur Verwendung bei der // Erstellung der Linkleiste. var b; linkNodes.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; 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 */ /* * addContributeLinks * Ergänzt ein paar Links im Mitmachen-Linkbereich. */ function addContributeLinks() { var contribiuteUl = document.getElementById("p-Mitmachen").getElementsByTagName("ul"); var linksPrefix = "http://de.wikipedia.org/wiki/"; var links = new Array(); // Kategorie: Schnelllöschen links[0] = new Array(2); links[0][0] = "Kategorie:Wikipedia:Schnelllöschen"; links[0][1] = "Kat: Schnelllöschen"; // Kategorie: NowCommons links[1] = new Array(2); links[1][0] = "Kategorie:NowCommons"; links[1][1] = "Kat: NowCommons"; linksLength = links.length; for (var i=0; i < linksLength; ++i) { var li = document.createElement("li"); li.style.whiteSpace = "nowrap"; contribiuteUl[0].appendChild(li); var a = document.createElement("a"); a.setAttribute("href", linksPrefix+links[i][0]); a.setAttribute("title", links[i][1]); li.appendChild(a); var aText = document.createTextNode(links[i][1]); a.appendChild(aText); } } // onload addOnloadHook(addContributeLinks); /* * Ende addContributeLinks */ /* * NowCommonsAutoFill * Erstellt einen GET-Parameter, der ins Löschformular eingetragen wird. * Links mit vorangestelltem "Image:" werden korrigiert. */ function NowCommonsAutoFill() { // 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) { // Korrigiert den Link für den Fall, dass dem Bildnamen ein "Image:" vorangestellt wurde 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(NowCommonsAutoFill); /* Ende createAutoFillLinks */ /* * include * Einbinden von externen Scripts */ function include(script) { var js = document.createElement('script'); js.setAttribute('type', 'text/javascript'); js.setAttribute('src', script); document.getElementsByTagName('head')[0].appendChild(js); } // Rechtschreibprüfung von Apper. Siehe de:Benutzer:APPER/RP include("http://de.wikipedia.org/w/index.php?title=Benutzer:APPER/RP/js&action=raw&ctype=text/javascript"); // [[Benutzer:Dschwen/wikiminiatlas2.js]] - diese Zeile bitte mitkopieren include("http://de.wikipedia.org/w/index.php?title=User:Dschwen/wikiminiatlas2.js&action=raw&ctype=text/javascript&dontcountme=s"); /* Ende include */