Benutzer:Limasign/monobook.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
//   1

// [[Benutzer:Dschwen/wikiminiatlas2.js]] - diese Zeile bitte mitkopieren
document.write('<script type="text/javascript" src="' 
     + 'http://de.wikipedia.org/w/index.php?title=User:Dschwen/wikiminiatlas2.js' 
     + '&action=raw&ctype=text/javascript&dontcountme=s"></script>');

//// [[:en:User:Lupin/popups.js]]

mw.loader.load(
             'https://en.wikipedia.org/w/index.php?title=User:Lupin/popups.js'
             + '&action=raw&ctype=text/javascript&dontcountme=s');
/ [[User:Lupin/popups.js]]



/* monobook.js */
function searchToTop() {
    function $(id) { return document.getElementById(id); }
    var search = $('p-search');
    search.parentNode.removeChild(search);
    $('column-one').insertBefore(search, $('p-navigation'));
}
     if (window.addEventListener) window.addEventListener("load", searchToTop, false);
else if (window.attachEvent)      window.attachEvent(   "onload", searchToTop);





/*
 * 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[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
$(moveEditsection);

/*
 * Ende moveEditsection
 */




/*
 * 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
$(createLinksSidebar);

/*
 * Ende showRedundantLinks
 */






//======================================================================
//## foldHeaders.js 

/** provides an icon for each heading to fold or unfold it */
function foldHeaders() {
    //------------------------------------------------------------------------------
    //## folder

    /** attaches folders to all header tags of a given depth */
    function attachRecursive(element, depth) {
        var tagName = "H" + depth;  
        var headers = element.getElementsByTagName(tagName);
        for (var i=0; i<headers.length; i++) {
            var header  = headers[i];
            // skip some headers we do not want to modify
            if (header.id            == "siteSub")  continue;
            if (header.parentNode.id == "toctitle") continue;
            var end     = i < headers.length-1 
                        ? findEnd(headers[i+1]) 
                        : element.lastChild;
            if (!end)   continue;
            var folder  = attachSingle(header, end);
            if (depth < 6)  attachRecursive(folder, depth+1);
        }
    }
    
    /** finds a (inclusive) endpoint for folder content */
    function findEnd(next) {
        var maybe   = next;
        
        for (;;) {
            maybe   = maybe.previousSibling;
            if (!maybe)                     return null;
            if (maybe.nodeName != "#text")  break;
        }
        if (maybe.nodeName != "P") {
            return next.previousSibling;
        }
        
        for (;;) {
            maybe   = maybe.previousSibling;
            if (!maybe)                     return null;
            if (maybe.nodeName != "#text")  break;
        }
        if (maybe.nodeName != "DIV" || maybe.className != "editsection") {
            return next.previousSibling;
        }
        
        return maybe.previousSibling;
    }
    
    /** attaches a folder span to a header, end is inclusive. returns the folder span. */
    function attachSingle(header, end) {
        // add a button to the header toggling the display of the content span
        var button  = document.createElement("span");
        button.className    = "foldButton";
        header.insertBefore(button, header.firstChild);
        
        // move content between start and end into a span after the header  
        var range   = document.createRange();
        range.setStartAfter(header);
        range.setEndAfter(end);
        var contents    = range.extractContents();
        var folder      = document.createElement("span");
        folder.appendChild(contents);
        header.parentNode.insertBefore(folder, header.nextSibling);
        
        // add state and methods to the folder
        folder.button   = button;
        folder.header   = header;
        folder.open     = false;
        folder.update   = folderUpdate;
        
        // make the button react on clicks
        button.folder   = folder;
        button.onclick  = buttonOnClick;
        
        folder.update();
        return folder;
    }

    /** update a complete folder according ot its state */
    function folderUpdate() {
        if (this.open) {
            this.button.innerHTML           = "&#x25BC;";
            this.header.style.marginBottom  = null;
            this.style.display              = null;
        }
        else {
            this.button.innerHTML           = "&#x25BA;";
            this.header.style.marginBottom  = "0";
            this.style.display              = "none";
        }
    }
    
    /** onclick-handler for the button */
    function buttonOnClick() {
        this.folder.open    = !this.folder.open;
        this.folder.update();
    }
    
    //------------------------------------------------------------------------------
    //## installation
    
    var bodyContent = $('bodyContent');
    
    // prevent double installation
    if (bodyContent.foldersInstalled)   return;
    bodyContent.foldersInstalled    = true;

    // install a folder on every header
    attachRecursive(bodyContent, 2);
    
    // hide toc
    var toc = $('toc');
    if (toc)    toc.style.display   = "none";
}