Utilisateur:Romainhk/SuiviDeTraductionFacile.js
Apparence
(Redirigé depuis Projet:Traduction/SuiviDeTraductionFacile.js)
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./**
* SuiviDeTraductionFacile
*
* Le gadget "SuiviDeTraductionFacile" transforme le bandeau de traduction
* en un formulaire permettant de modifier la page de suivi de traduction facilement.
*
* Auteur : Romainhk
* Date de dernière révision : 8 juillet 2010
* Licence : Domaine publique
*
* Notes et TODO :
* – trouver une solution pour le retrouver les espaces de nom des articles.
* – incompatible avec le modèle « u' » (ex : Discussion:Série alternée des entiers/Traduction)
*/
//////////////////////ZONE PERSONNALISABLE//////////////////////
// Permet d'enregistrer sans passer par la fenêtre d'édition (par défaut == true)
// var suividetraductionfacile_autocommit = false;
/////////////////FIN DE LA ZONE PERSONNALISABLE/////////////////
// Lancement
if( mw.config.get('wgAction') == 'edit' ) { addOnloadHook(enEdition); }
else { addOnloadHook(surArticle); }
/* Renvoie le "ieme" fils de "pere" dont le tagName vaut "balise"
*/
function sousBaliseX(pere, balise, ieme) {
if ( pere != null ) {
if ( pere.childNodes != null ) {
var fils = pere.childNodes;
var i = 0;
var ok = 0;
while ( i < fils.length ) {
if ( fils[i].tagName == balise ) {
ok++;
if ( ok == ieme ) break;
}
i++;
}
return fils[i];
}
}
return null;
}
function premiereSousBalise(pere, balise) { return sousBaliseX(pere, balise, 1); }
/* Retourne le nom de la page de suivi associée à la page courante
* × paramètres : mw.config.get('wgPageName'), mw.config.get('wgPageName')-mw.config.get('wgTitle')
*/
function donnePageDeSuivi(page, espace) {
if ( typeof(page) == "undefined" ) page = mw.config.get('wgPageName');
var pds = page.replace(espace+':', '')
if ( typeof(espace) == "undefined" ) espace = '';
if ( espace == 'Discussion' ) espace = '';
if ( espace.length > 0 ) espace = " "+espace;
var pds = 'Discussion'+espace+':'+pds+'/Traduction';
//alert('donnePageDeSuivi :'+pds+"\n\n"+espace+"///"+page); //Mouchard
return pds;
}
/* ################################################################
# Ajout du formulaire sur le bandeau #
################################################################ */
function surArticle() {
if (document.createTextNode)
{
var index = 0;
var BandeauxTraduction = document.getElementsByTagName('div');
if (BandeauxTraduction) {
alert("Vous utilisez actuellement le gadget SuiviDeTraductionFacile.js. Son auteur (Romainhk) vous en remercie mais le monde bouge, et le Projet:Traduction aussi :). Ce gadget ne fonctionne tout simplement plus avec la nouvelle direction du projet. Pensez à modifier votre vector.js pour retirer la ligne d'importation de la page Utilisateur:Romainhk/SuiviDeTraductionFacile.js");
}
for(a=0 ; a<BandeauxTraduction.length ; a++) {
if( $(BandeauxTraduction[a]).hasClass('bandeau-traduction') ) {
var content = BandeauxTraduction[a].getElementsByClassName('NavContent')[0];
if (!content) return;
var head = BandeauxTraduction[a].getElementsByClassName('NavHead')[0];
var LienBandeau = head.getElementsByTagName('a')[1];
var ArticleFrancais = LienBandeau.title;
if ( ArticleFrancais == '(fr)' ) ArticleFrancais = head.getElementsByTagName('a')[4].title;
ArticleFrancais = ArticleFrancais.replace(/^Discussion:/, '')
ArticleFrancais = ArticleFrancais.replace(/\/Traduction$/, '')
// var EspaceArticle = '';
content.innerHTML = '<form>' + content.innerHTML + '</form>';
var form = premiereSousBalise( content, 'FORM' );
var li = premiereSousBalise( premiereSousBalise( form, 'UL' ), 'LI' );
var statut = premiereSousBalise( li, 'B' );
var plainlinks = form.getElementsByClassName('plainlinks')[0];
/* === FORMULAIRE === */
if ( form != null && li != null && plainlinks != null ) {
form.method = 'get'
form.setAttribute("style", 'vertical-align:middle; margin-left:1em; display:inline;' );
form.action = mw.config.get('wgServer') + mw.config.get('wgScript')
var hiddenTitle = document.createElement('input');
hiddenTitle.type = 'hidden'
hiddenTitle.name = 'title'
hiddenTitle.value = donnePageDeSuivi(ArticleFrancais)
form.appendChild(hiddenTitle);
var hiddenAction = document.createElement('input');
hiddenAction.type = 'hidden'
hiddenAction.name = 'action'
hiddenAction.value = 'edit'
form.appendChild(hiddenAction);
/* === STATUS === */
var select = document.createElement('select');
li.appendChild(select);
select.setAttribute("name", 'status');
select.setAttribute("style", 'vertical-align:bottom;');
var opt1 = document.createElement('option');
opt1.innerHTML = 'Demande de traduction';
opt1.value = '1';
select.appendChild(opt1);
var opt2 = document.createElement('option');
opt2.innerHTML = 'En cours de traduction';
opt2.value = '2';
select.appendChild(opt2);
var opt3 = document.createElement('option');
opt3.innerHTML = 'Demande de relecture';
opt3.value = '3';
select.appendChild(opt3);
var opt4 = document.createElement('option');
opt4.innerHTML = 'En cours de relecture';
opt4.value = '4';
select.appendChild(opt4);
var opt5 = document.createElement('option');
opt5.innerHTML = 'Traduction terminée';
opt5.value = '5';
var val_statut = 0;
select.appendChild(opt5);
switch ( $(statut).text() ) {
case 'Demande':
val_statut = 1;
opt1.selected = true; break;
case 'En cours':
val_statut = 2;
opt2.selected = true; break;
case 'À relire':
val_statut = 3;
opt3.selected = true; break;
case 'En relecture':
val_statut = 4;
opt4.selected = true; break;
case 'Terminée':
val_statut = 5;
opt5.selected = true; break;
default :
val_statut = 33;
var opt33 = document.createElement('option');
opt33.innerHTML = 'Statut illisible !!';
opt33.value = '333';
opt33.style.marginLeft = '1em';
opt33.selected = true;
select.appendChild(opt33);
var err = document.createElement('i');
err.innerHTML = 'Choisissez un autre statut.';
$(err).insertAfter(opt33);
}
li.replaceChild(select, statut);
/* === PRISE EN CHARGE === */
var labelPec = document.createElement('label');
labelPec.for = 'pecTraduction'
labelPec.setAttribute("style", 'font-style:italic; color:#8f5d3d; margin-right:1ex;');
labelPec.innerHTML = "S'ajouter comme : ";
$(labelPec).insertAfter(premiereSousBalise( form, 'UL' ));
/* ====== ... DE LA TRADUCTION ====== */
var pecTraduction = document.createElement('input');
pecTraduction.type = 'checkbox'
pecTraduction.name = 'pecTraduction'
pecTraduction.value = 'trad'
pecTraduction.setAttribute("style", 'margin-right:5px;');
$(pecTraduction).insertAfter(labelPec);
var TNpecTraduction = document.createTextNode('Traducteur');
$(TNpecTraduction).insertAfter(pecTraduction);
/* ====== ... DE LA RELECTURE ====== */
var pecRelecture = document.createElement('input');
pecRelecture.type = 'checkbox'
pecRelecture.name = 'pecRelecture'
pecRelecture.value = 'rel'
pecRelecture.setAttribute("style", 'margin-left:1em; margin-right:5px;');
$(pecRelecture).insertAfter(TNpecTraduction);
var TNpecRelecture = document.createTextNode('Relecteur');
$(TNpecRelecture).insertAfter(pecRelecture);
/* === AVANCEMENT TRADUCTION === */
var spanAvancement = premiereSousBalise( premiereSousBalise( premiereSousBalise( premiereSousBalise( form.childNodes[10], 'LI'), 'UL'), 'LI'), 'SPAN')
if ( spanAvancement && val_statut > 0 && val_statut < 5 ) {
var valeurAvancement = '0';
if ( spanAvancement.parentNode.lastChild.hasChildNodes() ) {
valeurAvancement = spanAvancement.parentNode.lastChild.firstChild.innerHTML.split('&')[0];
}
if ( valeurAvancement.search(/[0-9]{1,3}/) == -1 ) {
valeurAvancement = '0';
}
var avancementTraduction = document.createElement('input');
avancementTraduction.type = 'text'
avancementTraduction.name = 'avancementTraduction'
avancementTraduction.size = '3'
avancementTraduction.setAttribute("maxlength", '3')
avancementTraduction.value = valeurAvancement
avancementTraduction.setAttribute("style", 'vertical-align:top; margin-right:0.6ex;');
spanAvancement.parentNode.insertBefore(avancementTraduction, premiereSousBalise(spanAvancement.parentNode, 'IMG') );
}
/* === AVANCEMENT RELECTURE === */
var spanRelecture = premiereSousBalise( premiereSousBalise( premiereSousBalise( form.childNodes[10].childNodes[5], 'UL'), 'LI'), 'SPAN')
if ( spanRelecture && val_statut > 0 && val_statut < 5 ) {
var valeurAvancementRelecture = '0';
if ( spanRelecture.parentNode.lastChild.hasChildNodes() ) {
valeurAvancementRelecture = spanRelecture.parentNode.lastChild.firstChild.innerHTML.split('&')[0];
}
if ( valeurAvancementRelecture.search(/[0-9]{1,3}/) == -1 ) {
valeurAvancementRelecture = '0';
}
var avancementRelecture = document.createElement('input');
avancementRelecture.type = 'text'
avancementRelecture.name = 'avancementRelecture'
avancementRelecture.size = '3'
avancementRelecture.maxlength = '3'
avancementRelecture.value = valeurAvancementRelecture
avancementRelecture.setAttribute("style", 'vertical-align:top; margin-right:0.6ex;');
spanRelecture.parentNode.insertBefore(avancementRelecture, premiereSousBalise(spanRelecture.parentNode, 'IMG') );
}
/* === SUBMIT === */
var submit = document.createElement('input');
submit.type = 'submit'
submit.value = 'Mettre à jour les valeurs'
submit.setAttribute("style", 'vertical-align:bottom; margin:2px 2em 0 7ex; float:left;');
plainlinks.setAttribute("style", 'float:right;');
plainlinks.parentNode.insertBefore(submit, plainlinks);
index++;
}//if form && li
}
} //for a
}
}
/* ########## Structure html finale ##########
bt ('bandeau-traduction')
|->content ('NavContent')
|->form (get)
|->ul li ...
|->2 checkbox
|->hr
|->ul
|->li textarea ...
|->input button submit
|->p ('plainlinks')
*/
/* ################################################################
# Traitement du formulaire #
# (en mode édition de la page de suivi) #
################################################################ */
function enEdition(){
/* Ne rien faire mode edit + preload */
if( encodeURIComponent(document.location).search(/%26preload%3D/) != -1 ) return; // /&preload=/
if ( !mw.config.get('wgPageName').match(/Discussion.*\/Traduction/) ) return;
var diff = new Array();
var statut; var pecTraduction; var pecRelecture;
var avancementTraduction; var avancementRelecture;
/* ************ Parser ************ */
var params = document.location.search.substr(1, document.location.search.length).split('&');
var i = 0;
var tmp; var name;
while ( i < params.length ) {
tmp = params[i].split('=');
name = tmp[0];
val = tmp[1];
switch( name ) {
case 'title': case 'action': break;
case 'status':
statut = val; break;
case 'pecTraduction':
pecTraduction = val; break;
case 'pecRelecture':
pecRelecture = val; break;
case 'avancementTraduction':
avancementTraduction = val; break;
case 'avancementRelecture':
avancementRelecture = val; break;
default:
//alert('Paramètre '+name+' inconnu');
}
i++;
}
/* Vérifications sur les valeurs */
if( statut < 1 || statut > 5 ) { statut = null; }
if( avancementTraduction < 0 ) { avancementTraduction = 0; }
if( avancementTraduction > 100) { avancementTraduction = 100; }
if( avancementRelecture < 0 ) { avancementRelecture = 0; }
if( avancementRelecture > 100) { avancementRelecture = 100; }
/* ************ Modification du contenu de wpTextbox1 ************ */
var textarea = document.editform.wpTextbox1.value;
var commentaireRE = /<!--/;
try {
if ( statut != null ) {
var statusRE = /(\| *status\s*=\s*)([1-5])/;
textarea = textarea.replace(statusRE, '$1'+statut);
if( RegExp.$2 != statut) { diff.push('status'); }
}
// Prise en charge
if ( pecTraduction != null ) {
var pecTraductionRE = /\| *traducteur\s*= *([^\f\n\t\v\r]*)/;
var ligne = '';
if ( textarea.search(pecTraductionRE) != -1) {
ligne = textarea.match(pecTraductionRE)[0];
} else {
alert('Gadget-SuiviDeTraductionFacile : Impossible de trouver la ligne « |traducteur = »');
}
ligne = ligne.split('=')[0]+'= ';
if( RegExp.$1 != '' && RegExp.$1.search(commentaireRE) == -1 ) { ligne += '$1, '; }
ligne += '~'+'~'+'~';
textarea = textarea.replace(pecTraductionRE, ligne);
if ( avancementTraduction == null ) { avancementTraduction = 0; }
diff.push('traducteur');
}
if ( pecRelecture != null ) {
var pecRelectureRE = /\| *relecteur\s*= *([^\f\n\t\v\r]*)/;
var ligne = '';
if ( textarea.search(pecRelectureRE) != -1) {
ligne = textarea.match(pecRelectureRE)[0];
} else {
alert('Gadget-SuiviDeTraductionFacile : Impossible de trouver la ligne « |relecteur = »');
}
ligne = ligne.split('=')[0]+'= ';
if( RegExp.$1 != '' && RegExp.$1.search(commentaireRE) == -1 ) { ligne += '$1, '; }
ligne += '~'+'~'+'~';
textarea = textarea.replace(pecRelectureRE, ligne);
if ( avancementRelecture == null ) { avancementRelecture = 0; }
diff.push('relecteur');
}
// Avancement
if ( avancementTraduction != null ) {
var avancementTraductionRE = /(\| ?avancement_traduction\s*=[^\|\r\n\w\[]*)([0-9]{0,3})/g;
textarea = textarea.replace(avancementTraductionRE, '$1'+avancementTraduction);
if( RegExp.$2 != avancementTraduction ) { diff.push('avancement_traduction'); }
}
if ( avancementRelecture != null ) {
var avancementRelectureRE = /(\| ?avancement_relecture\s*=[^\|\r\n\w\[]*)([0-9]{0,3})/g;
textarea = textarea.replace(avancementRelectureRE, '$1'+avancementRelecture);
if( RegExp.$2 != avancementRelecture ) { diff.push('avancement_relecture'); }
}
document.editform.wpTextbox1.value = textarea;
}
catch (err) {
alert("Gadget-SuiviDeTraductionFacile : Impossible de mettre à jour les valeurs suite à l'erreur\n"+err+"\n"
+"\nVeuillez re-formatter le code de la page de suivi ou contacter Utilisateur:Romainhk");
return;
}
/* ************ Résumé wpSummary ************ */
if ( diff.length > 0 ) {
var messageDiff = 'Modification ';
if ( diff.length == 1 ) {
messageDiff += 'du champ ' + diff[0];
} else {
messageDiff += 'des champs ' + diff.join(', ');
}
messageDiff += ' par [[Utilisateur:Romainhk/SuiviDeTraductionFacile.js|Gadget-SuiviDeTraductionFacile]]';
document.editform.wpSummary.value = messageDiff;
}
/* Autocommit */
if ( typeof suividetraductionfacile_autocommit == 'undefined' || suividetraductionfacile_autocommit ) {
document.getElementById("bodyContent").style.display = "none" ;
document.editform.wpSave.click();
}
}