Utilisateur:Lofhi/JavascriptTest.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.
/**
 * AncreTitres
 *
 * Cette fonction fournit un lien vers une section de page en cliquant
 * sur le lien [URL] ou [[lien]] à droite du titre de section.
 *
 * Auteurs : Pabix, Phe, Bayo, Chphe, Arkanosis, Mah3110, Ash_Crow
 * {{Projet:JavaScript/Script|AncreTitres}}
 */
/* global $, mw */
/* eslint-env browser */
// <nowiki>
mw.loader.using(['mediawiki.util', 'mediawiki.notification', 'user'], function () {
    'use strict';

    $(function ($) {
        var lang = mw.config.get('wgUserLanguage'),
            messages = {
                en: {
                    'ancretitres-anchor-name': '[URL]',
                    'ancretitres-internal-link-name': '[[Link]]',
                    'ancretitres-description': 'Get an URL to this section',
                    'ancretitres-int-description': 'Get an internal link to this section',
                    'ancretitres-notif-title': 'Text copied to clipboard',
                    'ancretitres-notif-error': 'Could not copy to clipboard'
                },
                fr: {
                    'ancretitres-anchor-name': '[URL]',
                    'ancretitres-internal-link-name': '[[Lien]]',
                    'ancretitres-description': 'Obtenir une URL vers cette section',
                    'ancretitres-int-description': 'Obtenir un lien interne vers cette section',
                    'ancretitres-notif-title': 'Texte copié dans le presse-papiers',
                    'ancretitres-notif-error': 'Impossible de copier dans le presse-papiers'
                }
            },
            options = {
                afficheE: true,
                afficheI: true
            };

        mw.messages.set(messages.en);
        if (lang !== 'en' && lang in messages) {
            mw.messages.set(messages[lang]);
        }

        // https://stackoverflow.com/questions/400212/how-do-i-copy-to-the-clipboard-in-javascript/30810322#30810322
        // https://stackoverflow.com/questions/34045777/copy-to-clipboard-using-javascript-in-ios
        function copyTextToClipboard(text) {
            var textArea;

            function isOS() {
                return navigator.userAgent.match(/ipad|iphone/i);
            }

            function createTextArea(text) {
                textArea = document.createElement('textArea');
                textArea.value = text;
                document.body.appendChild(textArea);
            }

            function selectText() {
                var range,
                    selection;

                if (isOS()) {
                    range = document.createRange();
                    range.selectNodeContents(textArea);
                    selection = window.getSelection();
                    selection.removeAllRanges();
                    selection.addRange(range);
                    textArea.setSelectionRange(0, 999999);
                } else {
                    textArea.select();
                }
            }

            function copy(text) {
                createTextArea(text);
                selectText();
                document.execCommand('copy');
            }

            var copySuccess;

            try {
                copy(text);
                copySuccess = true;
            } catch (e) {
                copySuccess = false;
            }

            document.body.removeChild(textArea);

            if (copySuccess) {
                mw.notification.notify(text, { title: mw.msg('ancretitres-notif-title'), tag: 'ancretitres', type: 'info', autoHide: true });
            } else {
                mw.notification.notify(mw.msg('ancretitres-notif-error'), { tag: 'ancretitres', type: 'error', autoHide: true });
            }
        }

        if (typeof window.AncreTitres !== 'undefined') {
            Object.assign(options, window.AncreTitres);
        }

        if (!options.afficheI && !options.afficheE) {
            return;
        }

        $('span.mw-headline').each(function (_, headline) {
            var $span = $('<span>')
                .addClass('noprint ancretitres')
                .css({
                    'font-size': 'xx-small',
                    'font-weight': 'normal',
                    'user-select': 'none' // jQuery se charge d'ajouter un vendor prefix si nécessaire
                });

            if (options.afficheE) {
                var $linkE = $('<a href="#" title="' + mw.msg('ancretitres-description') + '">' + mw.msg('ancretitres-anchor-name') + '</a>').click(function (e) {
                    e.preventDefault();
                    var outputText = 'https:' + mw.config.get('wgServer') + mw.util.getUrl() + '#' + headline.id;
                    copyTextToClipboard(outputText);
                });
                $span.append(' ', $linkE);
            }

            if (options.afficheI) {
                var $linkI = $('<a href="#" title="' + mw.msg('ancretitres-int-description') + '">' + mw.msg('ancretitres-internal-link-name') + '</a>').click(function (e) {
                    e.preventDefault();
                    var escapedAnchor = headline.id
                        // escaping caractères spéciaux HTML
                        // (partiel, '"& ne sont pas escapés pour ne pas dégrader inutilement la lisibilité du lien)
                        .replace(/</g, '&lt;')
                        .replace(/>/g, '&gt;')
                        // escaping caractères spéciaux MediaWiki
                        .replace(/\[/g, '&#91;')
                        .replace(/\]/g, '&#93;')
                        .replace(/\{/g, '&#123;')
                        .replace(/\|/g, '&#124;')
                        .replace(/\}/g, '&#125;');
                    var outputText = '[[' + (mw.config.get('wgPageName') + '#' + escapedAnchor).replace(/_/g, ' ') + ']]';
                    copyTextToClipboard(outputText);
                });
                $span.append(' ', $linkI);
            }

            $(headline).parent().append($span);
        });

    });

});