MediaWiki:Gadget-Descriptions.js: Difference between revisions

From Resistance in Belgium
No edit summary
No edit summary
Line 1: Line 1:
// Required modules: mediawiki.api, jquery.wikibase.wbtooltip
// Fonction pour diviser un tableau en sous-tableaux
function chunkArray(array, chunkSize) {
    var results = [];
    while (array.length) {
        results.push(array.splice(0, chunkSize));
    }
    return results;
}


( function ( mw, $, wb ) {
// Fonction principale
function init() {
    console.log('Gadget is running');


     // only works for items
     var api = new mw.Api(),
    if ( !mw.config.exists( 'wbEntityId' ) ) {
        userLang = mw.config.get( 'wgUserLanguage' ) || 'en',
         return;
        ids = [],
    }
        anchors = {},
         $tooltip = $( '<span>' ).appendTo( 'body' );


     function init() {
     // Sélectionner tous les liens avec des entités dans les statements
         console.log('Gadget is running');
    $( '.wikibase-statementgroupview a[href^="/wiki/"]' ).each( function () {
         var $anchor = $( this ),
            id = $anchor.attr( 'href' ).replace( /.*Item:(Q\d+)/, '$1' ).replace( /.*Property:(P\d+)/, '$1' );
       
        if ( id.indexOf( 'Q' ) !== 0 && id.indexOf( 'P' ) !== 0 ) {
            return;
        }


         var api = new mw.Api(),
         ids.push( id );
             userLang = mw.config.get( 'wgUserLanguage' ) || 'en',
        if ( anchors[ id ] ) {
             ids = [],
             anchors[ id ].push( $anchor );
            anchors = {},
        } else {
            $tooltip = $( '<span>' ).appendTo( 'body' );
             anchors[ id ] = [ $anchor ];
        }
    });


        // Sélectionner tous les liens avec des entités dans les statements
    if ( ids.length === 0 ) {
        $( '.wikibase-statementgroupview a[href^="/wiki/"]' ).each( function () {
        console.log('No entity IDs found.');
            var $anchor = $( this ),
        return;
                id = $anchor.attr( 'href' ).replace( /.*Item:(Q\d+)/, '$1' ).replace( /.*Property:(P\d+)/, '$1' );
    }
           
            if ( id.indexOf( 'Q' ) !== 0 && id.indexOf( 'P' ) !== 0 ) {
                return;
            }


            ids.push( id );
    // Fractionner les IDs en lots de 50 entités
            if ( anchors[ id ] ) {
    var chunks = chunkArray(ids.slice(), 50);
                anchors[ id ].push( $anchor );
            } else {
                anchors[ id ] = [ $anchor ];
            }
        });


        if ( ids.length === 0 ) {
    // Pour chaque lot, faire une requête API
            console.log('No entity IDs found.');
    chunks.forEach(function(chunk) {
            return;
        }
 
        // Appel à l'API pour obtenir les descriptions des entités
         api.get({
         api.get({
             action: 'wbgetentities',
             action: 'wbgetentities',
             ids: ids,
             ids: chunk,
             props: [ 'descriptions' ],
             props: [ 'descriptions' ],
             languages: userLang,
             languages: userLang,
Line 73: Line 78:
             console.log('Error fetching entity descriptions:', error);
             console.log('Error fetching entity descriptions:', error);
         });
         });
    }
    // Charger les dépendances avant d'exécuter le script
    mw.loader.using(['mediawiki.api', 'jquery.wikibase.wbtooltip'], function () {
        $( init );  // Initialiser une fois les modules chargés
     });
     });
}


} ( mediaWiki, jQuery, wikibase ) );
// Charger les dépendances avant d'exécuter le script
mw.loader.using(['mediawiki.api', 'jquery.wikibase.wbtooltip'], function () {
    $( init );  // Initialiser une fois les modules chargés
});

Revision as of 20:59, 9 October 2024

// Fonction pour diviser un tableau en sous-tableaux
function chunkArray(array, chunkSize) {
    var results = [];
    while (array.length) {
        results.push(array.splice(0, chunkSize));
    }
    return results;
}

// Fonction principale
function init() {
    console.log('Gadget is running');

    var api = new mw.Api(),
        userLang = mw.config.get( 'wgUserLanguage' ) || 'en',
        ids = [],
        anchors = {},
        $tooltip = $( '<span>' ).appendTo( 'body' );

    // Sélectionner tous les liens avec des entités dans les statements
    $( '.wikibase-statementgroupview a[href^="/wiki/"]' ).each( function () {
        var $anchor = $( this ),
            id = $anchor.attr( 'href' ).replace( /.*Item:(Q\d+)/, '$1' ).replace( /.*Property:(P\d+)/, '$1' );
        
        if ( id.indexOf( 'Q' ) !== 0 && id.indexOf( 'P' ) !== 0 ) {
            return;
        }

        ids.push( id );
        if ( anchors[ id ] ) {
            anchors[ id ].push( $anchor );
        } else {
            anchors[ id ] = [ $anchor ];
        }
    });

    if ( ids.length === 0 ) {
        console.log('No entity IDs found.');
        return;
    }

    // Fractionner les IDs en lots de 50 entités
    var chunks = chunkArray(ids.slice(), 50);

    // Pour chaque lot, faire une requête API
    chunks.forEach(function(chunk) {
        api.get({
            action: 'wbgetentities',
            ids: chunk,
            props: [ 'descriptions' ],
            languages: userLang,
            languagefallback: 1,
        })
        .done( function ( data ) {
            console.log('API response for anonymous users:', data);

            $.each( data.entities || {}, function ( id, entity ) {
                if ( !entity.descriptions[ userLang ] || !anchors[ id ] ) {
                    return;
                }

                // Appliquer les tooltips sur chaque lien
                $.each( anchors[ id ], function ( i, $anchor ) {
                    $anchor.hover( function () {
                        $tooltip.wbtooltip({
                            content: $( '<span>' ).text( entity.descriptions[ userLang ].value ),
                            permanent: true,
                            gravity: 'nw',
                            $anchor: $anchor
                        }).data( 'wbtooltip' ).show();
                    }, function () {
                        $tooltip.data( 'wbtooltip' ).hide();
                    });
                });
            });
        })
        .fail( function ( error ) {
            console.log('Error fetching entity descriptions:', error);
        });
    });
}

// Charger les dépendances avant d'exécuter le script
mw.loader.using(['mediawiki.api', 'jquery.wikibase.wbtooltip'], function () {
    $( init );  // Initialiser une fois les modules chargés
});