User:The RedBurn/ResumeDeluxe.js

// <nowiki>/* 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). * * {{Projet:JavaScript/Script|ResumeDeluxe}} *//* 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’<input> ou le <textarea> 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èresreturn 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 $( '<a>' ).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 = $( '<ul>' ).addClass( 'hlist' ).css( {display: 'inline',margin: 0} );for ( i = 0; i < listeLiens.length; i++ ) {$li = $( '<li>' ).append( lien( listeLiens[i] ) );$ul.append( $li, ' ' ); // espace entre les <li> pour se prémunir des problèmes de sécabilité}return $( '<div>' ).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 sectionsif ( ! /[?&]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érencesappliquerConfiguration();// Insère la liste dans l’arbre des nœuds et cherche le nœud contenant le résumédemarrer();} );// </nowiki>