Benutzer:J*/Labor/wikifindbroken.js

aus Kamelopedia, der wüsten Enzyklopädie
Zur Navigation springen Zur Suche springen

Hinweis: Leere nach dem Speichern 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
  • Internet Explorer: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
  • Opera: Gehe zu Menü → Einstellungen (Opera → Einstellungen auf dem Mac) und dann auf Datenschutz & Sicherheit → Browserdaten löschen → Gespeicherte Bilder und Dateien.
/*
 * kleines Helferscript gegen "zerschossene" Seiten:
 * Das Script findet nicht geschlossene oder in der falschen Reihenfolge geschlossene
 * <tags> oder {{}} {| |} inclusive nowiki und kommentare.
 *
 * TODO: Läuft bisher gut im Firebug, mal bei Gelegenheit mit UI versehen...
 *
 * tagparse liefert eine Liste zurück:
 * [ [t1, n1, l1], [t2, n2, l2], ... ]
 * dabei steht:
 *     t für den Tagnamen ('div', '!--', '{|' ...)
 *     n für die Anzahl der ungeschlossen (negativ: ungeöffneten) Tags
 *     l für eine Liste der Zeilen, in denen die Tags geöffnet (geschlossen) wurden.
 * 
 * Fehler zwischen nowiki- oder Kommentar-Tags (nowiki,!--) können in der Regel ignoriert werden,
 * wenn die Summe der n der umschließenden nowiki- bzw. Kommentar-Tags in der Summe 0 ergeben.
 *
 * Beispiele:
 *
 * tagparse("<div>{{bla}}</div>")
 * -> []
 * # keine Fehler
 *
 * tagparse("<span><div></span>")
 * -> [["span", 1, [1]], ["div", 1, [1]], ["span", -1, [1]]]
 * # Fehler: ungeschlossener div
 * 
 * tagparse($("wpTextbox1").value)
 * -> analysiert die aktuelle Textbox
 *
 */

function Taglist()
{
	this.open = function (t,l) {
                console.log("opening  "+t+" ["+l+"]")
		if (this.length > 0 && this[this.length-1][0] == t)
                {
			this[this.length-1][1] ++;
                        if (this[this.length-1][1] > 0)
                                this[this.length-1][2].push(line)
                        else
                                this[this.length-1][2].pop()
                }
		else
			this.push([t,1,[l]]);
		this.clean();
	}
	this.close = function (t,l) {
                console.log("closing /"+t+" ["+l+"]")
		if (this.length > 0 && this[this.length-1][0] == t)
                {
			this[this.length-1][1] --;
                        if (this[this.length-1][1] < 0)
                                this[this.length-1][2].push(line)
                        else
                                this[this.length-1][2].pop()
                }
		else
			this.push([t,-1,[l]]);
		this.clean();
	}
	this.clean = function () {
		while (this.length > 0 && this[this.length-1][1] == 0)
			this.pop();
	}
}
Taglist.prototype = new Array();

function tagparse(s)
{
	matchall = /(\{\{|\}\}|\{\||\|\}|<\/?[A-Za-z0-9]+\s*[^>]*>|<!--|-->|\n)/g;
	m = s.match(matchall);
	taglist = new Taglist()
	line = 1
	for (var i=0; i<m.length; i++)
	{
		x = m[i].replace(/((\s+?[^>]*)?(\/\s*)?>$|^<)/g,"");
		if (x == "br")
			continue;
		else if (x == "\n")
			line ++;
		else if (x == "--")
			taglist.close("!--",line);
		else if (x == "}}")
			taglist.close("{{"),line;
		else if (x == "|}")
			taglist.close("{|",line);
		else if (x[0] == "/")
			taglist.close(x.slice(1),line);
		else
			taglist.open(x,line);
	}    
	return taglist;
}