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