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).
- Edge : 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 * * {{Catégorisation JS|DeluxeHistory}} */ /*global mw, $ */ // La dépendance 'user' assure le chargement du common.js utilisateur avant ce script, pour la configuration. mw.loader.using(['user', 'user.options', 'mediawiki.api', 'mediawiki.storage'], function () { $(function ($) { 'use strict'; var $content = $('#mw-content-text'); var botMembers, sysopMembers; /////////////////////////////////////// LOCALSTORAGE /////////////////////////////////////// function storageGet(key) { var lastUpdate = mw.storage.get('HistoryDeluxe_' + key + '_lastUpdate'); if (lastUpdate) { // cacheAge ne peut théoriquement pas être négatif, mais si jamais cela arrive (problème d'horloge) // le test "cacheAge > 0" permet de ne pas se retrouver avec un cache indéfiniment valide var cacheAge = Date.now() - lastUpdate; if (cacheAge < 1000 * 3600 * 24 && cacheAge > 0) { return mw.storage.get('HistoryDeluxe_' + key); } } return null; } function storageSet(key, value) { mw.storage.set('HistoryDeluxe_' + key, value); mw.storage.set('HistoryDeluxe_' + key + '_lastUpdate', Date.now()); } /////////////////////////////////////// RÉCUPÉRATION DE LA LISTE DES BOTS ET SYSOPS /////////////////////////////////////// function getUserList(group) { var storedValue = storageGet(group); return storedValue ? storedValue.split('|') : null; } function updateUserList(group, doneCallback, userList, userContinue) { if (!userList) { userList = []; } var paramUserGroups = mw.config.get('wgUserGroups'); var APILimit = paramUserGroups.indexOf('sysop') > -1 || paramUserGroups.indexOf('bot') > -1 ? 5000 : 500; var params = { 'action' : 'query', 'list' : 'allusers', 'aulimit' : APILimit, 'augroup' : group, }; if (userContinue) { $.extend(params, userContinue); } new mw.Api() .get(params) .done(function (data) { $.each(data.query.allusers, function () { userList.push(this.name); }); if (data['continue']) { updateUserList(group, doneCallback, userList, data['continue']); } else { storageSet(group, userList.join('|')); if (group === 'bot') { botMembers = userList; } else if (group === 'sysop') { sysopMembers = userList; } doneCallback(); } }); } /////////////////////////////////////// FONCTION DE TRAITEMENT DES LIENS /////////////////////////////////////// function userGroupClassName($lis) { 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.indexOf(UserName) > -1) { return 'UserIs-Bot'; } if (sysopMembers.indexOf(UserName) > -1) { return 'UserIs-Sysop'; } if (isUserIP(userlink)) { 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(userlinks) { var className = ''; $.each(userlinks, function () { var localClassName = getUserClass(this); this.classList.add(localClassName); if (className === '') { className = localClassName; } else if (className !== localClassName) { className = 'UserIs-Mixed'; } }); return className; } $lis.each(function () { var userlinks = this.getElementsByClassName('mw-userlink'); if (userlinks.length === 1) { this.classList.add(getUserClass(userlinks[0])); } else if (userlinks.length > 1) { // groupe des RC "améliorées" this.classList.add(getMultipleClassName(userlinks)); } }); } /////////////////////////////////////// FONCTIONS DE PARCOURS DES ÉLÉMENTS /////////////////////////////////////// function scan_first_ul() { userGroupClassName($content.find('ul').eq(0).find('li')); } function scan_ul_special_li() { userGroupClassName($content.find('ul.special li')); } function scan_td() { userGroupClassName($content.find('td')); } /////////////////////////////////////// FONCTIONS DE SÉLECTION DES FILTRES /////////////////////////////////////// function process_History() { userGroupClassName($content.find('#pagehistory, .flow-board-history').find('li')); } function process_Watchlist() { if (mw.user.options.get('usenewrc')) { scan_td(); // Liste de suivi "améliorée" } else { scan_ul_special_li(); // Liste de suivi normale } } function process_Recentchanges() { if (mw.user.options.get('usenewrc')) { scan_td(); // RC "améliorées" } else { scan_ul_special_li(); // RC normales } } function process_Recentchangeslinked() { if (mw.user.options.get('usenewrc')) { scan_td(); // RC liées "améliorées" } else { scan_ul_special_li(); // RC liées normales } } function process_Newpages() { scan_first_ul(); mw.loader.addStyleTag('.not-patrolled { text-decoration: underline; }'); } function process_Log() { scan_first_ul(); } function process_AbuseLog() { scan_first_ul(); } function process_OtherPages() { scan_ul_special_li(); } /////////////////////////////////////// LANCEMENTS /////////////////////////////////////// var classesApplied = false; var classesCallback; function applyClasses() { if (botMembers && sysopMembers && !classesApplied) { classesApplied = true; classesCallback(); } } function processIfEnabled(pageType, callback) { var enabled = $.extend({ 'history': true, 'watchlist': true, 'recentchanges': true, 'recentchangeslinked': true, 'newpages': true, 'log': true, 'abuseLog': true, 'other': true }, window.DeluxeHistory_Enabled); if (enabled[pageType]) { if (!mw.user.options.get('gadget-DeluxeHistory')) { mw.loader.load('/w/index.php?title=MediaWiki:Gadget-DeluxeHistory.css&action=raw&ctype=text/css', 'text/css'); } classesCallback = callback; botMembers = getUserList('bot'); if (!botMembers) { updateUserList('bot', applyClasses); } sysopMembers = getUserList('sysop'); if (!sysopMembers) { updateUserList('sysop', applyClasses); } applyClasses(); } } /////////////////////////////////////// INITIALISATION /////////////////////////////////////// var paramAction = mw.config.get('wgAction'); var paramCanonicalSpecialPageName = mw.config.get('wgCanonicalSpecialPageName'); if (paramAction === 'history') { processIfEnabled('history', process_History); } else if (paramCanonicalSpecialPageName === 'Watchlist') { processIfEnabled('watchlist', process_Watchlist); } else if (paramCanonicalSpecialPageName === 'Recentchanges') { processIfEnabled('recentchanges', process_Recentchanges); } else if (paramCanonicalSpecialPageName === 'Recentchangeslinked') { processIfEnabled('recentchangeslinked', process_Recentchangeslinked); } else if (paramCanonicalSpecialPageName === 'Newpages') { processIfEnabled('newpages', process_Newpages); } else if (paramCanonicalSpecialPageName === 'Log') { processIfEnabled('log', process_Log); } else if (paramCanonicalSpecialPageName === 'AbuseLog') { processIfEnabled('abuseLog', process_AbuseLog); } else if ($content.find('.special').length) { processIfEnabled('other', process_OtherPages); } }); });