MediaWiki:Gadget-Descriptions.js: Difference between revisions
No edit summary |
No edit summary |
||
| (One intermediate revision by the same user not shown) | |||
| Line 1: | Line 1: | ||
// | // 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() { | |||
var api = new mw.Api(), | |||
userLang = mw.config.get('wgUserLanguage') || 'en', | |||
ids = [], | |||
anchors = {}, | |||
$tooltip = $('<span>').appendTo('body'); | |||
var | // 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) { | |||
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({ | api.get({ | ||
action: 'wbgetentities', | action: 'wbgetentities', | ||
ids: | ids: chunk, | ||
props: [ 'descriptions' ], | props: ['descriptions'], | ||
languages: userLang, | languages: userLang, | ||
languagefallback: 1, | languagefallback: 1, | ||
}) | }) | ||
.done( function ( data ) { | .done(function(data) { | ||
$.each(data.entities || {}, function(id, entity) { | |||
if (!entity.descriptions[userLang] || !anchors[id]) { | |||
$.each( data.entities || {}, function ( id, entity ) { | |||
if ( !entity.descriptions[ userLang ] || !anchors[ id ] ) { | |||
return; | return; | ||
} | } | ||
// Appliquer les tooltips sur chaque lien | // Appliquer les tooltips sur chaque lien | ||
$.each( anchors[ id ], function ( i, $anchor ) { | $.each(anchors[id], function(i, $anchor) { | ||
$anchor.hover( function () { | $anchor.hover(function() { | ||
$tooltip.wbtooltip({ | $tooltip.wbtooltip({ | ||
content: $( '<span>' ).text( entity.descriptions[ userLang ].value ), | content: $('<span>').text(entity.descriptions[userLang].value), | ||
permanent: true, | permanent: true, | ||
gravity: 'nw', | gravity: 'nw', | ||
$anchor: $anchor | $anchor: $anchor | ||
}).data( 'wbtooltip' ).show(); | }).data('wbtooltip').show(); | ||
}, function () { | }, function() { | ||
$tooltip.data( 'wbtooltip' ).hide(); | $tooltip.data('wbtooltip').hide(); | ||
}); | }); | ||
}); | }); | ||
}); | }); | ||
}) | }) | ||
.fail( function ( error ) { | .fail(function(error) { | ||
// Gérer les erreurs si nécessaire, sinon ignorer | |||
}); | }); | ||
}); | }); | ||
} | |||
// 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 | |||
}); | |||
Latest revision as of 21:03, 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() {
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) {
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) {
$.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) {
// Gérer les erreurs si nécessaire, sinon ignorer
});
});
}
// 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
});