Utilisateur:Pamputt/Gadget-CreerFlexionEn.js

Définition, traduction, prononciation, anagramme et synonyme sur le dictionnaire libre Wiktionnaire.

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 flexions en anglais depuis le lien rouge dans la page principale
// -----------------------------------------------------------------------------------------
// Pamputt 2013-06-06
// Adapté depuis CreerFlexionEn.js développé initialement par ArséniureDeGallium
// -----------------------------------------------------------------------------------------
//[[Catégorie:JavaScript du Wiktionnaire|CreerFlexionEn.js]]
//==========================================================================================

if ( mw.config.get('wgNamespaceNumber') == 0 ){ CrFlEn_ChangerLiensRouges(); }

//--------------------------------------------------------------------------------------
// Créer les liens vers le gadget
// pour tous les liens rouges dans les infobox de classe "flextable-en"
//--------------------------------------------------------------------------------------
function CrFlEn_ChangerLiensRouges(){
    var flxtbl = document.getElementsByClassName("flextable");
    for (var t=0; t<flxtbl.length; t++){
        var atbl=flxtbl[t].getElementsByClassName("new");
        for (var k=0; k<atbl.length; k++){
            var flex=atbl[k].innerHTML;
            atbl[k].style.backgroundColor="#00ff00";
            atbl[k].title="cliquez pour créer " + flex + " avec le gadget";
            atbl[k].href="javascript:CrFlEn_CreerFlexion1('" + flex + "')";
        }
    }
}

//==========================================================================================
var CrFlEn_Mot = "";
var CrFlEn_Flex = "";

//--------------------------------------------------------------------------------------
// 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 CrFlEn_CreerFlexion1(flx){

    CrFlEn_Motmw.config.get('wgPageName').replace(/_/g," ");
    CrFlEn_Flex=flx;

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

//--------------------------------------------------------------------------------------
// Deuxième étape suite à clic :
// * récupération du wikicode de l'article
// * calcul du wikicode pour la flexion
// * requête pour ouvrir la page de flexion en édition
//--------------------------------------------------------------------------------------
function CrFlEn_CreerFlexion2(Req,data){
 
    // récupérer le wikicode
    var codewiki=Req.responseText;
    var codesplit = codewiki.split("\n"); // séparation en lignes individuelles
 
    // Générer le code wiki de la nouvelle page en ne conservant que les lignes utiles
    // de l'ancienne (la page principale du mot).
    // Le principe est que l'on doit trouver dans l'ordre :
    // * une section de langue anglaise
    // ** une section de type de mot
    // *** éventuellement une boite de flexions
    // *** une ligne de forme
    // ** éventuellement une autre section de type de mot (retour récursif).
    // * Une autre section de langue arrête tout.
    var status = "wait en";
    var new_codewiki="";

    for (var k=0; k<codesplit.length; k++){

        var sec_qqq = /^==[ ]*\{\{langue/.test(codesplit[k]);
        var sec_en = /^==[ ]*\{\{langue\|en\}\}[ ]*==/.test(codesplit[k]);
        var sec_nom = /^\{\{-nom-\|/.test(codesplit[k]);
        var sec_loc_nom = /^\{\{-loc-nom-\|/.test(codesplit[k]);
        var sec_verb = /^\{\{-verb-\|/.test(codesplit[k]) || /^\{\{-verbe-\|/.test(codesplit[k]);
        var sec_loc_verb = /^\{\{-loc-verb-\|/.test(codesplit[k]) || /^\{\{-loc-verbe-\|/.test(codesplit[k]);
        var flex_box = /^{\{en\-/.test(codesplit[k]);
        var lig_frm = /^'''/.test(codesplit[k]);

        switch (status) {
            case "wait en" :
                if (sec_en) {
                    new_codewiki = codesplit[k] + "\n";
                    status="wait sec mot";
                }
                break;

            case "wait sec mot" :
                if (sec_qqq) { status="fini"; }
                if (sec_nom || sec_loc_nom) {
                    new_codewiki += codesplit[k].replace("{{-","{{-flex-") + "\n";
                    status = "wait frm nom";
                }
                if (sec_verb || sec_loc_verb) {
                    new_codewiki += codesplit[k].replace("{{-","{{-flex-") + "\n";
                    status = "wait frm verb";
                }
                break;

            case "wait frm verb" :
                if (sec_qqq) { status="fini"; }
                if (flex_box) {
                    new_codewiki += CrFlEn_Infobox(codesplit[k],CrFlEn_Mot) + "\n";
                    var infobox_lig = codesplit[k];
                }
                if (lig_frm) {
                    //on vérifie que le mot sur la ligne de forme est le même que le titre de la page
                    if(codesplit[k].indexOf(CrFlEn_Mot)==-1) {
                        alert("Le mot vedette sur la ligne de forme ne correspond pas au titre de la page.");
                    }

                    new_codewiki += codesplit[k].replace(CrFlEn_Mot,CrFlEn_Flex) + "\n";
                    

                    //*************************************************************//
                    //on cherche maintenant à traiter les différents cas possibles
                    //*en-conj-rég
                    //Si aucun de ces cas n'est trouvé alors on utilise un cas général où on laisse l'utilisateur choisir les bons termes.
                    //*************************************************************//

                    if( /en-conj-rég\|/.test(new_codewiki) )
                        new_codewiki = Flex_conj_reg(new_codewiki,CrFlEn_Mot);
                    else
                        new_codewiki += Flex_defaut(codesplit[k],CrFlEn_Mot);
                    status = "wait sec mot";
                }
                break;

            case "wait frm nom" :
                if (sec_qqq) { status="fini"; }
                if (flex_box) {
                    new_codewiki += CrFlEn_Infobox(codesplit[k],CrFlEn_Mot) + "\n";
                }
                if (lig_frm) {
                    //on vérifie que le mot sur la ligne de forme est le même que le titre de la page
                    if(codesplit[k].indexOf(CrFlEn_Mot)==-1) {
                        alert("Le mot vedette sur la ligne de forme ne correspond pas au titre de la page.");
                    }

                    new_codewiki += codesplit[k].replace(CrFlEn_Mot,CrFlEn_Flex) + "\n";
                    if( /en-nom-rég\|/.test(new_codewiki) )
                        new_codewiki = Flex_nom_reg(new_codewiki,CrFlEn_Mot);
                    else
                        new_codewiki += Flex_nom_defaut(codesplit[k],CrFlEn_Mot);
                }
                break;
        }
        if (status=="fini") { break; }  //on ne traite que l'anglais
    }

    //Par sécurité, inutile si les classes sont correctement déclarées dans les modèles
    //et que la page est correctement fichue.
    if (status=="wait en") { alert("Pas de section « anglais »."); }

    //générer clé de tri
    var cle = CommonWikt_CleTri(CrFlEn_Flex);
    if (cle != CrFlEn_Flex.toLowerCase()){ new_codewiki += "{{clé de tri|" + cle + "}}\n"; }
 
    //ouvrir la nouvelle page en édition
    var urlFlx =mw.config.get('wgServer') + mw.config.get('wgScript') + "?title=" + encodeURIComponent(CrFlEn_Flex);
    CommonWikt_ajax.http({ 
        url: urlFlx + "&action=edit",
        text: new_codewiki,
        onSuccess:CrFlEn_CreerFlexion3
    });
}

//--------------------------------------------------------------------------------------
// Troisième étape suite à clic :
// * charger le code wiki dans la zone d'édition
// * rendre la main à l'utilisateur
//--------------------------------------------------------------------------------------
function CrFlEn_CreerFlexion3(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-CreerFlexionEn|Gadget-CreerFlexionEn]]";
}

//==========================================================================================

//--------------------------------------------------------------------------------------
// Ajouter le paramètre inf=  à l'infobox
//--------------------------------------------------------------------------------------
function CrFlEn_Infobox(lig,mot){
    var p = lig.lastIndexOf("}}");
    if (p==-1) {
        alert("Les infobox avec le code sur plusieurs lignes ne sont pas gérées.");
        return lig;
    }
    if ( /en-conj-rég\|/.test(lig) ){
        return lig.substring(0,p) + "|inf=" + mot + "}}";
    }
    return lig; // pour les modèles non gérés
}

//--------------------------------------------------------------------------------------
// Patron à utiliser pour les cas non prévus
//--------------------------------------------------------------------------------------
function Flex_defaut(new_codewiki,CrFlEn_Mot){
    var tmp_codewiki=new_codewiki;
    tmp_codewiki += "# {{ébauche-déf|en}} \n\n";
    return tmp_codewiki;
}

//--------------------------------------------------------------------------------------
// Patron à utiliser pour les cas non prévus
//--------------------------------------------------------------------------------------
function Flex_nom_defaut(new_codewiki,CrFlEn_Mot){
    var tmp_codewiki=new_codewiki;
    tmp_codewiki += "# ''Pluriel de ''[[" + CrFlEn_Mot + "#en|" + CrFlEn_Mot + "]]''.''\n\n";
    return tmp_codewiki;
}

//--------------------------------------------------------------------------------------
// Gestion de en-nom-rég
//--------------------------------------------------------------------------------------
function Flex_nom_reg(new_codewiki,CrFlEn_Mot){
    var tmp_codewiki=new_codewiki;
    // on vérifie que le nom est bien régulier (qu'il se termine par un « s »)
    var pos_s   = tmp_codewiki.indexOf("s'''");

    if(pos_s>0)
        tmp_codewiki += "# ''Pluriel de ''[[" + CrFlEn_Mot + "#en|" + CrFlEn_Mot + "]]''.''\n\n";
    return tmp_codewiki;
}

//--------------------------------------------------------------------------------------
// Définition dans le cas des mots qui utilisent en-conj-rég
//--------------------------------------------------------------------------------------
function Flex_conj_reg(new_codewiki,CrFlEn_Mot){
    var tmp_codewiki=new_codewiki;
    // on cherche d'abord à quelle forme on doit s'occuper
    var pos_s   = tmp_codewiki.indexOf("s'''");
    var pos_ed  = tmp_codewiki.indexOf("ed'''");
    var pos_ing = tmp_codewiki.indexOf("ing'''"); 

    if (pos_s>0)
        tmp_codewiki += "# ''Troisième personne du singulier de l’indicatif présent du verbe ''[[" + CrFlEn_Mot + "#en|" + CrFlEn_Mot + "]]''.''\n\n";
    if (pos_ed>0) {
        tmp_codewiki += "# ''Prétérit du verbe ''[[" + CrFlEn_Mot + "#en|" + CrFlEn_Mot + "]]''.''\n";
        tmp_codewiki += "# ''Participe passé du verbe ''[[" + CrFlEn_Mot + "#en|" + CrFlEn_Mot + "]]''.''\n\n";
    }
    if (pos_ing>0)
        tmp_codewiki += "# ''Participe présent du verbe ''[[" + CrFlEn_Mot + "#en|" + CrFlEn_Mot + "]]''.''\n\n";
    return tmp_codewiki;
}