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.
/*
***************************************************************************
** iRef - Affiche les références lors de la prévisualisation même si elles
** ne sont pas présentes dans la section éditée
** Compatibilité : MediaWiki, testé avec monobook et vector
** Support : Discussion Projet:JavaScript/Rapport de bug
** Auteurs : Arkanosis & Od1n
** Licence : MIT
**
** {{Catégorisation JS|IRef}}
*/

if ((mw.config.get('wgAction') === 'edit' || mw.config.get('wgAction') === 'submit') && typeof iRef === 'undefined') {

    window.iRef = function ($) {

        var textBox = document.getElementById('wpTextbox1');

        function cleanMark() {
            var position = textBox.scrollTop;
            textBox.value = textBox.value
                .replace(/\r\n/g, '\n') // IE 6-8
                .replace(/\n<!--\[iRef\]-->[\s\S]*<!--\[\/iRef\]-->\n/, '');
            textBox.scrollTop = position;
        }

        function getGroups(source) {
            var refs = source.match(/<ref [^>]+>/g);
            if (!refs) {
                return [];
            }
            var groups = [];
            var i, l, attrib;
            for (i = 0, l = refs.length; i < l; i++) {
                // valeur d'attribut entre double quotes
                attrib = /group *= *"([^"]+)"/.exec(refs[i]);
                if (attrib && $.inArray(attrib[1], groups) === -1) {
                    groups.push(attrib[1]);
                    continue;
                }
                // valeur d'attribut non encadrée de quotes
                attrib = /group *= *([^" >]+)/.exec(refs[i]);
                if (attrib && $.inArray(attrib[1], groups) === -1) {
                    groups.push(attrib[1]);
                }
            }
            return groups;
        }

        function buildMark(groups) {
            var mark = '\n<!--[iRef]-->== <span style="color:red">Références automatiques</span> ==\n<references />';
            var i, l;
            for (i = 0, l = groups.length; i < l; i++) {
                mark += "\n'''groupe « " + groups[i] + " » :'''\n<references group=\"" + groups[i] + '" />';
            }
            mark += '<!--[/iRef]-->\n';
            return mark;
        }

        function iRefPreview() {
            var source = textBox.value;
            if (source.indexOf('<ref') === -1) {
                return;
            }
            // Firefox réinitialise la position quand un textarea.value est modifié
            var position = textBox.scrollTop;
            source = source.replace(/\r\n/g, '\n').replace(/\n+$/, '') + '\n';
            textBox.value = source + buildMark(getGroups(source));
            textBox.scrollTop = position;
        }

        cleanMark(); // il faut toujours purger au chargement, pour le mode non ajax

        // compatibilité avec l'aperçu rapide (http://bits.wikimedia.org/skins-1.19/common/preview.js)
        // l'aperçu rapide est actuellement chargé après iRef, mais l'ordre de chargement des scripts peut changer
        $('#wpPreview').click(function () {
            if (typeof doLivePreview === 'undefined') {
                iRefPreview();
            }
        });
        $('#wpSave').click(function () {
            if (typeof doLivePreview === 'undefined') {
                cleanMark();
            }
        });
        $(mw).bind({
            'LivePreviewPrepare': iRefPreview,
            'LivePreviewDone': cleanMark
        });

        // compatibilité avec [[MediaWiki:Gadget-QPreview.js]]
        // QPreview est actuellement chargé après iRef - ce code fonctionnerait aussi avec l'autre ordre de chargement
        var jEditButtonsZone = $('#editform').find('div.editButtons');
        function iRefQPreview() {
            iRefPreview();
            qPreview();
            cleanMark();
        }
        function QPreviewOverride() {
            $('#btnQPreview')
                .removeAttr('onclick')
                .click(iRefQPreview);
            jEditButtonsZone.off('focus', '#btnQPreview', QPreviewOverride);
        }
        jEditButtonsZone.on('focus', '#btnQPreview', QPreviewOverride);
    };

    $(document).ready(iRef);

}