Discussion MediaWiki:Gadget-DeluxeHistory.js

/* */

/*********************************************************************************************

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

/*global document, localStorage, mw, jQuery, importStylesheet */ /*jslint vars: true, plusplus: true */

(function (mw, $) {

   'use strict';

   var botMembers, sysopMembers, patrollerMembers;
   var oldBotMembers = ['Tavernierbot'];

   /////////////////////////////////////// DETECTION SUPPORT LOCALSTORAGE ///////////////////////////////////////

   var supportLocalStorage, dateNow, dateNowUTC;
   try {
       localStorage.setItem('modernizr', 'modernizr');
       localStorage.removeItem('modernizr');
       supportLocalStorage = true;
   } catch (e) {
       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] + ':';

   function getUserName(domUserlink) {
       return domUserlink.innerHTML;
   }

   function isUserIP(domUserlink) {
       return domUserlink.title.indexOf(nsUtilisateur) !== 0;
   }

   function getUserClass(jUserlink) {
       var domUserlink = jUserlink[0];
       var UserName = getUserName(domUserlink);
       if ($.inArray(UserName, botMembers) > -1) { return 'UserIs-Bot'; }
       if ($.inArray(UserName, sysopMembers) > -1) {
          if (UserName === wgUserName) { return 'UserIs-Myself'; }
          else { return 'UserIs-Sysop'; }
       } 
       if ($.inArray(UserName, patrollerMembers) > -1) { 
          if (UserName === wgUserName) { return 'UserIs-Myself'; }
          else { return 'UserIs-Patroller'; }
       }
       if (isUserIP(domUserlink)) { return 'UserIs-IP'; }
       if ($.inArray(UserName, oldBotMembers) > -1) { return 'UserIs-OldBot'; }
       if (UserName === wgUserName) {
           return 'UserIs-Myself';
       } else {
           return 'UserIs-User';
       }
   }

   function userGroupClassName(Li) {
       var jLi = $(Li);
       var jUserlink = jLi.find('a.mw-userlink');
       if (jUserlink.length > 0) {
           jLi.addClass(getUserClass(jUserlink));
       }
   }

   /////////////////////////////////////// FONCTIONS DE PARCOURS DES ELEMENTS ///////////////////////////////////////

   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 SELECTION 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 HistoryDeluxe_ClassesApplied = false;

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

           importStylesheet('Mediawiki:Gadget-DeluxeHistory.css');

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

           if (wgAction === 'history') {
               $(document).ready(process_History);

           // 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)
           } else if (wgCanonicalSpecialPageName === 'Watchlist' && (document.URL.indexOf('edit') === -1 || document.URL.indexOf('raw') === -1)) {
               $(process_Watchlist);

           } else if (wgCanonicalSpecialPageName === 'Recentchanges') {
               $(document).ready(process_Recentchanges);

           } else if (wgCanonicalSpecialPageName === 'Recentchangeslinked') {
               $(document).ready(process_Recentchangeslinked);

           } else if (wgCanonicalSpecialPageName === 'Newpages') {
               $(document).ready(process_Newpages);

           } else if (wgCanonicalSpecialPageName === 'Log') {
               $(document).ready(process_Log);

           } else if (wgCanonicalSpecialPageName === 'AbuseLog') {
               $(document).ready(process_AbuseLog);

           } else {
               $(document).ready(process_OtherPages);
           }
       }
   }

   /////////////////////////////// RECUPERATION DE LA LISTE DES BOTS, SYSOPS ET PATROLLERS ///////////////////////////////

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

       var wgUserGroups = mw.config.get('wgUserGroups');
       var APILimit = $.inArray('sysop', wgUserGroups) > -1 || $.inArray('bot', wgUserGroups) > -1 || $.inArray('patroller', 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;
               } else if (Group === 'patroller') {
                   patrollerMembers = UserList;
               }
               applyClasses();
           }
       });
   }

   function getUserList(Group) {
       var storedValue, lastUpdate;
       if (supportLocalStorage) {
           lastUpdate = localStorage.getItem('HistoryDeluxe_lastUpdate');
           if (lastUpdate && dateNowUTC - lastUpdate < 1000 * 3600 * 24 && dateNowUTC - lastUpdate > 0) {
               storedValue = localStorage.getItem('HistoryDeluxe_' + Group);
           }
       }
       return storedValue ? storedValue.split('|') : null;
   }

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

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

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

   patrollerMembers = getUserList('patroller');
   if (!patrollerMembers) {
       updateUserList('patroller');
   } else {
       applyClasses();
   }
   if (!oldBotMembers) {
       applyClasses();
   }

})(mw, jQuery);

Revenir à la page « Gadget-DeluxeHistory.js ».