Aller au contenu

Utilisateur:Romainhk/SuiviDeTraductionFacile.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.
/**
* 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();
   }
}