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
  */
Abgerufen von „https://de.wikipedia.org/w/index.php?title=Benutzer:Dbenzhuser/showRedundantLinks.js&oldid=204921137"