Utilisateur:Maintenance gadgets/Gadget-CreerTrad.js

Remarque: après avoir sauvegardé, vous devez vider le cache de votre navigateur pour que les changements prennent effet. Mozilla, cliquez sur Actualiser (ou ctrl-r). Internet Explorer / Opera: ctrl-f5. Safari: cmd-r. Konqueror ctrl-r.

//==========================================================================================
// Création d'une page de traduction depuis un lien rouge dans une section traduction
// -----------------------------------------------------------------------------------------
// Pamputt 2013-06-13
// Inspiré de MediaWiki:Gadget-CreerFlexionFr.js développé par ArséniureDeGallium
// -----------------------------------------------------------------------------------------
//[[Catégorie:JavaScript du Wiktionnaire|CreerTrad.js]]
//==========================================================================================
// <nowiki>
if ( mw.config.get('wgNamespaceNumber') == 0 ){ CrTr_ChangerLiensRouges(); }

//--------------------------------------------------------------------------------------
// Créer les liens vers le gadget
// pour tous les liens rouges dans les infobox de classe "translations"
//--------------------------------------------------------------------------------------
function CrTr_ChangerLiensRouges(){
    var tradtbl = document.getElementsByClassName("translations");
    for (var t=0; t<tradtbl.length; t++){
        var atbl=tradtbl[t].getElementsByClassName("new");
        for (var k=0; k<atbl.length; k++){
            var trad=atbl[k].innerHTML;
            alert(trad);
            if (trad.substr(0,1)!="<"){
                atbl[k].style.backgroundColor="#77B5FE";
                atbl[k].title="cliquez pour créer " + trad + " avec le gadget";
                atbl[k].href="javascript:CrTr_CreerTrad1('" + trad + "')";
            }
        }
    }
}

//==========================================================================================
var CrTr_Mot = "";
var CrTr_Trad = "";

//--------------------------------------------------------------------------------------
// Première étape suite à clic :
// * mémoriser les graphies des mots dans les variables globales
// * requête pour obtenir le wikicode de l'article
//--------------------------------------------------------------------------------------
function CrTr_CreerTrad1(trad){

    CrTr_Mot=wgPageName.replace(/_/g," ");
    CrTr_Trad=trad;

    // requête pour obtenir le contenu de l'article
    var urlMot = mw.config.get('wgServer') + mw.config.get('wgScript') + '?title=' + encodeURIComponent(CrTr_Mot);
    CommonWikt_ajax.http({ 
        url: urlMot + '&action=raw&smaxage=0',
        onSuccess:CrTr_CreerTrad2
    });
}

//--------------------------------------------------------------------------------------
// Deuxième étape suite à clic :
// * récupération du wikicode de l'article et extraction des informations pertinentes
//--------------------------------------------------------------------------------------
function CrTr_CreerTrad2(Req,data){
 
    // récupérer le wikicode
    var codewiki=Req.responseText;
    var codesplit = codewiki.split("\n"); // séparation en lignes individuelles

    var status = "pret";
    var new_codewiki="";

    //on récupère le code de langue qui est contenu dans les balises <span>
    var codelangue = "aDefinir";

    codelangue = CrTr_Trad.substring(CrTr_Trad.indexOf("lang=\"")+6,CrTr_Trad.indexOf("\"",CrTr_Trad.indexOf("lang=\"")+6));
    if (codelangue.indexOf("lang")>0)
        codelangue = codelangue.substring(5);

    // on nettoie trad pour lui enlever les <span> qui trainent
    CrTr_Trad=CrTr_Trad.substring(CrTr_Trad.indexOf(">")+1,CrTr_Trad.lastIndexOf("<"));

    var ligne_trad=0;
    var lig_trad_trouve=false;
    var a_rechercher = codelangue+"|"+CrTr_Trad;
    var cmptDef = 0;
    var ligne_def="";

    for (var k=0; k<codesplit.length; k++){
        // on recherche la ligne où se trouve la traduction
        if(codesplit[k].indexOf(a_rechercher)>0) {
            if(lig_trad_trouve) {
                alert("Le gadget ne prend pas en charge le fait \n qu'une traduction apparaisse deux fois dans la même page.");
                status = "fini";
                break;
            }
            ligne_trad = k;
            lig_trad_trouve = true;
        }
    }
    // si on a pas trouvé la ligne de trad au premier passage, on essaie avec le paramètre « dif »
    if(lig_trad_trouve == false) {
    	a_rechercher = "|dif="+CrTr_Trad;
    	for (var k=0; k<codesplit.length; k++){
    		if(codesplit[k].indexOf(a_rechercher)>0) {
        		if(lig_trad_trouve) {
       		    	alert("Le gadget ne prend pas en charge le fait \n qu'une traduction apparaisse deux fois dans la même page.");
                	status = "fini";
                	break;
            	}
            	ligne_trad = k;
            	lig_trad_trouve = true;
        	}
    	}
    }
    

    //si une transcription est indiquée, on la récupère
    var transcription = "";
    if(codesplit[ligne_trad].indexOf("|R=")>0)
        transcription = codesplit[ligne_trad].substring(codesplit[ligne_trad].indexOf("|R=")+3,codesplit[ligne_trad].indexOf("}}",codesplit[ligne_trad].indexOf("|R=")));
    if (transcription.indexOf("|")>0)
        transcription = transcription.substring(0,transcription.indexOf("|"));
        
    //si le paramètre dif est utilisé, on récupère sa valeur
    // exemple : * {{T|he}} : {{trad+|he|מכלב|R=makhlev|dif=מַכְלֵב}} {{m}}
    var dif = "";
    if(codesplit[ligne_trad].indexOf("|dif=")>0)
        dif = codesplit[ligne_trad].substring(codesplit[ligne_trad].indexOf("|dif=")+5,codesplit[ligne_trad].indexOf("}}",codesplit[ligne_trad].indexOf("|dif=")));
    if (dif.indexOf("|")>0)
        dif = dif.substring(0,dif.indexOf("|"));


	if(dif.length>0) {
		var tmp = "|" + codelangue + "|";
		CrTr_Trad = codesplit[ligne_trad].substring(codesplit[ligne_trad].indexOf(tmp)+tmp.length,codesplit[ligne_trad].indexOf("|",codesplit[ligne_trad].indexOf(tmp)+tmp.length));
	}

    if(status!="fini") { 
        // on parcourt le code wiki de la ligne 0 
        // à la ligne où on a trouvé la traduction
        // la dernière section que l'on rencontre
        // correspond à la nature grammaticale du mot traduit

        var nature = "";
        for (var kk=0; kk<ligne_trad; kk++){
            if(/-adj-\|/.test(codesplit[kk])) { nature = "adj"; }
            if(/-adv-\|/.test(codesplit[kk])) { nature = "adv"; }
            if(/-nom-\|/.test(codesplit[kk])) { nature = "nom"; }
            if(/-verb-\|/.test(codesplit[kk]) || /-verbe-\|/.test(codesplit[kk]) || /-verb-pr-\|/.test(codesplit[kk])) { nature = "verbe"; }
            if(/-phr-\|/.test(codesplit[kk])) { nature = "phr"; }

            var diese = '#';
            var etoile = '*';
            if( codesplit[kk].charAt(0) == diese && codesplit[kk].charAt(1) != etoile) { 
                cmptDef = cmptDef+1;
                ligne_def = codesplit[kk];
            }	
        }

//s'il n'y a qu'une seule définition, on récupère un éventuel modèle de spécificité (biologie, astronomie, ...)
        var domaine = "";

        if(cmptDef==1) {
            if(ligne_def.indexOf("{{")>0) {
                domaine = ligne_def.substr(ligne_def.indexOf("{{")+2,ligne_def.indexOf("}}"));
                if(domaine.indexOf("|")>0)
                    domaine = domaine.substr(0,domaine.indexOf("|"));
            }	
        }



        // on écrit maintenant le code wiki
        new_codewiki="";
        if(codelangue=="ca")
            new_codewiki = remplir_ca(nature,CrTr_Trad,CrTr_Mot,domaine);
        else if(codelangue=="eo")
            new_codewiki = remplir_eo(nature,CrTr_Trad,CrTr_Mot,domaine);
        else if(codelangue=="es")
            new_codewiki = remplir_es(nature,CrTr_Trad,CrTr_Mot,domaine);
        else if(codelangue=="oc")
            new_codewiki = remplir_oc(nature,CrTr_Trad,CrTr_Mot,domaine);
        else
            new_codewiki = remplir_generique(codelangue,nature,CrTr_Trad,CrTr_Mot, transcription, dif, domaine);
    }

    //ouvrir la nouvelle page en édition
    var urlTrad = mw.config.get('wgServer') + mw.config.get('wgScript') + "?title=" + encodeURIComponent(CrTr_Trad);
    CommonWikt_ajax.http({ 
        url: urlTrad + "&action=edit",
        text: new_codewiki,
        onSuccess:CrTr_CreerTrad3
    });
}

//--------------------------------------------------------------------------------------
// Troisième étape suite à clic :
// * charger le code wiki dans la zone d'édition
// * rendre la main à l'utilisateur
//--------------------------------------------------------------------------------------
function CrTr_CreerTrad3(Req,data){
    var TexteFinal = data.text;
    while(document.body.firstChild){ document.body.removeChild(document.body.firstChild); }
    document.body.innerHTML = Req.responseText; 
    document.getElementById('wpTextbox1').value = TexteFinal;
    document.getElementById('wpSummary').value = "Création avec [[Aide:Gadget-CreerTrad|Gadget-CreerTrad]]";
}

//--------------------------------------------------------------------------------------
// Permet de tester si une expression est une locution
// Ça passe par la recherche d'au moins une espace
//--------------------------------------------------------------------------------------
function estUneLocution(Trad){
    if(/[ ]/.test(Trad))
        return true;
    return false;
}

//--------------------------------------------------------------------------------------
// Permet de remplir le code wiki de la nouvelle page
//--------------------------------------------------------------------------------------
function remplir_generique(codelangue,nature,CrTr_Trad,CrTr_Mot, transcription, dif, domaine) {
    var new_codewiki = "";
    new_codewiki = "== {{langue|" + codelangue + "}} ==\n";
    new_codewiki += "{{ébauche|"+ codelangue + "}}\n";
    new_codewiki += "{{-étym-}}\n";
    new_codewiki += ": {{ébauche-étym|" + codelangue + "}}\n\n";

    if(estUneLocution(CrTr_Trad))
        new_codewiki += "{{-loc";
    else
        new_codewiki += "{{";
    new_codewiki += "-" + nature + "-|" + codelangue + "}}\n";

	if(dif.length>0)
    	new_codewiki += "'''" + dif + "'''";
	else
    	new_codewiki += "'''" + CrTr_Trad + "'''";
    if(transcription.length>0)
        new_codewiki += " (" + transcription + ")";
    new_codewiki += " {{pron||" + codelangue + "}}\n";
    var motEnMaj = CrTr_Mot.charAt(0).toUpperCase() + CrTr_Mot.substring(1);
    if(domaine.length>0)
        new_codewiki += "# {{" + domaine + "|" + codelangue + "}} [[" + CrTr_Mot + "#fr|" + motEnMaj + "]].\n\n";
    else
        new_codewiki += "# [[" + CrTr_Mot + "#fr|" + motEnMaj + "]].\n\n";
    return new_codewiki;
}

function remplir_ca(nature,CrTr_Trad,CrTr_Mot,domaine) {
    var new_codewiki = "";
    new_codewiki = "== {{langue|ca}} ==\n";
    new_codewiki += "{{ébauche|ca}}\n";
    new_codewiki += "{{-étym-}}\n";
    new_codewiki += ": {{ébauche-étym|ca}}\n\n";

    if(estUneLocution(CrTr_Trad))
        new_codewiki += "{{-loc";
    else
        new_codewiki += "{{";
    new_codewiki += "-" + nature + "-|ca}}\n";

    if(nature == "nom")
        new_codewiki += "{{ca-rég|}}\n";

    new_codewiki += "'''" + CrTr_Trad + "''' {{pron||ca}}\n";

    var motEnMaj = CrTr_Mot.charAt(0).toUpperCase() + CrTr_Mot.substring(1);

    if(domaine.length>0)
        new_codewiki += "# {{" + domaine + "|ca}} [[" + CrTr_Mot + "#fr|" + motEnMaj + "]].\n\n";
    else
        new_codewiki += "# [[" + CrTr_Mot + "#fr|" + motEnMaj + "]].\n\n";
    return new_codewiki;
}

function remplir_eo(nature,CrTr_Trad,CrTr_Mot,domaine) {
    var new_codewiki = "";
    new_codewiki = "== {{langue|eo}} ==\n";
    new_codewiki += "{{ébauche|eo}}\n";
    new_codewiki += "{{-étym-}}\n";
    new_codewiki += ": {{ébauche-étym|eo}}\n\n";

    if(estUneLocution(CrTr_Trad))
        new_codewiki += "{{-loc";
    else
        new_codewiki += "{{";
    new_codewiki += "-" + nature + "-|eo}}\n";

    if(nature=="adj" || nature=="nom")
        new_codewiki += "{{eo-rég|}}\n";
    if(nature=="verbe")
        new_codewiki += "{{eo-conj|" + CrTr_Trad.substring(-1) + "}}\n";

    new_codewiki += "'''" + CrTr_Trad + "''' {{pron||eo}}\n";
    var motEnMaj = CrTr_Mot.charAt(0).toUpperCase() + CrTr_Mot.substring(1);
    if(domaine.length>0)
        new_codewiki += "# {{" + domaine + "|eo}} [[" + CrTr_Mot + "#fr|" + motEnMaj + "]].\n\n";
    else
        new_codewiki += "# [[" + CrTr_Mot + "#fr|" + motEnMaj + "]].\n\n";
    return new_codewiki;
}

function remplir_es(nature,CrTr_Trad,CrTr_Mot,domaine) {
    var new_codewiki = "";
    new_codewiki = "== {{langue|es}} ==\n";
    new_codewiki += "{{ébauche|es}}\n";
    new_codewiki += "{{-étym-}}\n";
    new_codewiki += ": {{ébauche-étym|es}}\n\n";

    if(estUneLocution(CrTr_Trad))
        new_codewiki += "{{-loc";
    else
        new_codewiki += "{{";
    new_codewiki += "-" + nature + "-|es}}\n";

    if(nature=="nom")
        new_codewiki += "{{es-rég|}}\n";

    new_codewiki += "'''" + CrTr_Trad + "''' {{pron||es}}";

    new_codewiki += "\n";
    var motEnMaj = CrTr_Mot.charAt(0).toUpperCase() + CrTr_Mot.substring(1);

    if(domaine.length>0)
        new_codewiki += "# {{" + domaine + "|es}} [[" + CrTr_Mot + "#fr|" + motEnMaj + "]].\n\n";
    else
        new_codewiki += "# [[" + CrTr_Mot + "#fr|" + motEnMaj + "]].\n\n";
    return new_codewiki;
}

function remplir_oc(nature,CrTr_Trad,CrTr_Mot,domaine) {
    var new_codewiki = "";
    new_codewiki = "== {{langue|oc}} ==\n";
    new_codewiki += "{{ébauche|oc}}\n";
    new_codewiki += "{{-étym-}}\n";
    new_codewiki += ": {{ébauche-étym|oc}}\n\n";

    if(estUneLocution(CrTr_Trad))
        new_codewiki += "{{-loc";
    else
        new_codewiki += "{{";
    new_codewiki += "-" + nature + "-|oc}}\n";

    if(nature=="adj")
        new_codewiki += "{{oc-accord-mixte|}}\n";
    if(nature=="nom")
        new_codewiki += "{{oc-rég|}}\n";

    new_codewiki += "'''" + CrTr_Trad + "''' {{pron||oc}}\n";
    var motEnMaj = CrTr_Mot.charAt(0).toUpperCase() + CrTr_Mot.substring(1);
    if(domaine.length>0)
        new_codewiki += "# {{" + domaine + "|oc}} [[" + CrTr_Mot + "#fr|" + motEnMaj + "]].\n\n";
    else
        new_codewiki += "# [[" + CrTr_Mot + "#fr|" + motEnMaj + "]].\n\n";
    return new_codewiki;
}
// </nowiki>