Benutzer:J*/Labor/wikifindbroken.js: Unterschied zwischen den Versionen

aus Kamelopedia, der wüsten Enzyklopädie
Zur Navigation springen Zur Suche springen
(Die Seite wurde neu angelegt.)
 
(tut nicht)
 
(3 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
(kein Unterschied)

Aktuelle Version vom 11. November 2010, 10:38 Uhr

/*
 * 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;
}