MediaWiki:Gadget-AllmessagesDeluxe.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) ;
Firefox (sur GNU/Linux) / Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5./* *********************************************************************
;Fonction :
permet de rechercher dans les messages système ([[Special:Allmessages]]) par mot-clefs (Expressions régulières)
;Installation :
obtenir('AllmessagesDeluxe');
{{Catégorisation JS|AllmessagesDeluxe}}
************************************************************************* */
//<syntaxhighlight lang="javascript"><pre><nowiki>
/* globals mw, $ */
////////////////////////////////////////// REQUÊTE DES MESSAGES SYSTÈME ///////////////////////////////////////////
const AllmessagesDeluxe = {
getMessages: function () {
mw.loader.using( 'mediawiki.api', function () {
new mw.Api( { userAgent: 'AllmessagesDeluxe/1.0' } )
.get({ action: 'query', meta: 'allmessages', formatversion: 2 })
.done( AllmessagesDeluxe.populateMessages );
});
},
populateMessages: function ( data ) {
/* jshint sub: true */
const AllMessages = data.query.allmessages;
for ( const Message of AllMessages ) {
if ( Message[ 'missing' ] ) continue;
const MessageTitle = Message[ 'name' ];
const MessageContent = Message[ 'content' ];
AllmessagesDeluxe.messagesTitles.push( MessageTitle );
AllmessagesDeluxe.messagesContents.push( MessageContent );
}
AllmessagesDeluxe.GetMessagesOK = true;
if ( AllmessagesDeluxe.CreatePanelOK ) AllmessagesDeluxe.enableForm();
},
////////////////////////////////////////// ACTIVATION DU BOUTON "APPLIQUER" ///////////////////////////////////////////
enableForm: function () {
const Button = document.getElementById( 'AllmessagesDeluxe_Button' );
if ( Button ) {
Button.value = 'Appliquer';
Button.disabled = '';
}
},
////////////////////////////////////////// MODIFICATION DU FORMULAIRE DE RECHERCHE ///////////////////////////////////////////
createPanel: function () {
/* jshint laxbreak: true */
const $form = $( '#mw-content-text' ).find( 'form' ).first();
if ( !$form.length ) return;
const $container = $( '<table style="width:100%; border-collapse:collapse;">' );
const $row = $( '<tr>' );
const $tdOne = $( '<td style="width:50%; padding:0;">' );
const $tdTwo = $( '<td style="width:50%; padding:0;">' );
$container.append( $row );
$row.append( $tdOne, $tdTwo );
$form.replaceWith( $container );
$tdOne.append( $form );
const newForm = document.createElement( 'form' );
newForm.id = 'DeluxeSearchForm';
newForm.method = 'post';
newForm.onsubmit = function () {
AllmessagesDeluxe.checkPanel();
return false;
};
newForm.innerHTML = ''
+ '<table style="width:100%; max-width:50em;">'
+ '<tbody>'
+ '<tr>'
+ '<td colspan="2" style="text-align:center;text-weight:bold;" >'
+ '<label for="DeluxeSearchForm" >Rechercher par mot-clef</label>'
+ '</td>'
+ '</tr>'
+ '<tr>'
+ '<td style="text-align:right;">'
+ '<label for="SearchInTitle" >Dans le titre du message\xA0: </label>'
+ '</td>'
+ '<td>'
+ '<input id="SearchInTitle" type="text" value="" />'
+ '</td>'
+ '</tr>'
+ '<tr>'
+ '<td style="text-align:right;">'
+ '<label for="SearchInMessage" >Dans le contenu du message\xA0: </label>'
+ '</td>'
+ '<td>'
+ '<textarea id="SearchInMessage" value="" ></textarea>'
+ '</td>'
+ '</tr>'
+ '<tr>'
+ '<td>'
+ '</td>'
+ '<td>'
+ '<input class="cdx-button cdx-button--action-progressive cdx-button--weight-primary" id="AllmessagesDeluxe_Button" type="button" value="Appliquer (veuillez patienter)" disabled="disabled" />'
+ '</td>'
+ '</tr>'
+ '</tbody>'
+ '</table>';
$tdTwo.append( newForm );
const button = newForm.querySelector( '#AllmessagesDeluxe_Button' );
if ( button ) {
button.addEventListener( 'click', AllmessagesDeluxe.checkPanel );
}
AllmessagesDeluxe.CreatePanelOK = true;
if ( AllmessagesDeluxe.GetMessagesOK ) AllmessagesDeluxe.enableForm();
},
////////////////////////////////////////// VÉRIFICATION DU FORMULAIRE DE RECHERCHE ///////////////////////////////////////////
checkPanel: function () {
const MessageInput = document.getElementById( 'SearchInMessage' ).value;
const TitleInput = document.getElementById( 'SearchInTitle' ).value;
if ( !MessageInput && !TitleInput ) return;
AllmessagesDeluxe.checkMessages( MessageInput, TitleInput );
},
////////////////////////////////////////// RECHERCHE DES MOT-CLEFS DANS LES MESSAGES ///////////////////////////////////////////
checkMessages: function ( MessageInput, TitleInput ) {
let RegExpContent = false;
let RegExpTitle = false;
const TitleArray = [];
const MatchedTitleArray = [];
const ContentArray = [];
if ( MessageInput ) RegExpContent = new RegExp( MessageInput, 'gi' );
if ( TitleInput ) RegExpTitle = new RegExp( TitleInput, 'gi' );
for ( let a = 0; a < AllmessagesDeluxe.messagesTitles.length; a++ ) {
const MessageTitle = AllmessagesDeluxe.messagesTitles[ a ];
const MessageContent = AllmessagesDeluxe.messagesContents[ a ];
if ( RegExpContent && RegExpTitle ) {
if ( MessageTitle.match( RegExpTitle ) && MessageContent.match( RegExpContent ) ) {
TitleArray.push( MessageTitle );
MatchedTitleArray.push( AllmessagesDeluxe.checkMatches( MessageTitle, RegExpTitle ) );
ContentArray.push( AllmessagesDeluxe.checkMatches( MessageContent, RegExpContent ) );
}
} else if ( RegExpContent ) {
if ( MessageContent.match( RegExpContent ) ) {
TitleArray.push( MessageTitle );
MatchedTitleArray.push( MessageTitle );
ContentArray.push( AllmessagesDeluxe.checkMatches( MessageContent, RegExpContent ) );
}
} else if ( RegExpTitle ) {
if ( MessageTitle.match( RegExpTitle ) ) {
TitleArray.push( MessageTitle );
MatchedTitleArray.push( AllmessagesDeluxe.checkMatches( MessageTitle, RegExpTitle ) );
ContentArray.push( AllmessagesDeluxe.checkMatches( MessageContent ) );
}
}
}
AllmessagesDeluxe.upDateTable( TitleArray, MatchedTitleArray, ContentArray, false );
},
////////////////////////////////////////// SURLIGNAGE ///////////////////////////////////////////
checkMatches: function ( Text, Reg ) {
const Before = '<span style="background-color:var(--background-color-destructive-subtle, #ffe9e5);color:inherit;border:1px dotted var(--border-color-destructive, #f54739);">';
const After = '</span>';
if ( Reg ) {
// Use a function as replacement to avoid interpreting "$" characters
Text = Text.replaceAll( Reg, function ( Match ) {
return '__span__' + Match + '__/span__';
});
Text = Text.replaceAll( '<', '<' ).replaceAll( '>', '>' );
Text = Text.replaceAll( '__span__', Before ).replaceAll( '__/span__', After );
} else {
Text = Text.replaceAll( '<', '<' ).replaceAll( '>', '>' );
}
return Text;
},
////////////////////////////////////////// AFFICHAGE DES RÉSULTATS ///////////////////////////////////////////
upDateTable: function( Titles, MatchedTitles, Contents ) {
const Table = document.getElementById( 'mw-allmessagestable' );
if ( !Table ) return;
document.querySelectorAll( ".TablePager_nav" ).forEach( el => el.remove() );
const TableHead = Table.getElementsByTagName( 'thead' )[ 0 ];
TableHead.innerHTML = '<tr><th>Nom du message </th><th>Message actuel</th></tr>';
$( Table ).find( 'tbody' ).remove();
for ( let a = 0; a < Titles.length; a++ ) {
const NewTbody = document.createElement( 'tbody' );
const NewTR = document.createElement( 'tr' );
const TdTitle = document.createElement( 'td' );
TdTitle.innerHTML = '<a href="' + mw.config.get( 'wgServer' ) + mw.config.get( 'wgArticlePath' ).replace( '$1', mw.config.get( 'wgFormattedNamespaces' )[ 8 ] + ':' + Titles[ a ] ) + '" >' + MatchedTitles[ a ] + '</a>';
const TdContent = document.createElement( 'td' );
TdContent.innerHTML = Contents[ a ];
NewTbody.append( NewTR );
NewTR.append( TdTitle, TdContent );
Table.append( NewTbody );
}
}
};
////////////////////////////////////////// LANCEMENT ///////////////////////////////////////////
if ( mw.config.get( 'wgCanonicalSpecialPageName' ) === 'Allmessages' ) {
AllmessagesDeluxe.GetMessagesOK = false;
AllmessagesDeluxe.CreatePanelOK = false;
AllmessagesDeluxe.messagesTitles = [];
AllmessagesDeluxe.messagesContents = [];
AllmessagesDeluxe.getMessages();
$( AllmessagesDeluxe.createPanel );
}
//</nowiki></pre></syntaxhighlight>