« MediaWiki:Common.js » : différence entre les versions
Apparence
Zoom-a-decouvrir-generalise-a-toutes-les-cartes |
Exclusion-des-sous-pages-du-tirage |
||
| Ligne 53 : | Ligne 53 : | ||
( page.categories || [] ).forEach( function ( cat ) { | ( page.categories || [] ).forEach( function ( cat ) { | ||
var nom = cat.title.replace( /^Catégorie:/, '' ); | var nom = cat.title.replace( /^Catégorie:/, '' ); | ||
if ( voulues[ nom ] ) { | // les sous-pages (Conseil Municipal/…) font de piètres « à découvrir » | ||
if ( voulues[ nom ] && page.title.indexOf( '/' ) === -1 ) { | |||
voulues[ nom ].push( page.title ); | voulues[ nom ].push( page.title ); | ||
} | } | ||
Version du 14 septembre 2026 à 23:52
/* 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:/, '' );
// les sous-pages (Conseil Municipal/…) font de piètres « à découvrir »
if ( voulues[ nom ] && page.title.indexOf( '/' ) === -1 ) {
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 );
} );
} );
} );