Aller au contenu

MediaWiki:Gadget-tooltipRef.js

Une page de Wikipédia, l'encyclopédie libre.
Ceci est une version archivée de cette page, en date du 18 février 2023 à 03:02 et modifiée en dernier par Od1n (discuter | contributions) (pour la modif suivante j'ai besoin d'un function scope autour de la fonction tooltipRef(), donc hop utilisation de celui du mw.loader.using()). 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.
/**
 * Accès immédiat au contenu des références et notes en bas de page
 * dans une fenêtre contextuelle.
 * auteur : https://fr.wikipedia.org/wiki/Utilisateur:Lgd
 * licence : MIT
 *
 * Utilise : https://fr.wikipedia.org/wiki/MediaWiki:Gadget-tooltipRef.css
 *
 * Paramétrage: ajouter window.tooltipRefHover = true; dans le common.js personnel
 * pour utiliser au survol plutôt qu'au clic
 *
 * {{Catégorisation JS|TooltipRef}}
 */

window.tooltipRefEnabled = true;

// pour ne pas charger en addition à [[MediaWiki:Gadget-ReferenceTooltips.js]]
if ( typeof referenceTooltipsEnabled === 'undefined' ) {

    mw.loader.using( 'user', function () {

        // si l'état est null, cela signifie que ce gadget n'est plus listé dans les définitions (ou a été renommé en oubliant de mettre à jour le nom ici)
        // si l'état est resté sur registered, cela signifie que l'utilisateur charge ce gadget autrement que par le ResourceLoader (importScript(), etc.)
        var state = mw.loader.getState( 'ext.gadget.tooltipRef' );
        if ( !state || state === 'registered' ) {
            importStylesheet( 'MediaWiki:Gadget-tooltipRef.css' );
        }

        mw.hook( 'wikipage.content' ).add( function ( $content ) {

            var backClass = '.mw-cite-backlink';
            var msg_err1 = 'Erreur : note ou référence non trouvée.';
            var msg_err2 = 'Erreur : entrée non trouvée dans la bibliographie.';
            var msg_close = 'Fermer';
            var msg_go1 = 'Aller';
            var msg_go1title = 'Aller à cette référence en fin de page';
            var msg_go2 = 'Aller à la bibliographie';
            var tooltipRefTimer = false;

            function fixId( myid ) { // replaces special characters in id name
                return '#' + $.escapeSelector( myid.substr( 1 ) );
            }
            function closeNote() {
                $content.find( '.hasnote' ).removeClass( 'hasnote' );
                $( '.tooltipRef' ).remove(); // ne se trouve pas dans le #mw-content-text, mais à la fin du <body>
            }
            function closeNoteAfterDelay() {
                tooltipRefTimer = setTimeout( closeNote, 400 );
            }
            function cancelDelayedNoteClosure() {
                clearTimeout( tooltipRefTimer );
            }

            function openNote( $ref ) {
                closeNote();
                var id = $ref.attr( 'href' );
                var $note;
                var $fallback;
                var idfix = fixId( id );
                if ( $( idfix ).length !== 0 ) {
                    $note = $( idfix ).clone();
                    // copy computed styles to clone as inline styles
                    var $links1 = $( idfix ).find( 'a.external' );
                    var $links2 = $note.find( 'a.external' );
                    $links1.each( function ( i, elm ) {
                        var computed = $( elm ).css( [ 'color', 'background-image', 'background-position', 'background-repeat', 'background-size', 'padding-right' ] );
                        $links2.eq( i ).css( computed );
                    } );
                    $note.removeAttr( 'id' ).addClass( 'tooltipRef' );
                    $note.find( backClass ).remove();
                    $note.find( '[href^="#"]' ).click( function () {
                        if ( $( this ).is( '.open' ) ) {
                            $note.find( '.subnote' ).remove();
                            $( this ).removeClass( 'open' );
                            return false;
                        }
                        $note.find( '.subnote' ).remove();
                        $note.find( '.open' ).removeClass( 'open' );
                        var id2 = $( this ).attr( 'href' );
                        var $more = $( '<a href="' + mw.html.escape( id2 ) + '">' + msg_go2 + '</a>' );
                        $more.click( closeNote );
                        var $note2;
                        id2 = fixId( id2 );
                        if ( $( id2 ).length !== 0) {
                            $note2 = $( id2 ).clone().addClass( 'subnote' ).removeAttr( 'id' );
                            var $morep = $( '<p class="more"></p>' );
                            $morep.append( $more );
                            $note2.append( $morep );
                        } else {
                            $note2 = $( '<span class="subnote">' + msg_err2 + '</span>' );
                        }
                        $note.append( $note2 );
                        $( this ).addClass( 'open' );
                        return false;
                    } );
                    $fallback = $( '<a href="' + mw.html.escape( id ) + '" class="go" title="' + msg_go1title + '">' + msg_go1 + '</a>&nbsp;' );
                    $fallback.click( closeNote );
                } else {
                    $note = $( '<li class="tooltipRef">' + msg_err1 + '</li>' );
                }
                var $link = $( '<a href="#" class="close" title="' + msg_close + '">X</a>' );
                $link.click( function () {
                    closeNote();
                    return false;
                } );
                var $span = $( '<span class="actions">&nbsp;</span>' );
                $span.prepend( $fallback ).append( $link );
                $note.prepend( $span );
                if ( typeof tooltipRefHover !== 'undefined' && tooltipRefHover ) {
                    $note.mouseover( cancelDelayedNoteClosure );
                    $note.mouseout( closeNoteAfterDelay );
                }
                $( 'body' ).append( $note );
                var offset = $ref.offset();
                $note.offset( {
                    top : offset.top + $ref.height(),
                    left: offset.left > 500 ? offset.left - $note.outerWidth() : offset.left
                } );
                $ref.addClass( 'hasnote' );
                return false;
            }

            // en cas de rechargement dynamique du contenu de la page (fonctionnalité d'aperçu rapide)
            // TODO : faire en sorte d'économiser cela dans le pageview initial
            $( '.tooltipRef' ).remove();

            if ( typeof tooltipRefHover !== 'undefined' && tooltipRefHover ) {
                $content.find( 'sup.reference > a' ).mouseenter( function () {
                    openNote( $ ( this ) );
                } );
                $content.find( 'sup.reference' ).mouseover( cancelDelayedNoteClosure );
                $content.find( 'sup.reference' ).mouseout( closeNoteAfterDelay );
                $content.find( 'sup.reference > a' ).click( function () {
                    return false;
                } );
            } else {
                $content.find( 'sup.reference > a' ).click( function () {
                    if ( $( this ).is( '.hasnote' ) ) {
                        closeNote();
                        return false;
                    }
                    openNote( $( this ) );
                    return false;
                } );
            }
        } );
    } );
}