User:The RedBurn/ResumeDeluxe.js

// /* Résumé Deluxe. * * Ajoute des commentaires de modification prédéfinis * * Auteur : Dake * Contributions : Pabix, Tieno, Ltrlg * * Dépendances : * — les habituelles implicites 'mediawiki' & 'jquery' ; * — 'user' (chargement du common.js). * * */

/* globals window, $, document, mw, ve */ mw.loader.load( '/w/index.php?title=Template:Hlist/styles.css&action=raw&ctype=text/css', 'text/css' ); mw.loader.using( 'user', function {	'use strict';

var /* Vérifier la présence d’un titre de section. * Cela permet de n’ajouter un séparateur ' ; ' entre deux résumés que si * nécessaire. * Note : on ne vérifie que le fait que le motif est en fin de chaîne, pas * en début. */		sansPointVirgule = /\*\/\s*$/,

/* La liste des liens qui seront affichés. * Les éléments du tableau sont d’une des deux formes suivantes : *  — [ 'lien', 'resume' ] *  — 'texte' * où 'lien' représente l’intitulé du lien, 'resume' le résumé d’édition * inséré par le lien et 'texte' les deux à la fois. */		listeLiens = [],

/* Liens affichés par défaut, même format que listeLiens. */		liensParDefaut = [ 'orthographe', 'typographie', 'catégorisation', 'wikification', 'image', 'mise en forme', 'mise en page', 'redirection', 'relecture', 'style', 'revert', 'réorganisation', 'réponse', 'maintenance', [ 'homonymie', 'création homonymie' ], [ 'bandeau', 'ajout de bandeau' ], 'infobox', 'références', 'retouche de la modification précédente' ],

/* Objet permettant de désactiver des liens (parmi la liste par défaut		 * ci-avant), sous la forme { 'lien1': false, 'lien2': false, … } où * 'lien1', 'lien2'… est l’intitulé du lien à ne pas afficher. */		liensAffiches = window.ResumeDeluxe_affiches || {},

/* Objet jQuery contenant l’ ou le constituant le résumé. */		$resume;

/* Fonction renvoyant l’intitulé d’un lien à partir de sa représentation sous * forme de tableau ou de chaîne. */	function texteDuLien( definition ) { if ( Array.isArray( definition ) ) { return definition[0]; } else { // Soyons sûr d’avoir une chaîne de caractères return definition.toString; }	}

/* Fonction renvoyant le texte ajouté par un lien à partir de sa représentation * sous forme de tableau ou de chaîne. */	function resumeAInserer( definition ) { if ( Array.isArray( definition ) ) { return definition[1]; } else { // Soyons sûr d’avoir une chaîne de caractères. return definition.toString; }	}

/* Procédure appliquant les préférences de l’utilisateur : *  — si l’utilisateur a défini window.ResumeDeluxe_liens, celui-ci est utilisé *    à la place de la liste par défaut liensParDefaut ; *  — sinon si l’utilisateur a défini window.ResumeDeluxe_affiches, les règles *    de désactivation sont appliquées ; *  — sinon liensAffiches est un objet vide, donc la liste par défaut est *    utilisée. */	function appliquerConfiguration { var i, cle;

if ( Array.isArray( window.ResumeDeluxe_liens ) ) { listeLiens = window.ResumeDeluxe_liens; } else { for ( i = 0; i < liensParDefaut.length; i++ ) { cle = texteDuLien( liensParDefaut[i] ); if ( liensAffiches[cle] !== false ) { listeLiens.push( liensParDefaut[i] ); }			}		}	}

/* Procédure effectuant l’ajout d’une chaîne au résumé d’édition, avec un	 * séparateur si besoin */	function ajouterAuResume( chaine ) { var resumeActuel = $resume.val; if ( resumeActuel === '' ) { $resume.val( chaine ); } else if ( sansPointVirgule.test( resumeActuel ) ) { $resume.val( resumeActuel + chaine ); } else { $resume.val( resumeActuel + '; ' + chaine ); }

// L’ÉditeurVisuel ne se base plus sur le contenu mais sur l’évènement $resume.change;

// Conserver le focus sur le lien est inutile à l’utilisateur // Plaçons-le sur le champ de résumé, s’il veut compléter à la main $resume.focus; }

/* Fonction renvoyant un lien à partir de sa définition. */	function lien( definition ) { var resume = resumeAInserer( definition ); return $( '' ) .text( texteDuLien( definition ) ) .attr( {				href: '#',				title: 'Ajouter «\xA0' + resume + '\xA0» au résumé de modification'			} ) .click( function ( e ) {				e.preventDefault;				ajouterAuResume( resume );			} ); }

/* Fonction construisant et renvoyant la liste de liens. */	function construireListe { var i, $ul, $li;

$ul = $( '' ) .addClass( 'hlist' ) .css( {				display: 'inline',				margin: 0			} );

for ( i = 0; i < listeLiens.length; i++ ) { $li = $( '' ).append( lien( listeLiens[i] ) ); $ul.append( $li, ' ' ); // espace entre les  pour se prémunir des problèmes de sécabilité }

return $( ' ' ) .attr( 'id', 'ResumeDeluxe' ) .addClass( 'liste-horizontale' ) .text( 'Messages prédéfinis\xA0: ' ) .append( $ul ); }

/* Procédure initialisant $resume et insérant la liste de liens dans le cas de * l’éditeur de wikicode, quand les nœuds nécessaires sont en place. */	function demarrer_wikicode { $( function ( $ ) {			$( '#wpSummaryLabel' ).before( construireListe );			$resume = $( '#wpSummary' );		} ); }

/* Procédure initialisant $resume et insérant la liste de liens dans le cas de * l’ÉditeurVisuel, quand les nœuds nécessaires sont en place. */	function demarrer_EditeurVisuel { mw.hook( 've.saveDialog.stateChanged' ).add( function {			/*			 * Lorsque le dialogue est créé (ou a été supprimé puis recréé), on y met ce qu’il faut.			 */			if ( $( '#ResumeDeluxe' ).length < 1 ) {				ve.init.target.saveDialog.$editSummaryLabel.after( construireListe );				$resume = ve.init.target.saveDialog.editSummaryInput.$input;			}		} ); }

/* Procédure qui détermine quel éditeur peut être utilisé et démarre le gadget * selon le résultat. */	function demarrer { switch ( mw.config.get( 'wgAction' ) ) { case 'edit': case 'submit': // Désactivé pour la création de sections if ( ! /[?&]section=new(&|$)/.test( document.location.search ) ) { demarrer_wikicode; }				// L’EV peut démarrer de ces modes sans rechargement /* falls through */ case 'view': demarrer_EditeurVisuel; break; }	}

/***** Démarrage du tout *****/

// Lecture des préférences appliquerConfiguration;

// Insère la liste dans l’arbre des nœuds et cherche le nœud contenant le résumé demarrer;

} ); //