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( '<', '&lt;' ).replaceAll( '>', '&gt;' );
			Text = Text.replaceAll( '__span__', Before ).replaceAll( '__/span__', After );
		} else {
			Text = Text.replaceAll( '<', '&lt;' ).replaceAll( '>', '&gt;' );
		}
		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>