Utilisateur:Guillaumrs/HomonBanner.js
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 );
} );
} );
} );
}() );