MediaWiki:Gadget-verifHomon.js

Dans l'article suivant, nous explorerons MediaWiki:Gadget-verifHomon.js dans une perspective approfondie et détaillée, couvrant tous les aspects pertinents liés à ce sujet. De son histoire et de son évolution jusqu'à son impact sur la société actuelle, nous analyserons les différents points de vue et opinions d'experts sur le sujet. De plus, nous examinerons des études de cas et des exemples concrets pour illustrer leur importance et leur pertinence aujourd’hui. Avec des informations mises à jour et des données pertinentes, cet article cherche à fournir une vision complète et enrichissante de MediaWiki:Gadget-verifHomon.js, dans le but d'informer et d'éduquer nos lecteurs sur ce sujet si d'actualité aujourd'hui.
// {{Catégorisation JS|VerifHomon}}
// <nowiki>
/*
 * Analyser les liens de la page pour mettre en évidence les liens vers homonymie.
 *
 * Configuration : dans le ],
 *   - `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.
 */
/* globals mw, $ */

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
		'.mw-file-description' // Liens sur les images : nouveau markup à venir, voir ]
	].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
		'.mw-cite-backlink' // 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 );
		} );
	
	/* 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 */
mw.loader.using( 'mediawiki.util', function () {
	$( 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>