MediaWiki:Recherche de code en jeu.js

De Guild Wars 2 Wiki
Aller à la navigation Aller à la recherche

Note : après avoir publié vos modifications, il se peut que vous deviez forcer le rechargement complet du cache de votre navigateur pour voir les changements.

  • Firefox / Safari : maintenez la touche Maj (Shift) en cliquant sur le bouton Actualiser ou appuyez sur Ctrl + F5 ou Ctrl + R (⌘ + R sur un Mac).
  • Google Chrome : appuyez sur Ctrl + Maj + R (⌘ + Shift + R sur un Mac).
  • Internet Explorer / Edge : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl + F5.
  • Opera : appuyez sur Ctrl + F5.
// JavaScript source code
/** window.atob & window.btoa polyfill
 * WTFPLv2 – https://github.com/davidchambers/Base64.js
 */
!function(){function t(t){this.message=t}var e=this,r="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";t.prototype=new Error,t.prototype.name="InvalidCharacterError",e.btoa||(e.btoa=function(e){for(var o,n,a=0,i=r,c="";e.charAt(0|a)||(i="=",a%1);c+=i.charAt(63&o>>8-a%1*8)){if(n=e.charCodeAt(a+=.75),n>255)throw new t("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range.");o=o<<8|n}return c}),e.atob||(e.atob=function(e){if(e=e.replace(/=+$/,""),e.length%4==1)throw new t("'atob' failed: The string to be decoded is not correctly encoded.");for(var o,n,a=0,i=0,c="";n=e.charAt(i++);~n&&(o=a%4?64*o+n:n,a++%4)?c+=String.fromCharCode(255&o>>(-2*a&6)):0)n=r.indexOf(n);return c})}();

/**
 * Recherche de code en jeu
 *
 * Décode les codes en jeu de Guild Wars 2 en ID et recherche 
 * leur existence sur le wiki grâce à l'Attribut:A l'ID en jeu
 *
 * by Patrick Westerhoff [User:Poke]
 *
 * Ajout de la fonction recherche de nom dans l'API pour les objets n'existant pas
 * Traduit et ajouts par Utilisateur:IruleManik
 */
(function chatLinkSearch (window, document, $) {
    var searchBar = document.querySelector('#searchText input');
    if (!searchBar) {
        return;
    }
    var mwApi;

    function smwAskArticle (type, id, callback) {
        var apiData = { action: 'ask', query: '?Nom|?Type|limit=1|' };
        var query = "[[A l'ID en jeu::" + id + ']]';
        if (type == 'objet') {
            query += '[[Type::Objet]]';
        }
        else if (type == 'élément explorable') {
            query += '[[Type::Élément explorable]]';
        }
        else if (type == 'compétence') {
            query = query + '[[Type::Compétence]]';
        }
        else if (type == 'aptitude') {
            query += '[[Type::Aptitude]]';
        }
        else if (type == 'recette') {
            query += '[[Type::Recette]][[Type de recette::+]]';
        }

        else if (type == 'apparence de la garde-robe') {
            query += '[[Type::Apparence de la garde-robe]]';
        }
        apiData.query += query;
        mwApi.get(apiData)
        .done(function (data) {
            if (data.query.results.length === 0) {
                callback(null);
            }
            else {
                for (var title in data.query.results) {
                    var canonicalName = data.query.results[title].printouts['Nom'][0];
                    var gameContexts = data.query.results[title].printouts['Type']
                    callback(title, canonicalName, gameContexts.length ? gameContexts[0] : null);
                    return;
                }
            }
        })
        .fail(function (data) {
            callback(null);
        });
    }

    function decodeChatLink (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;
    }

    function display (code, listItem) {
        var data = decodeChatLink(code);
        var id = data[2] << 8 | data[1];
        var type;
        if (data[0] == 2) {
            type = 'objet';
            id = data[3] << 8 | data[2];
            id = (data.length > 4 ? data[4] << 16 : 0) | id;
        }
        else if (data[0] == 4) {
            type = 'élément explorable';
        }
        else if (data[0] == 6) {
            type = 'compétence';
        }
        else if (data[0] == 7) {
            type = 'aptitude';
        }
        else if (data[0] == 9) {
            type = 'recette';
        }
        else if (data[0] == 10) {
            type = 'apparence de la garde-robe';
        }
        else {
            var span = document.createElement('span');
            span.innerHTML = 'Ce code en jeu n\'est pas supporté.';
            console.log('Code en jeu non supporté. (TYPE '+data[0]+' / ID #'+id+')');
            $(span).fadeIn(1000).appendTo(listItem);
            return;
        }
        smwAskArticle(type, id, function (title, canonicalName, gameContext) {
            var span = document.createElement('span');
            if (title) {
                // If a single chatlink returns a single result, redirect to that page
                //  but don't redirect if it contains anything except a chatlink, e.g. interwiki prefix
                if ($('.mw-search-nonefound').length == 1 && searchBar.value.match(/^\[&[A-Za-z0-9+/=]+\]$/)) {
                    // Redirect only once for the current browsing session for that precise result
                    var key = 'searchredirected-' + searchBar.value;
                    try {
                        if (!sessionStorage.getItem(key)) {
                            sessionStorage.setItem(key, 'true');
                            document.location = '/index.php?title=' + encodeURIComponent(title.replace(/ /g, '_'));
                        }
                    } catch (e) {
                        // This might throw if session storage is disabled or unsupported. Just don't redirect if so.
                    }
                }
                var link = document.createElement('a');
                link.href = '/wiki/' + encodeURIComponent(title.replace(/ /g, '_'));
                link.title = title;
                link.innerHTML = canonicalName || title;
                span.appendChild(link);
                if (type == 'skill' && gameContext == 'Effect') {
                    type = 'effect';
                }
                span.appendChild(document.createTextNode(' (' + type + ' #' + id + ')'));
            }
            else {
                    
                var msg = '';

                if (type == 'objet') {
                    $.getJSON("https://api.guildwars2.com/v2/items/" + id + "?lang=fr", function (reponse) {
                        if (reponse.name) {
                            var Pageàcréer = reponse.name
                            msg += 'Aucun article avec l\'ID ' + id + ' n\'a été trouvé. <br />Si vous connaissez l\'objet <a href="/wiki/' + Pageàcréer + '" title="' + Pageàcréer  + '">' + Pageàcréer  + '</a>, vous pouvez créer la page grâce au <a href="http://karaknor.alwaysdata.net/" title=" + Générateur de pages d\'objets">Générateur de pages d\'objet</a> ou rajouter l\'ID si celle-ci est manquante à cette dernière.';
                            span.innerHTML = msg;
                        }
                    }).fail(function() {
                    msg += 'L\'ID ' + id + ' ne retourne aucun résultat ni dans l\'API de Guild Wars 2 ni sur le wiki.';
                    span.innerHTML = msg;
                })
                } else if (type == 'recette') {
                    msg += 'Aucun article avec l\'ID ' + id + ' n\'a été trouvé. Si vous connaissez cette recette, vous pouvez l\'ajouter sur la page de l\'objet correspondant ou ajouter l\'ID.';
                    span.innerHTML = msg;
                } else {
                    msg += 'Aucun article avec l\'ID ' + id + ' n\'a été trouvé. Si vous connaissez cet élément, vous pouvez créer l\'article ou rajouter l\'ID à la page en question si cette dernière n\'en a pas.';
                    span.innerHTML = msg;
                }
                $(span).fadeIn(1000).appendTo(listItem);
            }
        });
    }

    window.mw.loader.using('mediawiki.api', function() {
        mwApi = new window.mw.Api();

        // find chat links
        var ul = document.createElement('ul');
        var expr = /\[&([A-Za-z0-9+/]+=*)\]/g;
        var match;
        while ((match = expr.exec(searchBar.value))) {
            var li = document.createElement('li');
            li.innerHTML = '<tt>' + match[0] + '</tt>';
            ul.appendChild(li);
            display(match[1], li);
        }

        // display results
        if (ul.children.length) {
            var div = document.createElement('div');
            div.className = 'gw2w-chat-link-search';
            div.innerHTML = 'Le <a href="/wiki/Code_en_jeu" title="Code en jeu">code en jeu</a> suivant a été ajouté à la requête :';
            div.appendChild(ul);

            var topTable = document.getElementById('mw-search-top-table');
            $(div).hide().insertAfter(topTable).show('fast');
        }
    });
})(window, document, $);