« MediaWiki:Common.js » : différence entre les versions
Apparence
Cartes : numero de version dans l URL du script, pour diffuser la mise a jour sans attendre le cache |
Cartes : version 3 du script |
||
| Ligne 103 : | Ligne 103 : | ||
mw.hook( 'wikipage.content' ).add( function ( $contenu ) { | mw.hook( 'wikipage.content' ).add( function ( $contenu ) { | ||
if ( !mw.carteOsm && $contenu && $contenu[ 0 ] && $contenu[ 0 ].querySelector( '.carte-osm' ) ) { | if ( !mw.carteOsm && $contenu && $contenu[ 0 ] && $contenu[ 0 ].querySelector( '.carte-osm' ) ) { | ||
mw.loader.load( mw.config.get( 'wgScript' ) + '?title=MediaWiki:Carte-osm.js&action=raw&ctype=text/javascript&v= | mw.loader.load( mw.config.get( 'wgScript' ) + '?title=MediaWiki:Carte-osm.js&action=raw&ctype=text/javascript&v=3' ); | ||
} | } | ||
} ); | } ); | ||
Dernière version du 29 septembre 2026 à 22:22
/* 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 );
}
} );
} );
// une page appartenant à deux catégories ne doit pas sortir sur deux cartes
var dejaSorties = [];
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
}
var libres = choix.filter( function ( t ) {
return dejaSorties.indexOf( t ) === -1;
} );
if ( libres.length ) {
choix = libres;
}
// é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 ) ];
dejaSorties.push( titre );
memoire( nom, titre );
var lien = document.createElement( 'a' );
lien.href = mw.util.getUrl( titre );
lien.textContent = titre;
cible.innerHTML = '';
cible.appendChild( lien );
} );
} );
} );
/* Cartes OpenStreetMap ({{Carte OSM}}, {{Point carte}}) : le code est dans
* MediaWiki:Carte-osm.js et ne se charge que sur les pages qui contiennent une carte.
* Le crochet wikipage.content couvre aussi l'aperçu d'une modification. */
mw.hook( 'wikipage.content' ).add( function ( $contenu ) {
if ( !mw.carteOsm && $contenu && $contenu[ 0 ] && $contenu[ 0 ].querySelector( '.carte-osm' ) ) {
mw.loader.load( mw.config.get( 'wgScript' ) + '?title=MediaWiki:Carte-osm.js&action=raw&ctype=text/javascript&v=3' );
}
} );