MediaWiki:Chatcode-Suche.js

Aus Guild Wars 2 Wiki
Zur Navigation springen Zur Suche springen

Hinweis: Leere nach dem Veröffentlichen 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/Edge: Strg+F5 drücken oder Strg drücken und gleichzeitig Aktualisieren anklicken
  • Opera: Strg+F5
/*
 * Ergänzt die Suchfunktion um Suchergebnisse für [[Chatcode]]s, solange die entsprechenden IDs eingetragen sind.
 */

$(document).ready(function() {
    if(mw.config.get('wgPageName') != 'Spezial:Suche') return;
    var searchTerm = $('#searchText input').val(); 
    
    function decodeChatcode (code) {
        var binary = window.atob(code);
        var octets = new Array(binary.length);
        for (var i = 0; i < binary.length; i++) {
            octets[i] = binary.charCodeAt(i);
        }
        return octets;
    }
    
    var elements = [];
    var results = [];
    var match;
    var regx = /\[&([A-Za-z0-9+/]+=*)]/g;
    
    // find chatcodes
    while((match = regx.exec(searchTerm)) !== null) {

        var data = decodeChatcode(match[1]);
        
        // parse their type and id
        var id = data[2] << 8 | data[1];
        var type = data[0];
        if (type == 2) {
            id = data[3] << 8 | data[2];
            id = (data.length > 4 ? data[4] << 16 : 0) | id;
        }
        
        if(type && id) {
            elements.push({type: type, id: id, code: match[0]});        
        }
    }
    
    if(elements.length > 0) {
        var list = $('<ul></ul>');
        
        $.each(elements, function(index, value) {
            var li = $('<li><span style="font-family:monospace">' + value.code + ' </span></li>');
            list.append(li);
            querySMW(value.type, value.id, li);
        });
        
        var wrapper = $('<div class="chatcode-results" style="border: 1px solid silver; background: #f3f3f3; padding: 0.5em; margin-top: 1em;">Chatcodes in dieser Suche:</div>');
        $(wrapper).append(list)
        $(wrapper).insertAfter( $('#mw-search-top-table') );
        $('<div class="mw-search-visualclear"></div>').insertAfter( $('#mw-search-top-table') );
    }
    
    function querySMW(type, id, element) {
        var query = "";
        var type_name = '';
        var unknown = false;

        switch(type) {
            case 2:
                // item
                query = "[[Hat Gegenstand-ID::" + id + "]]";
                type_name = 'Gegenstand';
                break;

            case 4:
                query = "[[Hat Schauplatz-ID::" + id + "]]";
                type_name = 'Schauplatz';
                // poi
                break;

            case 6:
                // skill
                query = "[[Hat Fertigkeit-ID::" + id + "]]";
                type_name = 'Fertigkeit';
                break;

            case 7:
                // trait
                query = "[[Hat Eigenschaft-ID::" + id + "]]";
                type_name = 'Eigenschaft';
                break;

            case 9:
                // recipe
                query = "[[Hat Rezept-ID::" + id + "]]";
                type_name = 'Rezept';
                break;

            case 10:
                // skin
                query = "[[Hat Skin-ID::" + id + "]]";
                type_name = 'Skin';
                break;

            case 11:
                // outfit
                query = "[[Hat Kleidungsset-ID::" + id + "]]";
                type_name = 'Kleidungsset';
                break;

            default:
                // unknown;
                unknown = true;
        }

        if(!unknown) {
            // run a query
            query += "|?Hat Anzeigename|limit=1";

            window.mw.loader.using('mediawiki.api', function() {
                var api = new window.mw.Api();
                params = {action: 'ask', query: query, format: 'json'};
                api.get(params).done(function(data) {
                    if(!jQuery.isEmptyObject(data.query.results)) {
                        for(resultElement in data.query.results) {
                            var code = data.query.results[resultElement].fullurl;
                            var displayName = data.query.results[resultElement].printouts['Hat Anzeigename'][0];
                            var code = $('<span><a href="'+code+'">'+displayName+'</a> (#'+id+')</span>');

                            $(element).append(code);

                        }
                    } else {
                        $(element).append('<span>Die Seite zu diesem Chatcode ('+ type_name + ' #' + id + ') wurde nicht gefunden. Falls du sie kennst, lege sie an oder trage die ID ein.</span>');
                    }
                });
            });
        } else {
            // unbekannt   
            $(element).append('Das Format ['+type+'] dieses Chatcodes wird derzeit nicht unterstützt.');
        }        
    }
});