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