Utilisateur:Od1n/DeluxeHistory.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) ;
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();
});