MediaWiki:Skin/Adventure/Stateful.js

/** * Stellt Statusfeatures für das Adventure bereit (noch experimentell). * * URL-Parameter, die mit "_adv_" anfangen, werden per Javascript quer durchs Adventure mitgeschleift, * solange bis sie auf leer gesetzt werden. * Wie alle URL-Parameter können sie mit #arg ausgelesenen und verarbeitet werden. * * Okay, jetzt nochmal, was soll das alles? * * - Klassisches Weiterschreiben: Link auf einer Seite ergänzen oder ähnliche Seite erstellen *  - ermöglicht neue Handlungen direkt vor Ort *  - Handlungen beeinflussen Situation nur direkt vor Ort * * - Weiterschreiben mit Statusfeatures: Statusparameter an Links anfügen *  - ermöglicht neue Handlungen an anderen Orten *  - Handlungen beeinflussen Situation beliebigen Orten * * Statusparameter-Links sehen so aus: * * (ersetze: x -> Zielseitennummer, k -> Key, v -> Value; zum Leersetzen v einfach weglassen) * * Abfrage: * * (ersetze: k -> Key) * * Todo: * - Übersichtsseite über verwendete Statusfeatures / Keys (für Autoren, zur Kollisionsvermeidung) * * Bekannte Bugs: * - Tod führt nicht zu einem Reset der Stati */

function UrlArgs(url, advOnly){ this.args = {};

this.update = function(args) { for (var i in args) if (args[i] == "") delete this.args[i]; else this.args[i] = args[i]; }

this.serialize = function{ var s = ""; for (var i in this.args) s += "&" + i + "=" + this.args[i]; return s.substr(1); }

this.keep = function { var other = new UrlArgs(location.href, true); other.update(this.args); var s = other.serialize; return this.base + (s ? "?"+s : "") + this.anchor; }

this.base = /^[^?#]+/.exec(url)[0]; var anchor = /#(.+)/.exec(url);

if (anchor == null) this.anchor = ""; else this.anchor = anchor[0];

var script = /\?([^#]+)/.exec(url); if (script == null) return;

var pairs = script[1].split("&"); for (var i in pairs) { var kvs = pairs[i].split("="); if (kvs.length > 1 && (!advOnly || kvs[0].substr(0,1) == "_")) this.args[kvs[0]] = kvs[1]; } }

function keepState(link) { link.href = new UrlArgs(link.href).keep; }

addOnloadHook(function {    $('#bodyContent a[href*="Adventure/"]').not(".new").each(function (a,b) { keepState(b); }); });