Utilisateur:Od1n/WhatlinkshereDeluxe.js

Note : après avoir enregistré la page, vous devrez forcer le rechargement complet du cache de votre navigateur pour voir les changements.

Mozilla / Firefox / Konqueror / Safari : maintenez la touche Majuscule (Shift) en cliquant sur le bouton Actualiser (Reload) ou pressez Maj-Ctrl-R (Cmd-R sur Apple Mac) ;

Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5.
/*
 * WhatlinkshereDeluxe
 *
 * Permet de comptabiliser le nombre de pages liées
 * Documentation : [[Projet:JavaScript/Notices/WhatlinkshereDeluxe]]
 *
 * {{Catégorisation JS|WhatlinkshereDeluxe}}
 */

if (mw.config.get('wgCanonicalSpecialPageName') === 'Whatlinkshere') {

    mw.loader.using(['mediawiki.util', 'mediawiki.Title'], function () {
        $(function ($) {
            'use strict';

            function isParamEnabled(name) {
                var value = mw.util.getParamValue(name);
                return !!value && value !== '0';
            }

            $('p:contains("Les pages ci-dessous")').eq(0).each(function () {
                this.innerHTML = this.innerHTML.replace('Les pages ci-dessous', '<span id="WhatlinkshereRecap">0</span> pages');
            });

            var Recap = document.getElementById('WhatlinkshereRecap');
            if (!Recap) { return; }

            var TitrePage = mw.config.get('wgRelevantPageName');
            var Namespaces = mw.util.getParamValue('namespace') || '';

            if (isParamEnabled('invert') && Namespaces) {
                // ["0", "1", "2", "3" ...]
                var allNamespaces = Object.keys(mw.config.get('wgFormattedNamespaces')).filter(function (val) {
                    return val >= 0;
                });
                var splitNamespaces = Namespaces.split('|');
                Namespaces = allNamespaces.filter(function (val) {
                    return !splitNamespaces.includes(val);
                }).join('|');
            }

            var Transclusions = !isParamEnabled('hidetrans');
            var Links = !isParamEnabled('hidelinks');
            var Redirs = !isParamEnabled('hideredirs');
            var Images = new mw.Title(TitrePage).getNamespaceId() === 6
                && !isParamEnabled('hideimages');

            function updateFunction(count) {
                if (count <= 100000) {
                    Recap.innerHTML = count;
                } else {
                    Recap.innerHTML = '100000+';
                    return false;
                }
            }

            function whenAllDone() {
                Recap.style.fontWeight = 'bold';
            }

            var userGroups = mw.config.get('wgUserGroups');
            var apiLimit = userGroups.includes('sysop') || userGroups.includes('bot') ? 5000 : 500;

            function requete(origParams, progressFunction, doneFunction, continueParams) {
                var params = continueParams
                    ? Object.assign({}, origParams, continueParams)
                    : Object.assign({
                        'action' : 'query',
                        'format' : 'json',
                    }, origParams);

                $.getJSON(mw.util.wikiScript('api'), params, function (data) {
                    var shouldContinue = progressFunction(data);
                    if (!data.continue || shouldContinue === false) {
                        doneFunction();
                    } else {
                        requete(params, progressFunction, doneFunction, data.continue);
                    }
                });
            }

            var pageCount = 0;

            var linksDone = false;
            var transclusionsDone = false;
            var imagesDone = false;

            if (!Links && !Redirs) {
                linksDone = true;
                tryAllDone();
            } else {
                requete({
                    'list'          : 'backlinks',
                    'bllimit'       : apiLimit,
                    'blfilterredir' : (!Redirs ? 'nonredirects' : !Links ? 'redirects' : 'all'),
                    'blnamespace'   : Namespaces,
                    'bltitle'       : TitrePage,
                }, function (data) {
                    pageCount += data.query.backlinks.length;
                    return updateFunction(pageCount);
                }, function () {
                    linksDone = true;
                    tryAllDone();
                });
            }

            if (!Transclusions) {
                transclusionsDone = true;
                tryAllDone();
            } else {
                requete({
                    'list'          : 'embeddedin',
                    'eilimit'       : apiLimit,
                    'einamespace'   : Namespaces,
                    'eititle'       : TitrePage,
                }, function (data) {
                    pageCount += data.query.embeddedin.length;
                    return updateFunction(pageCount);
                }, function () {
                    transclusionsDone = true;
                    tryAllDone();
                });
            }

            if (!Images) {
                imagesDone = true;
                tryAllDone();
            } else {
                requete({
                    'list'          : 'imageusage',
                    'iulimit'       : apiLimit,
                    'iunamespace'   : Namespaces,
                    'iutitle'       : TitrePage,
                }, function (data) {
                    pageCount += data.query.imageusage.length;
                    return updateFunction(pageCount);
                }, function () {
                    imagesDone = true;
                    tryAllDone();
                });
            }

            function tryAllDone() {
                if (linksDone && transclusionsDone && imagesDone) {
                    whenAllDone();
                }
            }

        });
    });
}