Utilisateur:Pamputt/Gadget-CreerFlexionEs.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 espagnol depuis le lien rouge dans la page principale
// -----------------------------------------------------------------------------------------
// Pamputt 2017-11-19
// À partir de MediaWiki:Gadget-CreerFlexionFr.js
// -----------------------------------------------------------------------------------------
//[[Catégorie:JavaScript du Wiktionnaire|CreerFlexionEs.js]]
//==========================================================================================
 
if ( mw.config.get('wgNamespaceNumber') === 0 ){ CrFlEs_ChangerLiensRouges(); }
 
//--------------------------------------------------------------------------------------
// Créer les liens vers le gadget
// pour tous les liens rouges dans les infobox de classe "flextable-es-mfsp"
//--------------------------------------------------------------------------------------
function CrFlEs_ChangerLiensRouges(){
	var genre_pagename;
	// genre du mot de la page courante ? On cherche le mot en gras dans la boite de flexions
	var flextable_vedette = $('.flextable-es-mfsp .selflink').length;
	if ( flextable_vedette && $('.flextable-es-mfsp .selflink').first().parents('.flextable-es-m').length ) {
		genre_pagename = 'm';
	} else if ( flextable_vedette && $('.flextable-es-mfsp .selflink').first().parents('.flextable-es-f').length ) {
		genre_pagename = 'f';
	}
	$(".flextable-es-mfsp .new").each(function() {
		var flex = $(this).text();
		// Une boite de flexions pour noms communs contient deux lemmes différents :
		// celui au masculin et au féminin : on ne colore dans ce cas que les formes
		// du genre correspondant au nom de la page
		var isNomCommun = false;
		var typeDeMot = $(this).parents('.flextable-es-mfsp').prevAll('h3').first()
		                .find('.titredef').text();
		if ( typeDeMot == 'Nom commun' || typeDeMot == 'Locution nominale' ) {
			isNomCommun = true;
		}
		// genre du mot en lien rouge ?
		var genre_lien_rouge;
		if ( $(this).parents('.flextable-es-m').length ) {
			genre_lien_rouge = 'm';
		} else if ( $(this).parents('.flextable-es-f').length ) {
			genre_lien_rouge = 'f';
		}
		// On ne surligne pas les liens qui ne sont pas des flexions du mot courant
		// genre_pagename est undefined dans le cas de es-rég, où le genre n'est pas indiqué dans le table de flex
		if (isNomCommun && (genre_lien_rouge != genre_pagename && genre_pagename !== undefined)) {
			return;
		}
		// sinon on surligne
		$(this).css('background-color','#00ff00');
		$(this).prop('title', 'Cliquez pour créer « ' + flex + ' » avec le gadget');
		$(this).click(function(e) {
			e.preventDefault();
			CrFlEs_CreerFlexion1( flex.replace(/ /g, ' ') );
		});
    });
}
 
//==========================================================================================
var CrFlEs_Mot = "";
var CrFlEs_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 CrFlEs_CreerFlexion1(flx){
 
    CrFlEs_Mot = mw.config.get('wgPageName').replace(/_/g," ");
    CrFlEs_Flex = flx;
 
    // requête pour obtenir le contenu de l'article
    var urlMot =mw.config.get('wgServer') + mw.config.get('wgScript') + '?title=' + encodeURIComponent(CrFlEs_Mot);
    CommonWikt_ajax.http({ 
        url: urlMot + '&action=raw',
        onSuccess:CrFlEs_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 CrFlEs_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 espagnole
    // ** 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 es";
    var flex = false;
    var new_codewiki="";
    var mot_inv = false;
    var nouvelleSyntaxe = false;
    var k;
    var pos;
 
    //on recherche si {{es-inv}} est present, auquel cas on ne creera pas la section de nom commun
    for (k=0; k<codesplit.length; k++) {
        mot_inv = /^{\{es\-inv/.test(codesplit[k]);
        if(mot_inv) 
            break;
        if(codesplit[k].indexOf("msing")>0) {
            mot_inv = true;
            break;
        }
    }
 
    for (k=0; k<codesplit.length; k++){
 
        var sec_qqq = /^==[ ]*\{\{langue/.test(codesplit[k]);
        var sec_es = /^==[ ]*\{\{langue\|es\}\}[ ]*==/.test(codesplit[k]);
        var sec_flex = /\|flexion\}\}/.test(codesplit[k]);
        var sec_adj = /^=== *\{\{S\|(adj|adjectif)\|/.test(codesplit[k]);
        var sec_nom = /^===[ ]*\{\{S\|nom\|/.test(codesplit[k]);
        var flex_box = /^{\{es\-/.test(codesplit[k]);
        var lig_frm = /^'''/.test(codesplit[k]);
 
        if(sec_adj || sec_nom)
        	nouvelleSyntaxe = true;
 
 		if(nouvelleSyntaxe===false) {
        	sec_flex = /^\{\{-flex-/.test(codesplit[k]);
        	sec_adj = /-adj-\|/.test(codesplit[k]);
        	sec_nom = /-nom-\|/.test(codesplit[k]);
 		}
 
        switch (status) {
            case "wait es" :
                if (sec_es) {
                    new_codewiki = codesplit[k] + "\n";
                    status="wait sec mot";
                }
                break;
 
            case "wait sec mot" :
                if (sec_qqq) { status="fini"; }
                if (sec_flex) { flex = true; }
                if (sec_adj) {
                    if (flex)
                        new_codewiki += codesplit[k] + "\n";
                    else
                    	if(nouvelleSyntaxe)
                        	new_codewiki += codesplit[k].replace(/es(\|num=\d)?}}/,"es|flexion$1}}") + "\n";
                        else
                        	new_codewiki += "=== {{S|adjectif|es|flexion}} ===\n";
                    status = "wait frm adj";
                }
                if (sec_nom && !mot_inv) {
                    if (flex)
                        new_codewiki += codesplit[k] + "\n";
                    else
                    	if(nouvelleSyntaxe)
                        	new_codewiki += codesplit[k].replace(/es(\|num=\d)?}}/,"es|flexion$1}}") + "\n";
                        else
                        	new_codewiki += "=== {{S|nom|es|flexion}} ===\n";
                    status = "wait frm nom";
                }
                break;
 
            case "wait frm adj" :
            	var infobox_lig;
                if (sec_qqq) { status="fini"; }
                if (flex_box) {
                    new_codewiki += CrFlEs_Infobox(codesplit[k],CrFlEs_Mot) + "\n";
                    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(CrFlEs_Mot) == -1) {
                        alert("Le mot vedette sur la ligne de forme ne correspond pas au titre de la page.");
                    }
 
                    new_codewiki += codesplit[k].replace(CrFlEs_Mot,CrFlEs_Flex).replace("{{m}}","").replace("{{f}}","").replace("{{sp}}","") + "\n";

                    var frm_principale = CrFlEs_Mot;
                    if (flex) {
                        //on essaie de récupérer la forme principale
                        //depuis l'infobox en cherchant « |s= » ou « |ms= »
                        //si on ne l'a pas trouvé, alors on la « devine »
                        var trouve = false;
                        pos = infobox_lig.indexOf("|s=");
                        if( pos>0 ) {
                            frm_principale = infobox_lig.substring(pos+3,infobox_lig.indexOf("}}",pos)); 
                            trouve = true;
                        }
                        pos = infobox_lig.indexOf("|ms=");
                        if (pos>0 && trouve === false) {
                            frm_principale = infobox_lig.substring(pos+4,infobox_lig.indexOf("}}",pos)); 
                            trouve = true;
                        }
                        //si on n'a pas trouvé, alors il s'agit de l'un de ces modèles
                        //*es-accord-oa
                        if(trouve===false) {
                            var radical = infobox_lig.substring(infobox_lig.indexOf("|")+1,infobox_lig.indexOf("|",infobox_lig.indexOf("|")+1));
                            var suf = infobox_lig.substring(infobox_lig.indexOf("es-accord-")+10,infobox_lig.indexOf("|"));
                            frm_principale =  radical + suf;
                            trouve = true;
                        }

                        flex = false;
                    }
                    
                    //*************************************************************//
                    //on cherche maintenant à traiter les différents cas possibles
                    //*es-accord-oa
                    //*es-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( /es-accord-oa\|/.test(new_codewiki) )
                        new_codewiki = Flex_oa(new_codewiki,frm_principale);
                    else if( /es-accord-oa2\|/.test(new_codewiki) )
                        new_codewiki = Flex_oa(new_codewiki,frm_principale);
                    else if( /es-rég\|/.test(new_codewiki) )
                        new_codewiki = Flex_reg2(new_codewiki,CrFlEs_Mot);
                    else
                        new_codewiki += Flex_standard(codesplit[k],CrFlEs_Mot);

                    status = "wait sec mot";
                }
                break;
 
            case "wait frm nom" :
                if (sec_qqq) { status="fini"; }
                if (flex_box) {
                    new_codewiki += CrFlEs_Infobox(codesplit[k],CrFlEs_Mot) + "\n";
                }
                if (lig_frm) {
                    pos = codesplit[k].indexOf("|équiv=");
                    // on cherche si le paramètre "équiv" est utilisé. S'il l'est alors on ne garde que 
                    // le début de la ligne de forme et on rajoute "}}" pour ne garder que {{m}} ou {{f}}
                    if( pos>0 )
                        codesplit[k] = codesplit[k].substring(0, pos) + codesplit[k].substring(codesplit[k].indexOf("}}",pos)); 
 
                    //remplacement par la flexion
                    var lfm = codesplit[k].replace(CrFlEs_Mot,CrFlEs_Flex);
                    //détection du modèle m/f/mf/fm, avec paramètres éventuels ignorés (ils seront supprimés)
                    var chc = lfm.match( /\{\{(m|f|mf|fm|mf\?)\s*(?:\|[^\}]*)?\}\}/ );
                    //si trouvé, garde le modèle de genre mais sans les paramètres
                    if (chc) {
                        new_codewiki += lfm + "\n";
                    }
                    //si pas de modèle de genre, ajoute le modèle "c'est pas bien"
                    else if ( lfm.indexOf("{{genre") != -1 ) {
                            new_codewiki += lfm + "\n";
                    } else {
                            new_codewiki += lfm + " {{genre ?|es}}\n";
                    }
                    if( /es-rég\|/.test(new_codewiki) )
                        new_codewiki = Flex_reg2(new_codewiki,CrFlEs_Mot);
                    else
                        new_codewiki += Flex_standard(codesplit[k],CrFlEs_Mot);
                    status = "wait sec mot";
                }
                break;
        }
        if (status=="fini") { break; }  //on ne traite que l'espagnol
    }
 
    //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 es") { alert("Pas de section « espagnol »."); }
 
    //générer clé de tri
    var cle = CommonWikt_CleTri(CrFlEs_Flex);
    if (cle != CrFlEs_Flex.toLowerCase()){ new_codewiki += "{{clé de tri|" + cle + "}}\n"; }
 
	//ajout d'une prononciation manquante
    new_codewiki = AjouterPrononciationManquante(new_codewiki);
 
    //ouvrir la nouvelle page en édition
    var urlFlx =mw.config.get('wgServer') + mw.config.get('wgScript') + "?title=" + encodeURIComponent(CrFlEs_Flex);
    CommonWikt_ajax.http({ 
        url: urlFlx + "&action=edit",
        text: new_codewiki,
        onSuccess:CrFlEs_CreerFlexion3
    });
}
 
//--------------------------------------------------------------------------------------
// Troisième étape suite à clic :
// * charger le code wiki dans la zone d'édition
// * rendre la main à l'utilisateur
//--------------------------------------------------------------------------------------
function CrFlEs_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-CreerFlexionEs|Gadget-CreerFlexionEs]]";
}

//--------------------------------------------------------------------------------------
// on vérifie que la prononciation est présente sur la ligne de forme et dans l'infobox
// si ce n'est pas le cas, on essaie de la récupérer depuis l'un des deux endroits
// et on l'ajoute à l'endroit manquant
//--------------------------------------------------------------------------------------
function AjouterPrononciationManquante(codewiki){
	var lig="";
	var pron="";
	var codesplit = codewiki.split("\n"); // séparation en lignes individuelles
	for (k=0; k<codesplit.length; k++){
		lig += codesplit[k] + "\n";
		var flex_box = /^{\{es\-/.test(codesplit[k]);
		var lig_frm = /^'''/.test(codesplit[k]);
		
		//on cherche la prononciation dans la boite de flexion
		//Exemples:
		//* {{es-rég}}
		//* {{es-rég|βa.o.'βaβ}}
		//* {{es-rég|βa.o.'βaβ|s=baobab}}
		//* {{es-accord-oa|válid|ˈba.li.ð}}
		var pronFlex="";
		if(flex_box){
			//cas particulier de « es-accord-oa » (et peut-être d'autres)
			if (/es-accord-oa\|/.test(codesplit[k])){
    			var pos1 = codesplit[k].lastIndexOf("|")+1;
				var pos2 = codesplit[k].indexOf("}}");
				pronFlex = codesplit[k].substring(pos1,pos2)+"o";
			} else {
				var pos1=0;
				do {
    				pos1 = codesplit[k].indexOf("|",pos1)+1;
					if(pos1!=0){//« | » n'a pas été trouvé
						var pos2=codesplit[k].substr(pos1).search("[\||\}\}]");
						pronFlex = codesplit[k].substring(pos1,pos2+pos1);
					}
				}
				while (pronFlex.search("=")!=-1);
			}
			//alert("Pononciation : \"" + pronFlex);
		}
		
	    //on cherche la prononciation sur la ligne de forme
		var pronFrm="";
		if(lig_frm){
			var pos1=codesplit[k].indexOf("on|")+3; //{{p[r|h]on|
			if(pos1!=2){//« on| » n'a pas été trouvé
				var pos2=codesplit[k].substr(pos1).search("[\||\}\}]");
				pronFrm = codesplit[k].substring(pos1,pos1+pos2);
			}
		}
	}
	return lig;
}
 
//==========================================================================================
 
//--------------------------------------------------------------------------------------
// Vérifie qu'une des formes mp, fs ou fp a été trouvée. Si ce n'est pas le cas, 
// on affiche une boite de dialogue pour signaler que le modèle de flexion n'est
// probablement pas le bon.
//--------------------------------------------------------------------------------------
function verifFlexBox(mp, fs, fp){
    if(mp==-1 && fs==-1 && fp==-1)
        alert("Le modèle de flexion ne semble pas correct. Vérifiez le et modifiez le si besoin avant de créer les flexions.");
// il faudrait mettre ici qqchose qui stoppe l'exécution du gadget pour qu'on reste sur la page principale plutôt que d'arriver sur une page de flexion mal remplie.
}
//--------------------------------------------------------------------------------------
// Ajouter le paramètre s= ou ms= à l'infobox
//--------------------------------------------------------------------------------------
function CrFlEs_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 ( (/es-rég\|/.test(lig) ||
         /es-accord-mf\|/.test(lig)) && 
         lig.indexOf("|s=")==-1) {
        return lig.substring(0,p) + "|s=" + mot + "}}";
    } else if ( (/es-rég/.test(lig)) && lig.indexOf("|s=")==-1) {
        return lig.substring(0,p) + "||s=" + mot + "}}";
    }
    // es-accord-oa reste à l'identique
    /*if ( (/es-accord-oa\|/.test(lig) ) && 
         (lig.indexOf("|ms=") == -1) ){
        return lig.substring(0,p) + "|ms=" + mot + "}}";
    }*/
    return lig; // pour les modèles non gérés
}
 
//--------------------------------------------------------------------------------------
// Définition dans le cas régulier
//--------------------------------------------------------------------------------------
function Flex_standard(codesplit,CrFlEs_Mot){
    var tmp_codewiki="";
    if ((codesplit.indexOf("{{mf}}")>=0) )
        tmp_codewiki += "# ''Pluriel de'' [[";
    else    
        tmp_codewiki += "# ''Masculin/Féminin singulier/pluriel de'' [[";
    tmp_codewiki += CrFlEs_Mot + "#es|" + CrFlEs_Mot + "]].\n\n";
    return tmp_codewiki;
}
 
 
//--------------------------------------------------------------------------------------
// Définition dans le cas des mots qui utilisent es-accord-oa
//--------------------------------------------------------------------------------------
function Flex_oa(new_codewiki,CrFlEs_Mot){
    var tmp_codewiki=new_codewiki;
    // on cherche d'abord la forme dont on doit s'occuper
    var pos_mp = tmp_codewiki.indexOf("os'''");
    var pos_fs = tmp_codewiki.indexOf("a'''");
    var pos_fp = tmp_codewiki.indexOf("as'''");
 
    verifFlexBox(pos_mp, pos_fs, pos_fp);
    alert("Il y a u problème avec la regexp donc la prononciation et certaines parties de la page sont peut-être à corriger.");
 
    if( pos_mp>0 )
    	if(tmp_codewiki.search("/[o|a|as]\|es\}\}")>0)
        	tmp_codewiki = tmp_codewiki.replace(/[o|a|as]\|es\}\}/mg,"os|es}}");
        else if(tmp_codewiki.search("/[o|a|as]\}\}")>0)
        	tmp_codewiki = tmp_codewiki.replace(/[o|a|as]\}\}/mg,"os|es}}");
    if( pos_fs>0 )
    	if(tmp_codewiki.search("/[o|os|as]\|es\}\}")>0)
        	tmp_codewiki = tmp_codewiki.replace(/[o|os|as]\|es\}\}/mg,"a|es}}");
        else if(tmp_codewiki.search("/[o|os|as]\}\}")>0)
        	tmp_codewiki = tmp_codewiki.replace(/[o|os|as]\}\}/mg,"a|es}}");
    if( pos_fp>0 )
    	if(tmp_codewiki.search("/[o|os|a]\|es\}\}")>0)
        	tmp_codewiki = tmp_codewiki.replace(/[o|os|a]\|es\}\}/mg,"as|es}}");
        else if(tmp_codewiki.search("/[o|os|a]\}\}")>0)
        	tmp_codewiki = tmp_codewiki.replace(/[o|os|a]\}\}/mg,"as|es}}");
 
    if (pos_mp>0)
        tmp_codewiki += "# ''Masculin pluriel de'' [[";
    if (pos_fs>0)
        tmp_codewiki += "# ''Féminin singulier de'' [[";
    if (pos_fp>0)
        tmp_codewiki += "# ''Féminin pluriel de'' [[";
    tmp_codewiki += CrFlEs_Mot + "#es|" + CrFlEs_Mot + "]].\n\n";
    return tmp_codewiki;
}
 
//--------------------------------------------------------------------------------------
// Définition dans le cas des mots qui utilisent es-rég
//--------------------------------------------------------------------------------------
function Flex_reg2(new_codewiki,CrFlEs_Mot){
    var tmp_codewiki=new_codewiki;
    var pos_mp = tmp_codewiki.indexOf("os'''");
    var pos_fs = tmp_codewiki.indexOf("a'''");
    var pos_fp = tmp_codewiki.indexOf("as'''");
 
    if( pos_mp>0 )
    	if(tmp_codewiki.search("/[o|a|as]\|es\}\}")>0)
        	tmp_codewiki = tmp_codewiki.replace(/[o|a|as]\|es\}\}/mg,"os|es}}");
        else if(tmp_codewiki.search("/[o|a|as]\}\}")>0)
        	tmp_codewiki = tmp_codewiki.replace(/[o|a|as]\}\}/mg,"os|es}}");
    if( pos_fs>0 )
    	if(tmp_codewiki.search("/[o|os|as]\|es\}\}")>0)
        	tmp_codewiki = tmp_codewiki.replace(/[o|os|as]\|es\}\}/mg,"a|es}}");
        else if(tmp_codewiki.search("/[o|os|as]\}\}")>0)
        	tmp_codewiki = tmp_codewiki.replace(/[o|os|as]\}\}/mg,"a|es}}");
    if( pos_fp>0 )
    	if(tmp_codewiki.search("/[o|os|a]\|es\}\}")>0)
        	tmp_codewiki = tmp_codewiki.replace(/[o|os|a]\|es\}\}/mg,"as|es}}");
        else if(tmp_codewiki.search("/[o|os|a]\}\}")>0)
        	tmp_codewiki = tmp_codewiki.replace(/[o|os|a]\}\}/mg,"as|es}}");
        	
    tmp_codewiki += "# ''Pluriel de ''[[" + CrFlEs_Mot + "#es|" + CrFlEs_Mot + "]].\n\n";
    return tmp_codewiki;
}