MediaWiki:Gadget-RevertDiff.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./**
* Outils pour annuler des modifications
*
* fournit des liens dans les pages de diff pour révoquer facilement une modification et avertir son auteur
*
* Auteurs : Lorian (en), Chphe (fr)
* Dernière révision : 20 septembre 2025
* {{Catégorisation JS|RevertDiff}}
*/
//<nowiki>
function isDiffPage() {
return !!mw.config.get( 'wgDiffNewId' );
}
if ( isDiffPage() ) {
mw.loader.using( [ 'mediawiki.api' ], function () {
$( function ( $ ) {
const api = new mw.Api( { userAgent: 'RevertDiff/1.0.0 (https://fr.wikipedia.org/wiki/Discussion_MediaWiki:Gadget-RevertDiff.js)' } );
const Texts = {
Annul : 'Annuler',
Revert : 'Révoquer',
Message : 'Message',
Warn : 'Avertir',
MessageAlert: 'Quel message faut-il laisser ?',
AnnulResume : 'Annulation des modifications de [[Special:Contributions/$2|$2]] (retour à la version précédente de [[Special:Contributions/$1|$1]])',
RevertResume: 'Révocation des modifications de [[Special:Contributions/$2|$2]] (retour à la version précédente de [[Special:Contributions/$1|$1]])',
};
const Warns = [
{ text: 'Test1', template: '{{subst:Test 1|$page}} ~~~~' },
{ text: 'Test2', template: '{{subst:Test 2}} ~~~~' },
{ text: 'Test3', template: '{{subst:Test 3}} ~~~~' },
{ text: 'Test4', template: '{{subst:Seul avertissement}} ~~~~' },
{ text: 'Lien externe', template: '{{subst:Bienvenue spammeur|$page}} ~~~~' },
{ text: 'Faut sourcer', template: '{{subst:Faut sourcer|$page}} ~~~~' },
{ text: 'Bienvenue', template: '{{subst:Bienvenue nouveau|sign=~~~~}}' },
{ text: 'BienvenueCT', template: '{{subst:Bienvenue compte temporaire|sign=~~~~}}' },
{ text: 'MerciCT', template: '{{subst:Bienvenue compte temporaire méritant|{{safesubst:REVISIONUSER}}|sign=~~~~}}' },
];
function createLink( label, onClick, title ) {
const a = document.createElement( 'a' );
a.href = '#';
a.textContent = label;
if ( title ) a.title = title;
a.addEventListener( 'click', function ( e ) {
e.preventDefault();
onClick( e );
});
return a;
}
// Get username of submitter
const user1Sel = document.querySelector( 'td.diff-otitle a.mw-userlink bdi' );
const user2Sel = document.querySelector( 'td.diff-ntitle a.mw-userlink bdi' );
if ( !user1Sel || !user2Sel ) return;
const user1 = user1Sel.textContent;
const user2 = user2Sel.textContent;
async function processAnnulOrRevert( action, withMessage ) {
let summary;
if ( action === 'annul' ) {
summary = Texts.AnnulResume;
} else if ( action === 'revert' ) {
summary = Texts.RevertResume;
}
summary = summary.replace( /\$1/g, user1 ).replace( /\$2/g, user2 );
if ( withMessage ) {
let message = prompt( Texts.MessageAlert );
if ( message ) {
summary += '\xA0: ' + message;
} else {
mw.notify( 'Aucun message saisi. La modification n\'a pas été annulée.', { type: 'error' } );
return;
}
}
api.postWithEditToken({
title: mw.config.get( 'wgPageName' ),
action: 'edit',
undoafter: mw.config.get( 'wgDiffOldId' ),
undo: action === 'revert' ? mw.config.get( 'wgCurRevisionId' ) : mw.config.get( 'wgDiffNewId' ),
summary: summary
}).then( () => mw.notify( 'Modification annulée.', { type: 'success' } ) );
}
const linkAnnulDirect = createLink( Texts.Annul, () => processAnnulOrRevert( 'annul', false ) );
const linkAnnulMessage = createLink( Texts.Message, () => processAnnulOrRevert( 'annul', true ) );
const linkRevertDirect = createLink( Texts.Revert, () => processAnnulOrRevert( 'revert', false ) );
const linkRevertMessage = createLink( Texts.Message, () => processAnnulOrRevert( 'revert', true ) );
const links = document.createElement( 'span' );
links.append( '(', linkAnnulDirect, ' / ', linkAnnulMessage, ') (', linkRevertDirect, ' / ', linkRevertMessage, ')' );
links.append( ' (' + Texts.Warn + ' : ' );
Warns.forEach( ( Warn, index ) => {
const Template = Warn.template
.replace( '$page', mw.config.get( 'wgPageName' ).replace( /_/g, ' ' ) )
.replace( '$user', user2 );
if ( index !== 0 ) {
links.append( ' / ' );
}
const linkWarn = createLink(
Warn.text,
() => api.newSection( 'User_talk:' + user2, '', Template ).then( () => mw.notify( 'Avertissement envoyé.', { type: 'success' } ) ),
Warn.template
);
links.append( linkWarn );
});
links.append( ')' );
let contentSub = document.getElementById( 'contentSub' );
if ( !contentSub ) {
contentSub = document.createElement( 'div' );
contentSub.id = 'contentSub';
document.getElementById( 'mw-content-text' ).before( contentSub );
}
contentSub.append( links );
});
});
}
//</nowiki>