« MediaWiki:Common.js » : différence entre les versions
m Annulation des modifications 646 de Joebrable (discussion) Balise : Annulation |
Zoom-a-decouvrir-generalise-a-toutes-les-cartes |
||
| Ligne 1 : | Ligne 1 : | ||
/* Le JS placé ici sera chargé pour tous les utilisateurs à chaque chargement de page. */ | /* 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 | ||
* différente | * 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 () { | $( function () { | ||
if ( mw.config.get( 'wgPageName' ) !== 'Accueil' ) { | if ( mw.config.get( 'wgPageName' ) !== 'Accueil' ) { | ||
return; | return; | ||
} | } | ||
var | |||
if ( ! | var encarts = document.querySelectorAll( '.ac-zoom[data-ac-cat]' ); | ||
if ( !encarts.length ) { | |||
return; | return; | ||
} | } | ||
var | 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', | action: 'query', | ||
generator: 'allpages', | |||
gapnamespace: 0, | |||
gaplimit: 500, | |||
gapfilterredir: 'nonredirects', | |||
prop: 'categories', | |||
cllimit: 'max', | |||
format: 'json', | format: 'json', | ||
formatversion: 2 | formatversion: 2 | ||
} ).done( function ( data ) { | } ).done( function ( data ) { | ||
var | 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 ); | |||
} ); | } ); | ||
} ); | } ); | ||
} ); | } ); | ||