Aller au contenu

MediaWiki:Gadget-CommonEdit.js

Une page de Wikipédia, l'encyclopédie libre.
Ceci est une version archivée de cette page, en date du 3 avril 2024 à 08:06 et modifiée en dernier par Od1n (discuter | contributions) (le nouveau système "flat config" de ESLint ne supporte plus du tout les environnements, et par conséquent ce n'est aussi plus supporté dans le validateur en ligne (le "playground") ; heureusement, on peut cumuler plusieurs directives "globals", ce qui permet de séparer celle stupidement maintenant nécessaire, de celle vraiment pertinente). Elle peut contenir des erreurs, des inexactitudes ou des contenus vandalisés non présents dans la version actuelle.
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.
/* globals window */
/* globals mw, $, MonobookToolbar, addCharSubsetMenu */
/* exported addCharSubsetMenu */

/**
 * Applications spécifiques aux pages de modification.
 *
 * Todo : migrer celles qui ne sont pas vitales dans les gadgets
 *
 * <nowiki>
 */

// Penser à maintenir à jour les dépendances dans [[MediaWiki:Gadgets-definition]] !


// Encapsulation de tout le code dans une IIFE globale
// (le code doit être exécuté immédiatement, donc ne pas mettre ici de mw.loader.using(), etc.)
( function () {
	'use strict';

	/**
	 * Désactiver le bouton Sauvegarder à la première édition
	 * English : Force IP to preview before saving changes.
	 * Copyright Marc Mongenet, 2006
	 * Plyd 05/2007: add "after preview" in the button to prevent misunderstanding from beginners
	 */
	function forcePreview( $ ) {
		$( '#wpSave' )
			.prop( 'disabled', true )
			.val( 'Publier (après prévisualisation)' );
		$( '#wpSaveWidget' )
			.removeClass( 'oo-ui-widget-enabled' )
			.addClass( 'oo-ui-widget-disabled' );
	}
	if ( mw.config.get( 'wgUserName' ) === null && mw.config.get( 'wgAction' ) === 'edit' ) {
		$( forcePreview );
	}


	/**
	 * Caractères spéciaux
	 *
	 * Ajouter un menu pour choisir des sous-ensembles de caractères spéciaux.
	 * Ecrit par Zelda, voir sur [[Utilisateur:Zelda/Edittools.js]].
	 * Remplace l'ancienne fonction par une variante plus rapide.
	 */

	/**
	 * Ajoute un menu déroulant permettant de choisir un jeu de caractères spéciaux
	 * Les caractères spéciaux sont définis dans [[MediaWiki:Edittools]]
	 *
	 * L'export en global est utilisé par [[MediaWiki:Gadget-LiveRC.js/Extensions/EditCharactersExtension.js]]
	 */
	window.addCharSubsetMenu = function () {
		var $specialchars = $( '#specialcharsets' );
		if ( !$specialchars.length ) return;

		var saveLastSelected = mw.util.debounce( 250, function ( lastSelected ) {
			mw.storage.set( 'CharSubset-lastSelected', lastSelected );
		} );

		// Construction du menu de sélection
		var $charSubsetSelect = $( '<select>' )
			.change( function () {
				chooseCharSubset( this.selectedIndex );
				saveLastSelected( this.value );
			} );

		refreshCharSubsetSelect( $specialchars, $charSubsetSelect );

		$specialchars.prepend( $charSubsetSelect );
	};

	/**
	 * Ajout des options au menu et restauration de la dernière position
	 */
	function refreshCharSubsetSelect( $specialchars, $charSubsetSelect ) {
		$charSubsetSelect.empty();

		var titles = [];
		$specialchars.find( 'p' ).each( function () {
			titles.push( this.title );
		} );

		titles.forEach( function ( title ) {
			$charSubsetSelect.append( $( '<option>' ).text( title ) );
		} );

		var lastSelected = mw.storage.get( 'CharSubset-lastSelected' );
		var position = titles.indexOf( lastSelected );
		if ( position !== -1 ) {
			$charSubsetSelect.val( lastSelected );
			chooseCharSubset( position );
		} else {
			chooseCharSubset( 0 ); /* default subset */
		}
	}

	/**
	 * Affichage du jeu de caractères sélectionné
	 */
	function chooseCharSubset( index ) {
		$( '#specialcharsets' ).find( 'p' ).each( function ( i, p ) {
			// Initialisation du jeu de caractères sélectionné
			if ( i === index ) {
				initializeCharSubset( p );
			}
			// Affichage du jeu sélectionné, masquage des autres
			p.style.display = ( i === index ) ? 'inline' : 'none';
		} );
	}

	/**
	 * Initialisation du jeu de caractères sélectionné
	 * Paramètre : paragraphe contenant le jeu à initialiser. Initialise tous les
	 * caractères contenus dans les sous-spans du paragraphe
	 */
	function initializeCharSubset( p ) {
		// traitement des spans du paragraphe
		$( p ).find( 'span' ).each( function ( _, span ) {
			// span déjà traité
			if ( span.childNodes.length === 0 || span.childNodes[ 0 ].nodeType !== 3 ) return;

			// on parse le contenu du span
			var chars = span.childNodes[ 0 ].nodeValue
				.replace( /\\ /g, '__ESCAPED_SPACE__' )
				.trim()
				.split( ' ' )
				.map( function ( value ) {
					return value.replace( /__ESCAPED_SPACE__/g, ' ' );
				} );

			// création des liens MonobookToolbar.insertTags( tagBegin, tagEnd, defaultValue )
			var newElements = [];
			for ( var k = 0; k < chars.length; ++k ) {
				var tags = chars[ k ].split( '+' );
				var tagBegin = tags[ 0 ];
				var tagEnd = tags.length > 1 ? tags[ 1 ] : '';
				var defaultValue = tags.length > 2 ? tags[ 2 ] : '';

				var callback = ( function ( tagBegin, tagEnd, defaultValue ) {
					return function ( e ) {
						e.preventDefault();
						MonobookToolbar.insertTags( tagBegin, tagEnd, defaultValue );
					};
				} )( tagBegin, tagEnd, defaultValue );

				var $a = $( '<a>' )
					.attr( 'href', '#' )
					.text( tagBegin + tagEnd )
					.click( callback );

				if ( ( tagBegin + tagEnd ).includes( ' ' ) ) {
					$a.addClass( 'nowrap' );
				}

				if ( k > 0 ) {
					newElements.push( ' ' );
				}
				newElements.push( $a );
			}

			// remplacement du contenu
			$( span ).empty().append( newElements );
		} );
	}

	$( function ( $ ) { // eslint-disable-line no-unused-vars
		addCharSubsetMenu();
	} );

	/**
	 * Permet d'ajouter un jeu de caractères spéciaux dans le menu déroulant
	 * paramètres :
	 * - nom du jeu de caractères
	 * - contenu HTML. Les caractères spéciaux doivent être dans des spans
	 *   exemple : 'caractères : <span>â ê î ô û</span>'
	 */
	function addSpecialCharsetHTML( title, charsHTML ) {
		$( function ( $ ) {
			var $specialchars = $( '#specialcharsets' );
			if ( !$specialchars.length ) return;

			// Ajout des caractères spéciaux. Les liens seront initialisés par initializeCharSubset()
			// lors de la sélection
			var $p = $( '<p>' )
				.css( 'display', 'none' )
				.attr( 'title', title )
				.html( charsHTML );
			$specialchars.append( $p );

			// Si le menu de sélection existe déjà, il faut reconstruire ses options
			var $charSubsetSelect = $specialchars.find( 'select' );
			if ( $charSubsetSelect.length ) {
				refreshCharSubsetSelect( $specialchars, $charSubsetSelect );
			}
		} );
	}

	/**
	 * Permet d'ajouter un jeu de caractères spéciaux dans le menu déroulant
	 * paramètres :
	 * - nom du jeu de caractères
	 * - caractères spéciaux
	 * exemple d'utilisation : addSpecialCharset( 'Français', 'â ê î ô û' );
	 */
	function addSpecialCharset( title, chars ) {
		addSpecialCharsetHTML( title, '<span>' + mw.html.escape( chars ) + '</span>' );
	}

	mw.hook( 'CommonEdit.charsetFunctions.ready' ).fire( {
		addSpecialCharset: addSpecialCharset,
		addSpecialCharsetHTML: addSpecialCharsetHTML,
	} );

} )(); // Fermeture de la IIFE globale

//</nowiki>