MediaWiki:Skin/Adventure/Stateful.js

aus Kamelopedia, der wüsten Enzyklopädie
Version vom 16. September 2012, 19:21 Uhr von J* (Diskussion | Beiträge)
(Unterschied) ← Nächstältere Version | Aktuelle Version (Unterschied) | Nächstjüngere Version → (Unterschied)
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.
/**
 * 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:
 * [http://kamelopedia.mormo.org/index.php/Projekt:Adventure/x?_adv_k=v]
 * (ersetze: x -> Zielseitennummer, k -> Key, v -> Value; zum Leersetzen v einfach weglassen)
 * 
 * Abfrage:
 * {{#arg:_adv_k}}
 * (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);
    });
});