Utilisateur:Od1n/BoutonsHelpers.js

Une page de Wikipédia, l'encyclopédie libre.
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) ;

Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5.
// <nowiki>

function BoutonsHelpers($) {
    'use strict';

    //--------------------------------------------------------------------------
    //  Bricolage pour avoir un dialog en position fixed :\
    //--------------------------------------------------------------------------
    function fixedDialog($element, options) {

        var immutableOptions = {
            autoOpen: false,
            dragStop: function (event, ui) {
                var $this = $(this);
                $this.dialog('option', 'position', [ui.position.left, ui.position.top]);
                $this.data('savePosition', [ui.position.left, ui.position.top]);
            },
            resizeStop: function (event, ui) {
                var $this = $(this);
                var $doc = $(document);
                var scrollLeft = $doc.scrollLeft();
                var scrollTop = $doc.scrollTop();

                // l'ordre de ces 2 lignes est important :
                $this.dialog('option', 'position', [ui.position.left - scrollLeft * 2, ui.position.top - scrollTop * 2]);
                $this.parent().css('position', 'fixed');

                $this.data('savePosition', [ui.position.left - scrollLeft, ui.position.top - scrollTop]);
            },
            close: function () {
                var $this = $(this);
                var savePosition = $this.data('savePosition');
                if (savePosition) {
                    $this.dialog('option', 'position', savePosition);
                }
            }
        };

        options = options || {};
        var dialogOptions = Object.assign({}, options, immutableOptions);

        $element.dialog(dialogOptions);
        // l'ordre de ces 2 lignes est important :
        $element.parent().css('position', 'fixed');
        $element.dialog('open');
    }

    //--------------------------------------------------------------------------
    //  Fonctions utilitaires
    //--------------------------------------------------------------------------

    function toggleDialog($dialog) {
        $dialog.dialog($dialog.dialog('isOpen') ? 'close' : 'open');
    }

    function ucFirst(string) {
        return string.charAt(0).toUpperCase() + string.slice(1);
    }

    //--------------------------------------------------------------------------
    //  Fabriques
    //--------------------------------------------------------------------------

    function contentFactory(callback) {
        var $entree = $('<input type="text" style="box-sizing:border-box; width:100%">');
        var $sortie = $('<input type="text" style="box-sizing:border-box; width:100%">');
        var elmEntree = $entree[0];
        var elmSortie = $sortie[0];
        // cf. http://help.dottoro.com/ljhxklln.php
        $entree.on('input', function () {
            var result = callback(elmEntree.value.trim());
            elmSortie.value = (result || 'input non supporté');
        });
        return $('<div></div>').append($entree, '<br><br>', $sortie);
    }

    function buttonFactory(params) {
        var $button, $dialog;
        function initDialog() {
            $dialog = contentFactory(params.callback);
            fixedDialog($dialog, {
                title: params.titreDialog,
                width: params.largeur
            });
            $button.click(function () {
                toggleDialog($dialog);
            });
        }
        $button = $('<button type="button">' + params.titreBouton + '</button>');
        $button.one('click', function () {
            var dependencies = ['jquery.ui'];
            if (params.extraDependencies) {
                dependencies.concat(params.extraDependencies);
            }
            mw.loader.using(dependencies, initDialog); // rappel : le chargement est asynchrone
        });
        return $button;
    }

    //--------------------------------------------------------------------------
    //  Création et insertion DOM de nos boutons
    //--------------------------------------------------------------------------

    var boutonFullurl = buttonFactory({
        titreBouton: 'fullurl',
        titreDialog: 'Conversion URL brute vers {{fullurl:}}',
        largeur: 340,
        extraDependencies: 'mediawiki.util',
        callback: function (input) {
            var titre = mw.util.getParamValue('title', input);
            if (!titre) { return; }
            titre = titre.replaceAll('_', ' ');
            var debutURL = /^(?:(?:https?:)?\/\/)?([a-z]+)\.wikipedia\.org\/w\/index\.php\?/.exec(input);
            if (!debutURL) { return; }
            var prefix = (debutURL[1] === 'fr' ? '' : debutURL[1] + ':');
            var paramsGetSansTitle = input
                .replace(debutURL[0], '')
                .replace(/^title=[^&]*&?/, '')
                .replace(/&title=[^&]*/, '');
            var params = decodeURIComponent(paramsGetSansTitle)
                .replaceAll('"', '%22')
                .replaceAll('[', '%5B')
                .replaceAll(']', '%5D');
            return '{{fullurl:' + prefix + titre + '|' + params + '}}';
        }
    });

    var boutonLienModele = buttonFactory({
        titreBouton: 'lien modèle',
        titreDialog: 'Lien modèle pour résumé de modification',
        largeur: 340,
        callback: function (input) {
            var nomModele = input
                .replace(/^\{\{(.+)\}\}$/, '$1')
                .replace(/\|.*/, '')
                .replace(/^ *(?:Modèle|Template) *: */i, '')
                .trim();
            return '[[Modèle:' + ucFirst(nomModele) + '|{{' + nomModele + '}}]]';
        }
    });

    var boutonSpecialDiff = buttonFactory({
        titreBouton: 'spécial:diff',
        titreDialog: 'Lien [[Spécial:Diff]]',
        largeur: 340,
        extraDependencies: 'mediawiki.util',
        callback: function (input) {
            if (/^(\d+\/)?\d+$/.test(input)) { // "42" ou "41/42"
                return '[[Spécial:Diff/' + input + '|' + input + ']]';
            }
            if (/^(https?:)?\/\//.test(input)) { // URL entière ; refs [[mw:Manual:Parameters to index.php#View and render]]
                var diff = mw.util.getParamValue('diff', input);
                var oldid = mw.util.getParamValue('oldid', input);
                if (!diff) { return; }
                if (oldid && /^\d+$/.test(oldid)) { // oldid est un entier > 0
                    if (diff === 'prev') { // &diff=prev&oldid=42 ; on génère le wikicode pour "&diff=42" car c'est plus court
                        return '[[Spécial:Diff/' + oldid + '|' + oldid + ']]';
                    }
                    if (/^\d+$/.test(diff) || diff === 'next' || diff === 'cur') { // &diff=42/next/cur&oldid=41
                        return '[[Spécial:Diff/' + oldid + '/' + diff + '|' + oldid + '/' + diff + ']]';
                    }
                } else {
                    if (/^\d+$/.test(diff)) { // &diff=42
                        return '[[Spécial:Diff/' + diff + '|' + diff + ']]';
                    }
                }
            }
        }
    });

    $('#editform').find('.editButtons').append(boutonFullurl, boutonLienModele, boutonSpecialDiff);
}

{
    let wgAction = mw.config.get('wgAction');
    if (wgAction === 'edit' || wgAction === 'submit') {
        $(BoutonsHelpers);
    }
}

// </nowiki>