/* {{Projet:JavaScript/Script|FlecheHaut}} */
/*
* Ajoute à chaque titre de section un lien de retour en haut de page
* Auteur : Marc Mongenet
* Mise à jour mediawiki 1.19 : Lgd
* Dernière révision : 25 septembre 2018
*/
/* jshint esversion: 6 */
/* globals mw, $, FlecheHaut_options */
mw.loader.using( 'user', function () {
'use strict';
var options = {
text: '↑',
title: 'Haut de page',
animate: false,
animate_duration: 1000,
};
if ( typeof FlecheHaut_options !== 'undefined' ) {
Object.assign( options, FlecheHaut_options );
}
var skin = mw.config.get( 'skin' );
mw.hook( 'wikipage.content' ).add( function ( $content ) {
var $pageContent = getPageContent( $content );
if ( !$pageContent ) {
return;
}
// see: ] and ]
// regular headings
$content.find( '.mw-heading' ).each( processRegularHeading );
// raw headings (<hN> tags in wikicode, also in special pages)
// (reminder: special pages have structure #mw-content-text > hN)
// (caution: $pageContent.find( 'h2, h3, h4, h5, h6' ) has terrible performances, it seems to analyze all children)
for ( var i = 2; i <= 6; ++i ) {
var $rawHeadings = $pageContent
.find( 'h' + i )
.not( ( _, elm ) => elm.parentNode.matches( '.mw-heading' ) );
// we also have to filter out the TOC heading <h2>...
if ( i === 2 ) {
$rawHeadings = $rawHeadings.not( '#mw-toc-heading' );
}
$rawHeadings.each( processRawHeading );
}
} );
function getPageContent( $content ) {
/*
* Sélection plus précise de l'élément avec le contenu de page,
* pour éviter l'interface de diff, l'interface de modification, le print footer...
*/
var $parserOutput = $content.find( '.mw-parser-output' );
if ( $parserOutput.length ) { // élément avec le contenu de page
return $parserOutput;
} else if ( $content.hasClass( 'mw-parser-output' ) ) { // ]
return $content;
} else if ( mw.config.get( 'wgNamespaceNumber' ) === -1 ) { // on utilise #mw-content-text pour les pages spéciales
return $content;
} else { // pas de contenu de page (notamment, pages d'historiques)
return false;
}
}
function processRegularHeading( _, mwHeading ) {
var gadgetLink = makeLink();
if ( skin !== 'minerva' ) {
var editLink = mwHeading.querySelector( '.mw-editsection' );
if ( editLink ) {
editLink.after( gadgetLink );
return;
}
}
var innerHeading = mwHeading.querySelector( 'h2, h3, h4, h5, h6' );
if ( innerHeading ) {
innerHeading.after( gadgetLink );
return;
}
// else:
// first-level heading (which should not be used, and that we do not process to improve performance),
// or unsuitable use of "mw-heading" class in wikicode
}
function processRawHeading( _, rawHeading ) {
var gadgetLink = makeLink();
rawHeading.append( gadgetLink );
}
function makeLink() {
var $link = $( '<a href="#" class="noprint">' )
.text( options.text )
.attr( 'title', options.title )
.css( {
'margin-inline-start': '0.3em',
'user-select': 'none' // jQuery se charge d'ajouter un vendor prefix si nécessaire
} )
.click( animateCallback );
return $link;
}
function animateCallback( e ) {
e.preventDefault();
if ( options.animate ) {
// c'est bien sur les deux éléments, refs https://stackoverflow.com/a/5580397
$( 'html, body' ).animate( { scrollTop: 0 }, options.animate_duration );
} else {
window.scrollTo( 0, 0 );
}
}
} );