Utilisateur:Od1n/DeluxeHistory.js

Une page de Wikipédia, l'encyclopédie libre.
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.
// <!--{{Catégorisation JS}}-->

// pour inspiration : https://github.com/pamelafox/lscache

/*global mw, $, importStylesheet */

mw.loader.using(['mediawiki.legacy.wikibits', 'user', 'mediawiki.api', 'mediawiki.storage'], function () {
    'use strict';

    importStylesheet('Utilisateur:Od1n/DeluxeHistory.css');

    var botMembers, sysopMembers;

    /////////////////////////////////////// LOCALSTORAGE ///////////////////////////////////////

    function storageGet(key) {
        return mw.storage.get('HistoryDeluxe_' + key);
    }

    function storageSet(key, value) {
        mw.storage.set('HistoryDeluxe_' + key, value, 86400); // 86400 secondes = 24 heures
    }

    /////////////////////////////////////// FONCTIONS DE TRAITEMENT DES LIENS ///////////////////////////////////////

    var nsSpecial = mw.config.get('wgFormattedNamespaces')[-1] + ':';
    var watcherName = mw.config.get('wgUserName');

    function isUserIP(userlink) {
        // Les liens des IP sont de la forme « Spécial:Contributions/<IP> »
        return userlink.title.indexOf(nsSpecial) === 0;
    }

    function getUserClass(userlink) {
        var UserName = userlink.textContent;
        if (UserName === watcherName) { return 'UserIs-Self'; }
        if (botMembers.includes(UserName)) { return 'UserIs-Bot'; }
        if (sysopMembers.includes(UserName)) { return 'UserIs-Sysop'; }
        if (isUserIP(userlink)) { return 'UserIs-IP'; }
        return 'UserIs-User';
    }

    function userGroupClassName($lis) {
        $lis.each(function () {
            var userlink = this.getElementsByClassName('mw-userlink');
            if (userlink.length) {
                this.classList.add(getUserClass(userlink[0]));
            }
        });
    }

    /////////////////////////////////////// FONCTIONS DE PARCOURS DES ÉLÉMENTS ///////////////////////////////////////

    function scan_first_ul() {
        userGroupClassName($('#mw-content-text').find('ul').eq(0).find('li'));
    }

    function scan_ul_special_li() {
        userGroupClassName($('ul.special li'));
    }

    function scan_td() {
        userGroupClassName($('td'));
    }

    /////////////////////////////////////// FONCTIONS DE SÉLECTION DES FILTRES ///////////////////////////////////////

    function process_History() {
        userGroupClassName($('#pagehistory, .flow-board-history').find('li'));
    }

    function process_Watchlist() {
        scan_ul_special_li(); // Liste de suivi normale
        scan_td(); // Liste de suivi "améliorée"
    }

    function process_Recentchanges() {
        scan_ul_special_li(); // RC normale
        scan_td(); // RC "améliorées"
    }

    function process_Recentchangeslinked() {
        scan_ul_special_li(); // RC liées normales
        scan_td(); // RC liées "améliorées"
    }

    function process_Newpages() {
        scan_first_ul();
    }

    function process_Log() {
        scan_first_ul();
    }

    function process_AbuseLog() {
        scan_first_ul();
    }

    function process_OtherPages() {
        scan_ul_special_li();
    }

    /////////////////////////////////////// LANCEMENTS ///////////////////////////////////////

    var classesApplied = false;
    var enabled = Object.assign({
        'history': true,
        'watchlist': true,
        'recentchanges': true,
        'recentchangeslinked': true,
        'newpages': true,
        'log': true,
        'abuseLog': true,
        'other': true
    }, window.DeluxeHistory_Enabled);

    // en attendant de faire meilleur système pour que les liens déjà visités soient plus visibles
    // (bleu clair sur fond bleu vs bleu foncé sur fond bleu, difficile de les distinguer)
    enabled['watchlist'] = false;

    function applyClasses() {
        if (botMembers && sysopMembers && !classesApplied) {
            classesApplied = true;

            var paramAction = mw.config.get('wgAction');
            var paramCanonicalSpecialPageName = mw.config.get('wgCanonicalSpecialPageName');

            if (paramAction === 'history') {
                if (enabled['history']) {
                    $(process_History);
                }
            } else if (paramCanonicalSpecialPageName === 'Watchlist') {
                if (enabled['watchlist']) {
                    $(process_Watchlist);
                }
            } else if (paramCanonicalSpecialPageName === 'Recentchanges') {
                if (enabled['recentchanges']) {
                    $(process_Recentchanges);
                }
            } else if (paramCanonicalSpecialPageName === 'Recentchangeslinked') {
                if (enabled['recentchangeslinked']) {
                    $(process_Recentchangeslinked);
                }
            } else if (paramCanonicalSpecialPageName === 'Newpages') {
                if (enabled['newpages']) {
                    $(process_Newpages);
                    mw.loader.addStyleTag('.not-patrolled { text-decoration: underline; }');
                }
            } else if (paramCanonicalSpecialPageName === 'Log') {
                if (enabled['log']) {
                    $(process_Log);
                }
            } else if (paramCanonicalSpecialPageName === 'AbuseLog') {
                if (enabled['abuseLog']) {
                    $(process_AbuseLog);
                }
            } else {
                if (enabled['other']) {
                    $(process_OtherPages);
                }
            }
        }
    }

    /////////////////////////////////////// RÉCUPÉRATION DE LA LISTE DES BOTS ET SYSOPS ///////////////////////////////////////

    function updateUserList(Group, UserList, UserContinue) {
        if (!UserList) { UserList = []; }

        var userGroups = mw.config.get('wgUserGroups');
        var apiLimit = userGroups.includes('sysop') || userGroups.includes('bot') ? 5000 : 500;
        var params = {
            'action'  : 'query',
            'list'    : 'allusers',
            'aulimit' : apiLimit,
            'augroup' : Group,
        };
        if (UserContinue) {
            Object.assign(params, UserContinue);
        }

        new mw.Api()
            .get(params)
            .done(function (data) {
                $.each(data.query.allusers, function () {
                    UserList.push(this.name);
                });
                if (data['continue']) {
                    updateUserList(Group, UserList, data['continue']);
                } else {
                    storageSet(Group, UserList.join('|'));
                    if (Group === 'bot') {
                        botMembers = UserList;
                    } else if (Group === 'sysop') {
                        sysopMembers = UserList;
                    }
                    applyClasses();
                }
            });
    }

    function getUserList(Group) {
        var storedValue = storageGet(Group);
        return storedValue ? storedValue.split('|') : null;
    }

    /////////////////////////////////////// INITIALISATION ///////////////////////////////////////

    botMembers = getUserList('bot');
    if (!botMembers) {
        updateUserList('bot');
    }

    sysopMembers = getUserList('sysop');
    if (!sysopMembers) {
        updateUserList('sysop');
    }

    applyClasses();

});