/**
* 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.orghttps://wiki95.com/fr/Utilisateur:Lgd
* licence : MIT
*
* Utilise : https://fr.wikipedia.orghttps://wiki95.com/fr/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 à ]
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' );
}
var firstRun = true;
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( );
$links2.eq( i ).css( computed );
} );
$note.removeAttr( 'id' ).addClass( 'tooltipRef' );
$note.find( backClass ).remove();
$note.find( '' ).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> ' );
$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"> </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)
if ( !firstRun ) {
$( '.tooltipRef' ).remove();
}
firstRun = false;
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;
} );
}
} );
} );
}