Utilisateur:Od1n/ProtectionsModeles.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.// à exécuter sur [[Spécial:Modèles les plus liés]]
/* jshint esversion: 8 */
/* globals mw, $ */
if (mw.config.get('wgCanonicalSpecialPageName') === 'Mostlinkedtemplates') {
// mise en évidence des redirections, pour éviter de modifier par erreur la page de destination
// refs [[phab:T308504]]
mw.loader.addStyleTag('.mw-spcontent .mw-redirect { color:#0b0; font-style:italic }');
mw.loader.using('mediawiki.api', function () {
$(async function ($) {
'use strict';
const urlParams = new URLSearchParams(window.location.search);
const useTextIndicators = urlParams.get('gadget-indicators') === 'text';
const lines = {};
$('.special').find('li').each(function (_, li) {
const title = li.querySelector('a').textContent;
lines[title] = li;
});
const titles = Object.keys(lines);
const userGroups = mw.config.get('wgUserGroups');
const titlesLimit = (userGroups.includes('sysop') || userGroups.includes('bot')) ? 500 : 50;
const api = new mw.Api();
// ne pas utiliser forEach(), qui ne supporte pas les codes asynchrones
for (const chunk of makeChunks(titles, titlesLimit)) {
// requêtes POST, car avec des requêtes GET on peut avoir des erreurs "414 URI Too Long"
const data = await api.post({
action: 'query',
titles: chunk,
prop: 'info',
inprop: 'protection',
formatversion: 2,
});
for (const page of data.query.pages) {
handlePage(page);
}
}
function handlePage(page) {
let indicatorEdit = '';
let indicatorMove = '';
for (const protection of page.protection) {
if (protection.type === 'edit') {
indicatorEdit = indicator(protection.type, protection.level);
}
else if (protection.type === 'move') {
indicatorMove = indicator(protection.type, protection.level);
}
}
if (useTextIndicators) {
if (indicatorEdit === '') {
indicatorEdit = '[edit none] ';
}
if (indicatorMove === '') {
indicatorMove = '[move none] ';
}
}
const indicators = indicatorEdit + indicatorMove;
if (indicators !== '') {
lines[page.title].insertAdjacentHTML('afterbegin', indicators);
}
}
function indicator(type, level) {
if (level === 'sysop') {
return useTextIndicators
? `[${type} sysop] `
: '<img src="/media/wikipedia/commons/thumb/6/6f/Crystal_Clear_action_lock1.png/15px-Crystal_Clear_action_lock1.png"> ';
}
else if (level === 'editextendedsemiprotected') {
return useTextIndicators
? `[${type} editextendedsemiprotected] `
: '<img src="/media/wikipedia/commons/thumb/c/c6/Crystal_Clear_action_lock7.png/15px-Crystal_Clear_action_lock7.png"> ';
}
else if (level === 'autoconfirmed') {
return useTextIndicators
? `[${type} autoconfirmed] `
: '<img src="/media/wikipedia/commons/thumb/2/2b/Crystal_Clear_action_half_lock.png/15px-Crystal_Clear_action_half_lock.png"> ';
}
else {
return '[unknown protection level] ';
}
}
function makeChunks(arr, size) {
const chunks = [];
for (let i = 0; i < arr.length; i += size) {
chunks.push(arr.slice(i, i + size));
}
return chunks;
}
});
});
}