Benutzer:Dbenzhuser/showRedundantLinks.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
/* * 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 markiert. * 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. varlinkNodes=newArray(); // Mergesort für Arrays // Wegen kleiner Modifikationen (siehe Kommentare) nur zur Verwendung bei der // Erstellung der Linkleiste. varb; linkNodes.mergesort=function(lo,hi){ if(lo<hi){ varmid=((hi+lo)-(hi+lo)%2)/2; this.mergesort(lo,mid); this.mergesort(mid+1,hi); vari=0; varj=lo; while(j<=mid){ b[i++]=this[j++]; } vari=0; vark=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){ varnewvalue=this.getAttribute(key); varreg=newRegExp("(^|\\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. functionhighlight(cname,on){ varobjects=document.getElementsByTagName("a"); cname=cname.replace("(","\\("); cname=cname.replace(")","\\)"); varreg=newRegExp("(^|\\s)"+cname+"(\\s|$)"); varlength=objects.length for(vari=0;i<length;i++){ if(objects[i].className.search(reg)!=-1){ if(on){ // objects[i].addAttributeValue("class", "highlight"); objects[i].style.backgroundColor="#ffaa00"; } else{ // objects[i].removeAttributeValue("class", "highlight"); objects[i].style.backgroundColor="transparent"; } } } } // Nach dem Vorbild der bereits vorhandenen Listen wird eine neue Box in der // Navigationsleiste installiert, die einen Link zum Aktivieren des // Linksammlers enthält. functioncreateLinksSidebar(){ // Elemente der Box erstellen. vardivPortlet=document.createElement("div"); varh5=document.createElement("h5"); varh5Text=document.createTextNode("Links im Artikel"); vardivPbody=document.createElement("div"); varul=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. varcolumn=document.getElementById("column-one"); // not running Monobook - exit. if(!column)return; // Box einbauen. column.appendChild(divPortlet); divPortlet.appendChild(h5); h5.appendChild(h5Text); divPortlet.appendChild(divPbody); divPbody.appendChild(ul); // Aktivierunglink erstellen. varli=document.createElement("li"); li.style.whiteSpace="nowrap"; ul.appendChild(li); vara=document.createElement("a"); a.setAttribute("href","javascript:showRedundantLinks()"); a.setAttribute("title","Aktivieren!"); li.appendChild(a); varaText=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. functionshowRedundantLinks(){ // "Aktivieren"-Link (inkl Listenelement) entfernen. varul=document.getElementById("u-link"); ul.removeChild(ul.firstChild); // Alle Links im Artikeltext sammeln. varlinks=document.getElementById("bodyContent").getElementsByTagName("a"); // Regexps zur Bestimmung der relevanten Links. varregexpExist=/^\/wiki\/(.+)$/; varregexpNotExist=/^\/w\/index\.php\?title=(.+)\&action=edit$/; varregexpExclude=/^\/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. varlinkCount1=links.length; for(vari=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(newArray(links[i].cloneNode(true),links[i])); } } // Bei Links für Linkleiste den Linktext mit Title-Attribut überschreiben. varlinkCount2=linkNodes.length; for(vari=0;i<linkCount2;++i){ varlinkTitle=linkNodes[i][0].getAttribute("title"); varlinkText=document.createTextNode(linkTitle); linkNodes[i][0].replaceChild(linkText,linkNodes[i][0].firstChild); // Attribute und Funktionsaufrufe für Highlighting. // Leerzeichen werden durch Unterstriche ersetzt. varlinkTitleClass=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=newArray(((linkNodes.length)-(linkNodes.length%2))/2); linkNodes.mergesort(0,linkNodes.length-1); // Links im Artikeltext mit Zähler ausstatten. for(vari=1;i<linkCount2;++i){ varequal=true; varj=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){ varspan=document.createElement("span"); linkNodes[i][1].appendChild(span); varspanText=document.createTextNode(" ("+j+")"); span.appendChild(spanText); // span.setAttribute("class", "redundantLinkMark"); // Klasse für (n). span.style.color="green"; span.style.fontWeight="bold"; } } } } // Links in Linkleiste schreiben (jeweils mit Listenelement). for(vari=0;i<linkCount2;++i){ varli=document.createElement("li"); ul.appendChild(li); li.style.whiteSpace="nowrap"; li.appendChild(linkNodes[i][0]); } } // onload addOnloadHook(createLinksSidebar); /* * Ende showRedundantLinks */