Utilisateur:Ltrlg/scripts/HistoryDeluxe.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) ;

Firefox (sur GNU/Linux) / Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5.
/**
 * Nom : DeluxeHistory
 * Implémentation originale de Dake, basée sur du code Ajax de GôTô
 * Réécriture complète par Dr Brains et Od1n, avec améliorations de Ltrlg
 * Dernière mise à jour : 22 août 2013
 * dépendances :
 *  — les habituelles implicites 'mediawiki' & 'jquery' ;
 *  — 'user' (chargement du common.js) ;
 *  — 'mediawiki.user' (fonction mw.user.getName).
 * {{Catégorisation JS|DeluxeHistory}}
 */
 
/*global document, localStorage, mediaWiki, jQuery */
/*jslint vars: true, plusplus: true */
 
(function (mw, $) {
    'use strict';
 
    var botMembers, sysopMembers;
 
    /////////////////////////////////////// DÉTECTION SUPPORT LOCALSTORAGE ///////////////////////////////////////
 
    var supportLocalStorage, dateNow, dateNowUTC;
    try {
        localStorage.setItem('modernizr', 'modernizr');
        localStorage.removeItem('modernizr');
        supportLocalStorage = true;
    } catch (e) {
        supportLocalStorage = false;
    }
 
    // XXX - Ce fork est très ancien, désactivation du localStorage pour ne pas enregistrer de données problématiques
    supportLocalStorage = false;
 
    if (supportLocalStorage) {
        dateNow = new Date();
        dateNowUTC = dateNow.getTime() + dateNow.getTimezoneOffset() * 60000;
    }
 
    /////////////////////////////////////// FONCTIONS DE TRAITEMENT DES LIENS ///////////////////////////////////////
 
    var nsUtilisateur = mw.config.get('wgFormattedNamespaces')[2] + ':';
    var watcherName = mw.user.getName();
 
    function getUserName(domUserlink) {
        return domUserlink.innerHTML;
    }
 
    function isUserIP(domUserlink) {
        return domUserlink.title.indexOf(nsUtilisateur) !== 0;
    }
 
    function getUserClass(domUserlink) {
        var UserName = getUserName(domUserlink);
        if (UserName === watcherName) { return 'UserIs-Self'; }
        if ($.inArray(UserName, botMembers) > -1) { return 'UserIs-Bot'; }
        if ($.inArray(UserName, sysopMembers) > -1) { return 'UserIs-Sysop'; }
        if (isUserIP(domUserlink)) { return 'UserIs-IP'; }
        return 'UserIs-User';
    }
 
    // Renvoie 'UserIs-…' si un seul type, 'UserIs-Mixed' sinon (RC "améliorée").
    // Colore les liens vers les utilisateurs pour disposer de la différentiation même si historique mixte.
    function getMultipleClassName(jUserlinks) {
        var className = '';
        var localClassName;
        jUserlinks.each(function() {
            localClassName = getUserClass(this);
            $(this).addClass(localClassName);
            if (className === '') {
                className = localClassName;
            } else if (className !== localClassName) {
                className = 'UserIs-Mixed';
            }
        });
        return className;
    }
 
    function userGroupClassName(Li) {
        var jLi = $(Li);
        var jUserlink = jLi.find('a.mw-userlink');
        if (jUserlink.length > 0) {
            if ($(Li).find('.changedby').length === 0) {  // groupe des RC "améliorées"
                jLi.addClass(getUserClass(jUserlink[0]));
            } else {
                jLi.addClass(getMultipleClassName(jUserlink) + ' UserIs-Multiple');
            }
        }
    }
 
    /////////////////////////////////////// FONCTIONS DE PARCOURS DES ÉLÉMENTS ///////////////////////////////////////
 
    function get_bodyContent() {
        var Content = document.getElementById('bodyContent');
        if (!Content) { Content = document.getElementById('mw_contentholder'); }
        if (!Content) { Content = document.getElementById('article'); }
        return Content;
    }
 
    function scan_first_ul() {
        var Content = get_bodyContent();
        $(Content).find('ul').eq(0).find('li').each(function () {
            userGroupClassName(this);
        });
    }
 
    function scan_ul_special_li() {
        $('ul.special li').each(function () {
            userGroupClassName(this);
        });
    }
 
    function scan_td() {
        $('td').each(function () {
            userGroupClassName(this);
        });
    }
 
    /////////////////////////////////////// FONCTIONS DE SÉLECTION DES FILTRES ///////////////////////////////////////
 
    function process_History() {
        $('#pagehistory').find('li').each(function () {
            userGroupClassName(this);
        });
    }
 
    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 DeluxeHistory_ClassesApplied = false;
    var DeluxeHistory_Enabled = Object.assign({
        "history": true,
        "watchlist": true,
        "recentchanges": true,
        "recentchangeslinked": true,
        "newpages": true,
        "log": true,
        "abuseLog": true,
        "other": true
    }, window.DeluxeHistory_Enabled);
 
    function enabled(pageType) {
        switch( $.type(DeluxeHistory_Enabled[pageType]) ) {
            case 'boolean':
                return DeluxeHistory_Enabled[pageType];
                break;
            case 'function':
                return DeluxeHistory_Enabled[pageType]();
                break;
            default:
                return false;
        }
    }
 
    function applyClasses() {
        if (botMembers && sysopMembers && !DeluxeHistory_ClassesApplied) {
            DeluxeHistory_ClassesApplied = true;
 
            var wgAction = mw.config.get('wgAction');
            var wgCanonicalSpecialPageName = mw.config.get('wgCanonicalSpecialPageName');
 
            if ( mw.config.get('wgAction') === 'history' ) {
                if( enabled("history") ) {
                    $(document).ready(process_History);
                }
            } else if ( mw.config.get('wgCanonicalSpecialPageName') === 'Watchlist' && (document.URL.indexOf('edit') === -1 || document.URL.indexOf('raw') === -1) ) {
                if( enabled("watchlist") ) {
                    $(process_Watchlist);
                }
            } else if ( mw.config.get('wgCanonicalSpecialPageName') === 'Recentchanges' ) {
                if( enabled("recentchanges") ) {
                    $(document).ready(process_Recentchanges);
                }
            } else if ( mw.config.get('wgCanonicalSpecialPageName') === 'Recentchangeslinked' ) {
                if( enabled("recentchangeslinked") ) {
                    $(document).ready(process_Recentchangeslinked);
                }
            } else if ( mw.config.get('wgCanonicalSpecialPageName') === 'Newpages' ) {
                if( enabled("newpages") ) {
                    $(document).ready(process_Newpages);
                    mw.util.addCSS('.not-patrolled { text-decoration: underline !important; }');
                }
            } else if ( mw.config.get('wgCanonicalSpecialPageName') === 'Log' ) {
                if( enabled("log") ) {
                    $(document).ready(process_Log);
                }
            } else if ( mw.config.get('wgCanonicalSpecialPageName') === 'AbuseLog' ) {
                if( enabled("abuseLog") ) {
                    $(document).ready(process_AbuseLog);
                }
            } else {
                if( enabled("other") ) {
                    $(document).ready(process_OtherPages);
                }
            }
        }
    }
 
    /////////////////////////////////////// RÉCUPÉRATION DE LA LISTE DES BOTS ET SYSOPS ///////////////////////////////////////
 
    var validCache;
 
    function updateUserList(Group, UserList, UserContinue) {
        if (!UserList) { UserList = []; }
 
        var wgUserGroups = mw.config.get('wgUserGroups');
        var APILimit = $.inArray('sysop', mw.config.get('wgUserGroups')) > -1 || $.inArray('bot', mw.config.get('wgUserGroups')) > -1
            ? 5000 : 500;
        var params = {
            format: 'xml',
            action: 'query',
            list: 'allusers',
            aulimit: APILimit,
            augroup: Group
        };
        if (UserContinue) {
            params.aufrom = UserContinue;
        }
 
        $.get(mw.util.wikiScript('api'), params, function (data) {
            $(data).find('u').each(function () {
                var userName = this.getAttribute('name');
                if (userName) {
                    UserList.push(userName);
                }
            });
            var UserContinue = $(data).find('query-continue > allusers');
            if (UserContinue.length > 0) {
                updateUserList(Group, UserList, UserContinue.attr('aufrom'));
            } else {
                if (supportLocalStorage) {
                    var storedValue = UserList.join('|');
                    localStorage.setItem('HistoryDeluxe_' + Group, storedValue);
                    localStorage.setItem('HistoryDeluxe_lastUpdate', dateNowUTC);
                }
                if (Group === 'bot') {
                    botMembers = UserList;
                } else if (Group === 'sysop') {
                    sysopMembers = UserList;
                }
                applyClasses();
            }
        });
    }
 
    function testCacheValidity() {
        var lastUpdate;
        if (supportLocalStorage) {
            lastUpdate = localStorage.getItem('HistoryDeluxe_lastUpdate');
            validCache = lastUpdate && dateNowUTC - lastUpdate < 1000 * 3600 * 24 && dateNowUTC - lastUpdate > 0;
        } else {
            validCache = false;
        }
    }
 
    // Exécutée si validCache, ie. si (supportLocalStorage && lastUpdate pas trop loin)
    function getUserList(Group) {
        var storedValue;
        storedValue = localStorage.getItem('HistoryDeluxe_' + Group);
        return storedValue ? storedValue.split('|') : null;
    }
 
    /////////////////////////////////////// INITIALISATION ///////////////////////////////////////
 
    testCacheValidity();
 
    if (validCache) {
        botMembers = getUserList('bot');
        sysopMembers = getUserList('sysop');
        applyClasses();
    } else {
        updateUserList('bot');
        updateUserList('sysop');
    }
 
})(mediaWiki, jQuery);