Utilisateur:Gratus/superVis.js

Une page de Wikipédia, l'encyclopédie libre.
Note : après avoir enregistré la page, vous devrez forcer le rechargement complet du cache de votre navigateur pour voir les changements.

Mozilla / Firefox / Konqueror / Safari : maintenez la touche Majuscule (Shift) en cliquant sur le bouton Actualiser (Reload) ou pressez Maj-Ctrl-R (Cmd-R sur Apple Mac) ;

Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5.
/***
 * @authors Gratus 0x010C
 * Fonctionne sur :
 * - bloquer
 * - protéger
 * - supprimer
 * - renommer
 * - masquage
 * Peut-être d'autres pages
 */

mw.loader.using( [ 'mediawiki.api', 'mediawiki.util' ], function() {
	var api = new mw.Api();

	/**
	 * Prépare un element input à être prévisualisé en live en lui ajoutant
	 * une boite de prévisualisation et les événements qui vont bien.
	 */
	function runElement() {
		var element = $( this ),
			outputBox = $( '<div>' ).addClass( 'GratuSuperVis' ).insertAfter( element ); //création de la zone de sortie

		//écouteur d'événement
		element.keyup( { outputBox: outputBox }, mw.util.debounce( 200, onKeyUp ) );
	}

	/**
	 * Appelé lorsque le contenu d'une input a changé.
	 * Récupère son contenu, le parse et l'affiche dans la boite de prévisualisation.
	 * 
	 * @param {Event} event informations renvoyés par le navigateur sur l'événement
	 */
	function onKeyUp( event ) {
		var summary = $( this ).val();
	
		if ( summary.match( /\[\[/ ) && summary.match( /\]\]/ ) ) {
			// on demande à l'API de parser le texte puis on affiche la réponse
			parseSummary( summary ).then( function( parsedSummary ) {
				displayParsedSummary( event.data.outputBox, false, parsedSummary );
			} );
		} else {
			 // pas besoin de parser, on peut afficher le texte directement
			displayParsedSummary( event.data.outputBox, true, summary );
		}
	}

	/***
	 * Utilisation de l'API pour parser un sommaire
	 * 
	 * @param {String} summary Contenu à parser
	 * @return {Promise} promesse renvoyant le texte parsé en résolution
	 */
	function parseSummary( summary ) {
		return api.get( { 
			action: 'parse', 
			prop: '',
			format: 'json',
			formatversion: 2,
			summary: summary
		} ).then(function( data ) {
			return data.parse.parsedsummary;
		} );
	}

	/***
	 * Affiche à l'écran
	 * 
	 * @param {JQuery} outputBox Nœud de sortie
	 * @param {boolean} sanitize Permet de filtrer avant l'affichage (failles XSS)
	 * @param {String} summary Contenu à afficher
	 **/
	function displayParsedSummary( outputBox, sanitize, summary ) {
		if ( sanitize ) {
			outputBox.text( summary );
		} else {
			outputBox.html( summary );
		}
	}

	/* attendre que la page soit totalement chargé avant d'executer le script */
	$( function() {
		var zones = $( 'input[name="wpReason-other"], input[name="mwProtect-reason"], input[name="wpReason"]' );
		zones.each( runElement );
	} );

} );