MediaWiki:Skin/Adventure/Stateful.js: Unterschied zwischen den Versionen

aus Kamelopedia, der wüsten Enzyklopädie
Zur Navigation springen Zur Suche springen
K
 
(6 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
 
/**
 
/**
 
  * Stellt Statusfeatures für das Adventure bereit (noch experimentell).
 
  * 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:
 
  * Bekannte Bugs:
 
  * - Tod führt nicht zu einem Reset der Stati
 
  * - Tod führt nicht zu einem Reset der Stati
* - man sollte die Stati irgendwie wieder loswerden können
 
 
  */
 
  */
  
Zeile 12: Zeile 36:
 
     this.update = function(args) {
 
     this.update = function(args) {
 
         for (var i in args)
 
         for (var i in args)
             this.args[i] = args[i];
+
             if (args[i] == "")
 +
                delete this.args[i];
 +
            else
 +
                this.args[i] = args[i];
 
     }
 
     }
  
Zeile 46: Zeile 73:
 
     for (var i in pairs) {
 
     for (var i in pairs) {
 
         var kvs = pairs[i].split("=");
 
         var kvs = pairs[i].split("=");
         if (!advOnly || kvs[0].substr(0,1) == "_")
+
         if (kvs.length > 1 && (!advOnly || kvs[0].substr(0,1) == "_"))
 
             this.args[kvs[0]] = kvs[1];
 
             this.args[kvs[0]] = kvs[1];
 
     }
 
     }
Zeile 56: Zeile 83:
  
 
addOnloadHook(function () {
 
addOnloadHook(function () {
     $("#bodyContent a").each(function (a,b) {
+
     $('#bodyContent a[href*="Adventure/"]').not(".new").each(function (a,b) {
 
         keepState(b);
 
         keepState(b);
 
     });
 
     });
 
});
 
});

Aktuelle Version vom 16. September 2012, 19:21 Uhr

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