MediaWiki:Common.js

Version datée du 14 septembre 2026 à 23:51 par Joebrable (discussion | contributions) (Zoom-a-decouvrir-generalise-a-toutes-les-cartes)

Note : après avoir publié vos modifications, il se peut que vous deviez forcer le rechargement complet du cache de votre navigateur pour voir les changements.

  • Firefox / Safari : maintenez la touche Maj (Shift) en cliquant sur le bouton Actualiser ou appuyez sur Ctrl + F5 ou Ctrl + R (⌘ + R sur un Mac).
  • Google Chrome : appuyez sur Ctrl + Maj + R (⌘ + Shift + R sur un Mac).
  •  Edge : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl + F5.
/* Le JS placé ici sera chargé pour tous les utilisateurs à chaque chargement de page. */

/* « À découvrir » sur la page d'accueil : chaque carte thématique pioche une page
 * au hasard dans sa catégorie, différente à chaque visite.
 *
 * Le wikicode de chaque carte porte un encart <div class="ac-zoom" data-ac-cat="…">
 * contenant un lien statique. Ce lien reste affiché si le script échoue ou si la
 * catégorie est vide : la page fonctionne sans JavaScript, le script ne fait que
 * l'enrichir.
 *
 * Une seule requête API sert toutes les cartes : on récupère les catégories de
 * toutes les pages de l'espace principal, puis on regroupe côté navigateur.
 */
$( function () {
	if ( mw.config.get( 'wgPageName' ) !== 'Accueil' ) {
		return;
	}

	var encarts = document.querySelectorAll( '.ac-zoom[data-ac-cat]' );
	if ( !encarts.length ) {
		return;
	}

	var voulues = {};
	Array.prototype.forEach.call( encarts, function ( el ) {
		voulues[ el.getAttribute( 'data-ac-cat' ) ] = [];
	} );

	function memoire( cle, valeur ) {
		try {
			if ( valeur === undefined ) {
				return sessionStorage.getItem( 'ac-zoom-' + cle );
			}
			sessionStorage.setItem( 'ac-zoom-' + cle, valeur );
		} catch ( e ) {}
		return null;
	}

	new mw.Api().get( {
		action: 'query',
		generator: 'allpages',
		gapnamespace: 0,
		gaplimit: 500,
		gapfilterredir: 'nonredirects',
		prop: 'categories',
		cllimit: 'max',
		format: 'json',
		formatversion: 2
	} ).done( function ( data ) {
		var pages = ( data.query && data.query.pages ) || [];

		pages.forEach( function ( page ) {
			( page.categories || [] ).forEach( function ( cat ) {
				var nom = cat.title.replace( /^Catégorie:/, '' );
				if ( voulues[ nom ] ) {
					voulues[ nom ].push( page.title );
				}
			} );
		} );

		Array.prototype.forEach.call( encarts, function ( el ) {
			var nom = el.getAttribute( 'data-ac-cat' ),
				choix = voulues[ nom ] || [],
				cible = el.querySelector( '.ac-zoom-cible' );

			if ( !cible || choix.length === 0 ) {
				return;                 // on garde le lien statique
			}

			// éviter de reproposer la même page que la visite précédente
			var precedent = memoire( nom ),
				pool = choix.length > 1 ?
					choix.filter( function ( t ) { return t !== precedent; } ) :
					choix,
				titre = pool[ Math.floor( Math.random() * pool.length ) ];

			memoire( nom, titre );

			var lien = document.createElement( 'a' );
			lien.href = mw.util.getUrl( titre );
			lien.textContent = titre;
			cible.innerHTML = '';
			cible.appendChild( lien );
		} );
	} );
} );