User:OldBee/verifHomon.js
Appearance
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)
- Edge: Hold Ctrl while clicking Refresh, or 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>