Aller au contenu

Utilisateur:Ltrlg/scripts/Gadget-ResumeDeluxe.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) ;

Firefox (sur GNU/Linux) / Chrome / Internet Explorer / Opera : maintenez la touche Ctrl en cliquant sur le bouton Actualiser ou pressez Ctrl-F5.
/*
 * Résumé Deluxe
 *
 * Ajoute des commentaires de modification prédéfinis
 *
 * Auteur : Dake
 * Contributions : Pabix, Tieno, Ltrlg
 * Date de dernière révision : 17 octobre 2013
 * 
 * Dépendances :
 *  — les habituelles implicites 'mediawiki' & 'jquery' ;
 *  — 'user' (chargement du common.js).
 * 
 * {{Projet:JavaScript/Script|ResumeDeluxe}}
 */

(function(){

var
	
	/*
	 * Vérifier la présence d’un titre de section _ou_ de la chaîne
	 * 'Introduction : ' ; cette dernière est ajoutée par
	 * [[MediaWiki:Gadget-EditZeroth.js]] (avec quelques variations possibles
	 * pour ceux qui le retaperaient à la main).
	 * 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*|Introduction\s?:\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',
		'interwiki',
		'wikification',
		'image',
		'mise en page',
		'redirection',
		'relecture',
		'style',
		'revert',
		'réorganisation',
		'réponse',
		'maintenance',
		['1.0', 'évaluation Wikipédia 1.0'],
		['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,
	
	/*
	 * Objet jQuery contenant la liste de liens
	 */
	
	$liste;

/*
 * Fonction renvoyant l’intitulé d’un lien à partir de sa représentation sous
 * forme de tableau ou de chaîne.
 */

function texteDuLien(definition) {
	if( $.type(definition) == 'array' ) {
		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( $.type(definition) == 'array' ) {
		return definition[1];
	} else {
		// Soyons sûr d’avoir une chaîne de caractères.
		return definition.toString();
	}
}

/*
 * Procédure transformant l’ancien format de configuration pour la
 * compatibilité.
 */

function transformerAncienneConfiguration() {
	var i;
	if(
		// Appliqué seulement si le nouveau format n’existe pas
		$.type(window.ResumeDeluxe_liens) != 'array' &&
		// Les deux tableaux doivent exister
		$.type(window.resumedeluxeTitles) == 'array' &&
		$.type(window.resumedeluxeInputs) == 'array' &&
		// Les deux tableaux doivent avoir la même longueur
		window.resumedeluxeTitles.length == window.resumedeluxeInputs.length
	) {
		window.ResumeDeluxe_liens = [];
		for(i=0; i<window.resumedeluxeTitles.length; i++) {
			window.ResumeDeluxe_liens.push([
				window.resumedeluxeTitles[i].replace(/^.\s+/, ''),
				window.resumedeluxeInputs[i]
			]);
		}
	}
}

/*
 * 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( $.type(window.ResumeDeluxe_liens) == 'array' ) {
		listeLiens = window.ResumeDeluxe_liens
	} else {
		for(i=0; i<liensParDefaut.length; i++) {
			cle = texteDuLien(liensParDefaut[i]);
			if( liensAffiches[cle] !== false ) {
				listeLiens.push( liensParDefaut[i] );
			}
		}
	}
}

/*
 * Procedure 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 semble ne pas regarder la valeur de la chaîne ?
	$resume.change();
}

/* 
 * Fonction renvoyant un lien à partir de sa définition
 */

function $lien(definition) {
	return $('<a>')
		.text(texteDuLien(definition))
		.attr('href', '#')
		.click(function(){
			ajouterAuResume(resumeAInserer(definition));
			return false;
		})
}

/*
 * Procédure construisant la liste de liens
 */

function contruireListe() {
	var i;
	
	$cont = $('<div>').attr('id', 'ResumeDeluxe')
		.text('Messages prédéfinis\xA0: ')
		.append($lien(listeLiens[0]));
	
	for(i=1; i<listeLiens.length; i++) {
		$cont
			.append(document.createTextNode('\xA0• '))
			.append($lien(listeLiens[i]));
	}
}

/*
 * 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() {
	$(document).ready(function(){
		$('#wpSummaryLabel').before($cont);
		$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(){
		/*
		 * Parcours des boîtes de dialogue (jQuery ne parcours pas les iframes
		 * seul, il faut lui donner les racines explicitement)
		 */
		var $iframes = $([]);
		$(document.getElementsByClassName('ve-ui-frame')).each(function(){
			$iframes = $iframes.add(this.contentDocument || this.document)
		})
		
		/*
		 * Traitement : si le dialogue a été recréé, on y remet ce qu’il faut.
		 * TODO Vérifier si cette vérification est encore nécessaire.
		 */
		if( $iframes.find('#ResumeDeluxe').length < 1 ) {
			$iframes.find('#MediaWiki-summary').after($cont);
			$resume = $iframes.find('.ve-ui-mwSaveDialog-summary textarea');
		}
	});
}

/*
 * 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();
			}
			break;
		case 'view':
			demarrer_EditeurVisuel();
			break;
	}
}

/*
 * Feuille de styles, à déplacer à terme dans
 *  → [[MediaWiki:Gadget-ResumeDeluxe.css]].
 * Voir la version complète :
 *  → [[Utilisateur:Ltrlg/styles/Gadget-ResumeDeluxe.css]].
 *
 * Obsolète suite au changement de forme de la fenêtre d’enregistrement.
 * TODO Adapter la mise en forme à la nouvelle boîte de dialogue.
 */

// mw.util.addCSS('.action-view #ResumeDeluxe{line-height:1.3em;margin-left:0.5em;text-indent:-0.5em;margin-bottom:0.25em;font-size:smaller}');

/*
 * Démarrage du tout
 */

// Compatibilité avec l’ancien format de configuration
transformerAncienneConfiguration();
// Lecture des préférences
appliquerConfiguration();
// Construction de la liste des liens
contruireListe();
// Insère la liste dans l’arbre des nœuds et cherche le nœud contenant le résumé
demarrer();

})();