Note : après avoir enregistré la page, vous devrez forcer le rechargement complet du cache de votre navigateur pour voir les changements.

Mozilla / Firefox / Konqueror / Safari : maintenez la touche Majuscule (Shift) en cliquant sur le bouton Actualiser (Reload) ou pressez Maj-Ctrl-R (Cmd-R sur Apple Mac) ;

Firefox (sur GNU/Linux) / Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5.
/**
 * Ajoute rapidement {{Homon}} en tout début de page, sans confirmation ni relecture.
 * Lien discret placé dans le menu "Plus" (p-cactions), à côté des autres actions du gadget cyclisme.
 *
 * @author Claude (Anthropic) - Conversation avec Guillaumrs
 * @date Août 2026
 * @version 1.0
 */

( function () {
	'use strict';

	/***
	 * VARIABLES PERSONNALISABLES
	 */

	// Modification mineure
	if ( window.HomonBanner_MinorEdit === undefined ) {
		window.HomonBanner_MinorEdit = true;
	}
	// Balise à appliquer aux modifs
	if ( window.HomonBanner_Tag === undefined ) {
		window.HomonBanner_Tag = '';
	}

	/***
	 * VARIABLES INTERNES
	 */

	var editRunning = false;
	var editSummary = 'ajout bandeau homonymie ([[Utilisateur:Guillaumrs/HomonBanner.js|script]])';

	// Les 3 variantes du bandeau d'homonymie à détecter (n'importe laquelle suffit)
	var homonTemplateRegex = /\{\{\s*(?:Voir\s+homonymes|Homonymie|Homon)\b/i;

	function homonAlreadyPresent( content ) {
		return homonTemplateRegex.test( content );
	}

	/* Ne s'exécute qu'en mode lecture, et uniquement dans l'espace principal (articles) */
	if ( mw.config.get( 'wgAction' ) !== 'view' || mw.config.get( 'wgNamespaceNumber' ) !== 0 ) {
		return;
	}

	function notify( message, type ) {
		mw.notify( message, { type: type || 'info', tag: 'HomonBanner' } );
	}

	/***
	 * LECTURE DE LA SECTION 0
	 */

	function parseSection0( callback ) {
		var api = new mw.Api( { userAgent: 'Gadget-HomonBanner' } );
		api.get( {
			action: 'query',
			prop: 'revisions',
			titles: mw.config.get( 'wgPageName' ),
			rvprop: 'content|timestamp',
			rvsection: 0,
			formatversion: 2
		} ).done( function ( data ) {
			var page = data.query.pages[0];
			var revision = page.revisions ? page.revisions[0] : {};
			callback( {
				timestamp: revision.timestamp || '',
				content: revision.content || ''
			} );
		} ).fail( function ( e ) {
			notify( 'Erreur lors de la lecture de la page (code : ' + e + ')', 'error' );
			setEditRunning( false );
		} );
	}

	/***
	 * ÉDITION
	 */

	function setEditRunning( value ) {
		editRunning = value;
	}

	function addHomonBanner() {
		if ( editRunning ) {
			return;
		}
		setEditRunning( true );

		parseSection0( function ( parsedPage ) {
			if ( homonAlreadyPresent( parsedPage.content ) ) {
				notify( 'Un bandeau d\'homonymie ({{Homon}}, {{Homonymie}} ou {{Voir homonymes}}) semble déjà présent sur cette page.', 'warn' );
				setEditRunning( false );
				return;
			}

			var newText = '{{Homon}}\n' + parsedPage.content;

			var editRequest = {
				action: 'edit',
				title: mw.config.get( 'wgPageName' ),
				section: 0,
				text: newText,
				summary: editSummary,
				watchlist: 'nochange',
				basetimestamp: parsedPage.timestamp
			};
			if ( window.HomonBanner_MinorEdit ) {
				editRequest.minor = 1;
			}
			if ( window.HomonBanner_Tag ) {
				editRequest.tags = window.HomonBanner_Tag;
			}

			var api = new mw.Api();
			api.postWithEditToken( editRequest ).done( function () {
				window.location.reload();
			} ).fail( function ( e ) {
				notify( 'Erreur lors de l\'enregistrement (code : ' + e + ')', 'error' );
				setEditRunning( false );
			} );
		} );
	}

	/***
	 * LANCEMENT — bouton discret juste à droite du bouton vert de LiensVerif.js
	 * (icône seule, même style ; on attend l'apparition de #gp-liens-btn car
	 * LiensVerif.js peut se charger/s'exécuter après ce script)
	 */

	function injectButton() {
		if ( document.getElementById( 'gp-homon-btn' ) ) {
			return; // déjà inséré
		}

		var $refBtn = $( '#gp-liens-btn' );
		var $target;
		if ( $refBtn.length ) {
			$target = $refBtn; // sera inséré juste après
		} else {
			// LiensVerif.js absent/désactivé : on se rabat sur le titre de la page
			$target = $( '#firstHeading, .firstHeading' ).first();
			if ( !$target.length ) {
				return false;
			}
		}

		var $btn = $( '<button>', {
			id: 'gp-homon-btn',
			type: 'button',
			title: 'Ajouter {{Homon}} en début de page',
			'aria-label': 'Ajouter {{Homon}} en début de page'
		} ).css( {
			'margin-left': '0.5em',
			background: 'none',
			border: 'none',
			cursor: 'pointer',
			padding: '0',
			'vertical-align': 'middle',
			display: 'inline-flex',
			'align-items': 'center'
		} );

		var $img = $( '<img>', {
			src: 'https://commons.wikimedia.org/wiki/Special:FilePath/Blue_pog.svg',
			alt: '',
			width: 18,
			height: 18
		} ).css( 'border', 'none' );

		$btn.append( $img );
		$btn.on( 'click', function ( e ) {
			e.preventDefault();
			if ( $btn.prop( 'disabled' ) ) {
				return;
			}
			$btn.prop( 'disabled', true );
			addHomonBanner();
		} );

		if ( $refBtn.length ) {
			$refBtn.after( $btn );
		} else {
			$target.append( $btn );
		}

		return true;
	}

	mw.loader.using( 'mediawiki.util', function () {
		$( function () {
			// Vérification préalable (un seul appel API) : si {{Homon}} est déjà
			// présent, on n'affiche pas le bouton du tout.
			parseSection0( function ( parsedPage ) {
				if ( homonAlreadyPresent( parsedPage.content ) ) {
					return;
				}

				// LiensVerif.js insère son bouton de façon synchrone dans son
				// gestionnaire $(document).ready, mais l'ordre d'exécution entre
				// scripts importés n'est pas garanti : on tente immédiatement,
				// puis on patiente un peu si besoin.
				if ( injectButton() ) {
					return;
				}
				var tries = 0;
				var maxTries = 40; // ~10 secondes à 250ms
				var interval = setInterval( function () {
					tries++;
					if ( injectButton() || tries >= maxTries ) {
						clearInterval( interval );
					}
				}, 250 );
			} );
		} );
	} );

}() );