MediaWiki:Gadget-CommonEdit.js

(Redirigé depuis MediaWiki:Common.js/edit.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.
/* 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__' ) // ne pas utiliser replaceAll() pour l'instant, cf. [[Spécial:Diff/219320914]]
				.trim()
				.split( ' ' )
				.map( function ( value ) {
					return value.replace( /__ESCAPED_SPACE__/g, ' ' ); // idem, ne pas utiliser replaceAll()
				} );

			// 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>