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 26 mars 2024 à 06:26 et modifiée en dernier par Od1n (discuter | contributions) (retouche). 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.
/* eslint-env browser */
/* 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 () {

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