_ _    _ _____  ___   __                       
 __      _(_) | _(_)___ / ( _ ) / /_   ___ ___  _ __ ___  
 \ \ /\ / / | |/ / | |_ \ / _ \| '_ \ / __/ _ \| '_ ` _ \ 
  \ V  V /| |   <| |___) | (_) | (_) | (_| (_) | | | | | |
   \_/\_/ |_|_|\_\_|____/ \___/ \___(_)___\___/|_| |_| |_|

MediaWiki:Gadget-FlecheHaut.js

Aujourd'hui, MediaWiki:Gadget-FlecheHaut.js est un sujet d'une grande pertinence et d'un grand intérêt pour un grand nombre de personnes à travers le monde. Son impact et sa pertinence couvrent différents aspects de la vie quotidienne, de la technologie à la politique, en passant par la culture et la santé. Dans cet article, nous explorerons en profondeur MediaWiki:Gadget-FlecheHaut.js et analyserons son influence sur la société actuelle. Nous approfondirons ses causes, ses conséquences et les solutions possibles, dans le but de fournir une vision complète et objective de ce sujet très pertinent. Sans aucun doute, MediaWiki:Gadget-FlecheHaut.js est un sujet qui ne laisse personne indifférent et mérite toute notre attention et notre réflexion.
/* {{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 );
		}
	}

} );