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 29 octobre 2023 à 21:42 et modifiée en dernier par Od1n (discuter | contributions) (ajout d'un function scope (IIFE) : plus propre, dans le cas où le ResourceLoader n'irait pas encapsuler dans un function scope). 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 mw, $, MonobookToolbar, addCharSubsetMenu, realAddSpecialCharsetHTML */
/* exported addCharSubsetMenu, realAddSpecialCharsetHTML, realAddSpecialCharset */

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

(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);

                newElements.push($a, " ");
            }

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

    $(function ($) {
        addCharSubsetMenu();
    });


    // Les deux fonctions ci-dessous ne doivent pas être contenues
    // dans des "mw.loader.using" ou autres "document ready",
    // de sorte à être définies sitôt ce fichier chargé.

    /**
     * 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>"
     */
    window.realAddSpecialCharsetHTML = function (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", "â ê î ô û");
     */
    window.realAddSpecialCharset = function (title, chars) {
        realAddSpecialCharsetHTML(title, "<span>" + mw.html.escape(chars) + "</span>");
    };

})();

//</nowiki>