Aller au contenu

« MediaWiki:Common.js » : différence entre les versions

De WikiColombes
Aucun résumé des modifications
Cartes : version 3 du script
 
(7 versions intermédiaires par le même utilisateur non affichées)
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. */


/* "Zoom sur une association" aléatoire sur la page d'accueil : pioche une association
/* « À découvrir » sur la page d'accueil : chaque carte thématique pioche une page
  * différente dans [[Catégorie:Association de Colombes]] à chaque ouverture de la page,
  * au hasard dans sa catégorie, différente à chaque visite.
  * en évitant si possible de répéter celle affichée lors de la visite précédente. */
*
* 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 container = document.getElementById( 'wikicolombes-zoom-asso-content' );
 
if ( !container ) {
var encarts = document.querySelectorAll( '.ac-zoom[data-ac-cat]' );
if ( !encarts.length ) {
return;
return;
}
}


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


api.get( {
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',
list: 'categorymembers',
generator: 'allpages',
cmtitle: 'Catégorie:Association de Colombes',
gapnamespace: 0,
cmnamespace: 0,
gaplimit: 500,
cmlimit: 500,
gapfilterredir: 'nonredirects',
prop: 'categories',
cllimit: 'max',
format: 'json',
format: 'json',
formatversion: 2
formatversion: 2
} ).done( function ( data ) {
} ).done( function ( data ) {
var members = ( data.query && data.query.categorymembers ) || [];
var pages = ( data.query && data.query.pages ) || [];
if ( !members.length ) {
return;
}
 
var lastTitle = null;
try {
lastTitle = sessionStorage.getItem( 'wikicolombes-zoom-asso-last' );
} catch ( e ) {
lastTitle = null;
}


var pool = members;
pages.forEach( function ( page ) {
if ( lastTitle && members.length > 1 ) {
( page.categories || [] ).forEach( function ( cat ) {
pool = members.filter( function ( m ) {
var nom = cat.title.replace( /^Catégorie:/, '' );
return m.title !== lastTitle;
// les sous-pages (Conseil Municipal/…) font de piètres « à découvrir »
if ( voulues[ nom ] && page.title.indexOf( '/' ) === -1 ) {
voulues[ nom ].push( page.title );
}
} );
} );
}
} );


var pick = pool[ Math.floor( Math.random() * pool.length ) ];
// une page appartenant à deux catégories ne doit pas sortir sur deux cartes
var dejaSorties = [];


try {
Array.prototype.forEach.call( encarts, function ( el ) {
sessionStorage.setItem( 'wikicolombes-zoom-asso-last', pick.title );
var nom = el.getAttribute( 'data-ac-cat' ),
} catch ( e ) {}
choix = voulues[ nom ] || [],
cible = el.querySelector( '.ac-zoom-cible' );


api.get( {
if ( !cible || choix.length === 0 ) {
action: 'parse',
return;                // on garde le lien statique
page: pick.title,
prop: 'text',
section: 0,
format: 'json',
formatversion: 2
} ).done( function ( parseData ) {
var html = ( parseData.parse && parseData.parse.text ) || '';
var tmp = document.createElement( 'div' );
tmp.innerHTML = html;
var text = ( tmp.textContent || '' ).replace( /\s+/g, ' ' ).trim();
if ( text.length > 160 ) {
text = text.slice( 0, 160 ).replace( /\s+\S*$/, '' ) + '…';
}
}


while ( container.firstChild ) {
var libres = choix.filter( function ( t ) {
container.removeChild( container.firstChild );
return dejaSorties.indexOf( t ) === -1;
} );
if ( libres.length ) {
choix = libres;
}
}


var strong = document.createElement( 'strong' );
// éviter de reproposer la même page que la visite précédente
var link = document.createElement( 'a' );
var precedent = memoire( nom ),
link.href = mw.util.getUrl( pick.title );
pool = choix.length > 1 ?
link.textContent = 'L\'association ' + pick.title;
choix.filter( function ( t ) { return t !== precedent; } ) :
strong.appendChild( link );
choix,
container.appendChild( strong );
titre = pool[ Math.floor( Math.random() * pool.length ) ];
 
dejaSorties.push( titre );
memoire( nom, titre );


if ( text ) {
var lien = document.createElement( 'a' );
container.appendChild( document.createElement( 'br' ) );
lien.href = mw.util.getUrl( titre );
container.appendChild( document.createTextNode( text ) );
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' );
}
} );
} );

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' );
	}
} );