Note: After publishing, you may have to bypass your browser's cache to see the changes.

  • Firefox / Safari: Hold Shift while clicking Reload, or press either Ctrl-F5 or Ctrl-R (⌘-R on a Mac)
  • Google Chrome: Press Ctrl-Shift-R (⌘-Shift-R on a Mac)
  • Internet Explorer / Edge: Hold Ctrl while clicking Refresh, or press Ctrl-F5
  • Opera: Press Ctrl-F5.
// <nowiki>
/*
 * Analyser les liens de la page pour mettre en évidence les liens vers homonymie.
 *
 * Configuration : dans le [[Spécial:MaPage/common.js]],
 *   - `window.verifHomon_auto = true;` active la coloration des liens vers homonymie au chargement de la page.
 *   - `window.verifHomon_exclude = [ … ];` et `window.verifHomon_excludeParents = [ … ];` ajoutent des exclusions.
 */
/* global mw, $, alert, document */

var
	/* Dernier conteneur du contenu connu (mis à jour par le hook 'wikipage.content'). */
	$lastKnownContent = null,

	/* Exclusion directe de certains liens */
	exclude = [
		'.external', // Liens externes
		'.new', // Liens vers des pages inexistantes
		'.image' // Liens sur les images
	].concat( window.verifHomon_exclude || [] ).join( ',' ),
	
	/* Exclusion indirecte de certains liens (par les parents) */
	excludeParents = [
		'#toc', // Liens du sommaire
		'.mw-editsection', // Liens de modification de sections
		'.cachelinks', // Liens vers les archives
		'.reference', // Liens vers références
		'.renvois_vers_le_texte' // Liens de retour depuis les références
	].concat( window.verifHomon_excludeParents || [] ).join( ',' );

/*
 * Affichage d’un rapport à l’utilisateur : décompte des liens testés et des positifs.
 * Si des liens vers des homonymies sont trouvés, redirige l’utilisateur vers le premier.
 */
function report( countAll, countDisambig ) {
	var msg;
	
	/* Nombre de liens analysés */
	switch ( countAll ) {
		case 0:
			msg = 'Aucun lien analysé.';
			break;
		case 1:
			msg = 'Un lien analysé.';
			break;
		default:
			msg = countAll + ' liens analysés.';
	}
	
	msg += '\n';
	
	/* Nombre de liens vers des homonymies */
	switch ( countDisambig ) {
		case 0:
			msg += 'Aucun lien vers une page d’homonymie n’a été trouvé.';
			break;
		case 1:
			msg += 'Un lien vers une page d’homonymie a été trouvé.';
			break;
		default:
			msg += countDisambig + ' liens vers des pages d’homonymie ont été trouvés.';
	}
	
	/* Affichage du rapport */
	alert( msg );
	
	/* Redirection vers le premier positif */
	if ( countDisambig !== 0 ) {
		document.location.hash = 'disambig-0';
	}
}

/*
 * Construire la liste des liens à tester puis les tester.
 * Retourne un objet contenant la liste des liens positifs ($positive) et la liste des liens négatifs ($negative)
 */
function getLinks( $content ) {
	var
		/* Liste de tous les liens testables */
		$allLinks,
	
		/* Résultat : contient deux object jQuery, $positive et $negative */
		result = {};
	
	/* Constitution de la liste des liens à tester */
	$allLinks = $content.find( 'a:not(' + exclude + ')' )
		.filter( function () {
			return $( this ).closest( excludeParents ).length === 0;
		} );
	
	/* Constitution de la liste des liens positifs */
	result.$positive = $allLinks.filter( '.mw-disambig' ).addClass( 'verifHomon-positive' );
	
	/* Constitution de la liste des liens négatifs */
	result.$negative = $allLinks.filter( ':not(.mw-disambig)' ).addClass( 'verifHomon-negative' );
	
	return result;
}

/*
 * Tester tous les liens.
 * Ajoute des liens de navigation si plusieurs positifs ont été trouvés.
 */
function checkAll() {
	var
		links = getLinks( $lastKnownContent ),
		countPositive;
	
	$lastKnownContent.addClass( 'verifHomon-manual' );
	
	/* Numérotation des liens positifs */
	links.$positive.each( function ( i ) {
		$( this ).attr( 'id', 'disambig-' + i );
	} );
	
	/* Création des liens de navigation entre liens positifs */
	countPositive = links.$positive.length;
	if ( countPositive > 1 ) {
		links.$positive.each( function ( i ) {
			$( this )
				.before( $( '<sup>' ).html( $( '<a>' )
					.text( '⇐\xA0' )
					.attr( 'href', '#disambig-' + ( ( i === 0 ? countPositive : i ) - 1 ) )
				) )
				.after( $( '<sup>' ).html( $( '<a>' )
					.text( '\xA0⇒' )
					.attr( 'href', '#disambig-' + ( ( i + 1 ) % countPositive ) )
				) );
		} );
	}
	
	/* Affichage du rapport */
	report( countPositive + links.$negative.length, countPositive );
}

/*
 * Exécution automatique.
 */
function autoRun( $content ) {
	/* getLinks ajoute les classes, le CSS suffit à colorer */
	getLinks( $content );
}

/*
 * Exécution des tests si ceux-ci n’ont pas déjà eu lieu.
 */
function launch( evt ) {
	evt.preventDefault(); // Utilisé par un lien
	
	/* Ne pas exécuter deux fois */
	if ( ! $lastKnownContent.hasClass( 'verifHomon-manual' ) ) {
		checkAll();
	}
}

/* Exécution automatique si demandée. */
if ( window.verifHomon_auto ) {
	mw.hook( 'wikipage.content' ).add( autoRun );
}

/* Mise à jour du conteneur */
mw.hook( 'wikipage.content' ).add( function ( $content ) {
	/* Pour LivePreview : la classe n’est pas retirée du conteneur… */
	$lastKnownContent = $content.removeClass( 'verifHomon-manual' );
} );

/* Ajout d’un lien dans la boîte à outils pour le mode manuel */
$( document ).ready( function () {
	$( mw.util.addPortletLink(
		'p-tb',
		'#',
		'Vérif. homonymies',
		't-homon',
		'Vérifier les liens de cette page menant vers des pages d’homonymie'
	) ).click( launch );
} );

// </nowiki>