Utilisateur:Romainbehar/Gadget-CreerFlexionIt.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 flexions en français depuis le lien rouge dans la page principale
// Ce script prend en compte les modèles it-accord et génère des modèles it-flexion
// Voir la documentation du Modèle:it-flexion
//<nowiki>

// import de Gadget-CommonWikt.js
mw.loader.load("//fr.wiktionary.org/wiki/MediaWiki:Gadget-CommonWikt.js?action=raw&ctype=text/javascript");

// variables globales

// mot concerné
var CreerFlexionsIt_Mot = '';
// prononciation flexion
var CreerFlexionsIt_Prononciation_flexion = '';


// activation du gadget dans l'espace principal
//if ( mw.config.get('wgNamespaceNumber') === 0 )
CreerFlexionsIt_ChangerLiensRouges();

// création de liens vers le gadget en remplaçant les liens rouges
// dans les infobox ayant la classe flextable-it-mfsp
function CreerFlexionsIt_ChangerLiensRouges()
{
    $('.flextable-it-mfsp .new').each(function()
    {
    	// sauvegarde du mot original et de la flexion
        CreerFlexionsIt_Mot = mw.config.get('wgPageName').replace(/_/g," ");
        var flexion = $(this).text().replace(/&nbsp;/g, ' ');

		// récupération de la première balise H3 parente, parmi plusieurs balises DIV
		var divList = ['.flextable-it-mfsp', '.content-table', '.content-table-wrapper'];
		var type_mot = '';
		for (var d = 0; d < divList.length; d++)
		{
			var h = $(this).parents(divList[d]).prevAll('h3').first()
			if (h)
			{
				// récupération du texte dans la balise de classe .titredef
				type_mot = h.find('.titredef').text();
				if (type_mot)
				{
					break;
				}
			}
		}

		// liste des sections prises en compte
		var sections_valides = ['Nom commun', 'Nom commun 1', 'Nom commun 2', 'Nom commun 3',
								'Locution adjectivale', 'Locution adjectivale 1', 'Locution adjectivale 2',
								'Locution nominale', 'Locution nominale 1', 'Locution nominale 2',
								'Adjectif', 'Adjectif 1', 'Adjectif 2',
								'Suffixe', 'Suffixe 1', 'Suffixe 2'];

		// si la section n'est pas dans la liste, on s'arrête là
		if (sections_valides.indexOf(type_mot) < 0) {
			console.error('Nom de la flexion introuvable');
			return;
		}

		// sinon on surligne
		$(this).css('background-color','#00ff00');
		$(this).prop('title', 'Cliquez pour créer « ' + flexion + ' » avec le gadget');
		$(this).click(function(e) {
			// l'utilisateur a cliqué sur le lien surligné, on empêche le navigateur de le suivre
			e.preventDefault();
			
			CFIt_requete_recuperation_code_page(flexion);
		});
    });
}

// construction et appel de la requête pour obtenir le code de l'article
function CFIt_requete_recuperation_code_page(flexion)
{
    var urlMot = mw.config.get('wgServer') + mw.config.get('wgScript')
    			 + '?title=' + encodeURIComponent(CreerFlexionsIt_Mot);
    CommonWikt_ajax.http({ 
        url: urlMot + '&action=raw',
        flexion: flexion,
        onSuccess: CFIt_requete_creation_nouvelle_page
    });
}

function CFIt_requete_creation_nouvelle_page(Req, data)
{
	// code original de la page
    var r = Req.responseText;

    // message d'erreur s'il n'y a pas la section {{langue|it}}
    if (! /\{\{langue\|it\}\}/.test(r))
    {
    	alert('Erreur : pas de section italien trouvée dans la page!');
    	return;
    }

    // édition dans une nouvelle page
    var urlMot = mw.config.get('wgServer') + mw.config.get('wgScript')
    			 + '?title=' + encodeURIComponent(data.flexion);
    CommonWikt_ajax.http({ 
        url: urlMot + '&action=edit',
        text: Recuperation_section_italien(r, data.flexion),
        page_origine: CreerFlexionsIt_Mot,
        onSuccess: CFIt_code_nouvelle_page
    });
}

function CFIt_code_nouvelle_page(Req, data)
{
	// on vide la page
	while(document.body.firstChild)
	{
		document.body.removeChild(document.body.firstChild);
	}
	
	// on colle à la place la page d'édition
	document.body.innerHTML = Req.responseText;
	
	// on met le code récupéré dans la zone d'édition
	document.getElementById('wpTextbox1').value = data.text;
	
	// avec un petit résumé
	document.getElementById('wpSummary').value = "Création avec [[Aide:Gadget-CreerFlexionIt|Gadget-CreerFlexionIt]]" +
    " depuis [[" + data.page_origine + "]]";
}

// filtration du code de la page
function Recuperation_section_italien(code_page, flexion)
{
    // tableau contenant les lignes du code original
    var lignes = code_page.split("\n");
    
    // tableau des lignes du code de la page de flexion
    var lignes_it = [];
    lignes_it.push('== {{langue|it}} ==');

    // récupération des sections de noms italiens
    for (var k = 0; k < lignes.length; k++)
    {
    	var ligne = lignes[k];

		// si on est arrivés à une section S|nom|it ou S|adjectif|it (peut être suivi de |num=n)
		if (/\{\{S\|nom\|it/.test(ligne)
			|| /\{\{S\|nom commun\|it/.test(ligne)
			|| /\{\{S\|adj\|it/.test(ligne)
			|| /\{\{S\|adjectif\|it/.test(ligne)
			|| /\{\{S\|suffixe\|it/.test(ligne))
		{
			// remplacement |nom commun| par |nom|
			ligne = ligne.replace('|nom commun|', '|nom|');

			// ajout titre section, avec flexion
			ligne = ligne.replace('|it}}', '|it|flexion}}');
			lignes_it.push(ligne);
			
			// ajout des lignes suivantes : jusqu'à arriver au mot en gras
			var m = 0;
			while (true)
			{
				m++;
				if (k + m > lignes.length)
				{
					// fin du code
					break;
				}

				ligne = CFIt_ligne_a_garder(lignes[k+m], flexion);
				if (ligne !== false)
				{
					lignes_it.push(ligne)
				}
				
				if (/^'''/.test(ligne))
				{
					// on s'arrête au mot en gras
					break;
				}
			}

			// ajout pluriel
			lignes_it.push("# ''Pluriel de'' {{lien|"+CreerFlexionsIt_Mot+"|it}}.");
			
			// ajout exemple
			lignes_it.push("#* {{exemple|lang=it}}");
			
			// ajout ligne vide
			lignes_it.push('');
		}
    }
    
    // renvoi de la section
    return lignes_it.join("\n");
}

function CFIt_ligne_a_garder(ligne, flexion)
{
	// paramètres dans le cas où la ligne contient it-flexion ou it-accord
	var accord = ''; // it-flexion ou it-accord
	var type_flexion = ''; // f= ou fl=
	var singulier = ''; // s=
	var pluriel = ''; // p=
	var singulier2 = ''; // s2=
	var pluriel2 = ''; // p2=
	var superlatif = ''; // super=
	var superlatif_p = ''; // superp=
	var prononciations = [];
	var prononciation = ''; // prononciation du pluriel, en deuxième position (sinon première)
	var mot = '';
	var post = '';
	var postp = '';

	if (/\{\{it\-/.test(ligne))
	{
		var elements = ligne.split('|');
		accord = elements[0].replace('{{', '');
		for (var i = 1; i < elements.length; i++)
		{
			var e = elements[i].replace('}}', '');
			if (e.indexOf('=') > 0)
			{
				// paramètre
				var params = e.split('=');
				
				switch (params[0])
				{
					case 'f':
					case 'fl':
						type_flexion = params[1];
						break;

					case 's':
						singulier = params[1];
						break;

					case 'p':
						pluriel = params[1];
						break;

					case 's2':
						singulier2 = params[1];
						break;

					case 'p2':
						pluriel2 = params[1];
						break;

					case 'super':
						superlatif = params[1];
						break;

					case 'superp':
						superlatif_p = params[1];
						break;

					case 'mot':
						mot = params[1];
						break;

					case 'post':
						post = params[1];
						break;

					case 'postp':
						postp = params[1];
						break;

					default:
						console.error('Paramètre inconnu : ' + params[0]);
				}
			}
			else
			{
				// si ce n'est pas un paramètre, c'est une prononciation
				prononciations.push(e);
			}
		}
		
		if (pluriel2 != '' && pluriel2 === flexion && prononciations.length >= 4)
		{
			prononciation = prononciations[3];
		}
		else if (singulier2 != '' && singulier2 === flexion && prononciations.length >= 3)
		{
			prononciation = prononciations[2];
		}
		else if (prononciations.length > 1)
		{
			// la prononciation est en deuxième position
			prononciation = prononciations[1];
		}
		else if (prononciations.length > 0)
		{
			// sinon en première position
			prononciation = prononciations[0];
		}
	}

	if (/\{\{it\-flexion\|/.test(ligne))
	{
		// flexion
		if (type_flexion == '')
		{
			// pas de f=, on calcule les valeurs par défaut: ae, ei ou oi
			var derniere_lettre = CreerFlexionsIt_Mot.slice(-1);
			switch (derniere_lettre)
			{
				case 'a':
					type_flexion = 'ae';
					break;
					
				case 'e':
					type_flexion = 'ei';
					break;
					
				case 'o':
					type_flexion = 'oi';
					break;
				
				default:
					alert('Type de flexion non trouvé pour ' + CreerFlexionsIt_Mot);
			}
		}
	}

	if (accord != '')
	{
		if (/\s/.test(flexion))
		{
			// locution composée (contient une espace)
			// on ne change pas la prononciation, mais la laisse telle quelle pour modification
			CreerFlexionsIt_Prononciation_flexion = prononciation;
		}
		else
		{
			// modification de la prononciation pour le modèle {{pron||it}}
			CFIt_prononciation_flexion(flexion, type_flexion, prononciation, superlatif, superlatif_p);
		}

		var f = '{{it-flexion';
		if (singulier != '' || pluriel != '')
		{
			// locution nominale
			f = f + '|s=' + CreerFlexionsIt_Mot;
			if (singulier2 != '' && pluriel2 != '')
			{
				f = f + '|p=' + pluriel + '|s2=' + singulier2 + '|p2=' + pluriel2;
			}

			for (var i = 0; i < prononciations.length; i++)
			{
				f = f + '|' + prononciations[i];
			}
		}
		else
		{
			// forme régulière
			f = f + '|f='+type_flexion;
			if (prononciations.length > 0)
			{
				f = f + '|' + prononciations[0];
			}
		}

		if (superlatif != '')
		{
			f = f + '|super=' + superlatif;
		}

		if (superlatif_p != '')
		{
			f = f + '|superp=' + superlatif_p;
		}
		
		if (mot != '')
		{
			f = f + '|mot=' + mot;
		}

		if (post != '')
		{
			f = f + '|post=' + post;
		}

		if (postp != '')
		{
			f = f + '|postp=' + postp;
		}

		return f + '}}';
	}

	if (/^'''/.test(ligne))
	{
		// ligne du mot défini, on le remplace avec la flexion
        ligne = ligne.replace(CreerFlexionsIt_Mot, flexion);
        
        // remplacement de la prononciation, si elle existe
        if (CreerFlexionsIt_Prononciation_flexion.length > 0)
        {
        	ligne = ligne.replace(/pron\|.*?\|it/, 'pron|'+CreerFlexionsIt_Prononciation_flexion+'|it');
        }
        
        return ligne;
	}
	
	return false;
}


// prépare la prononciation de la nouvelle flexion à partir de celle du mot de base
function CFIt_prononciation_flexion(flexion, type_flexion, racine_pron, superlatif, superlatif_p)
{
	// si la prononciation n'était pas spécifiée dans la page d'origine
	if (racine_pron.indexOf('=') >= 0)
	{
		// erreur : la prononciation contient en fait un paramètre
		return '';
	}

	// dernière lettre de la flexion
	var lettre = flexion.slice(-1);
	// deux dernières lettres de la flexion
	var lettres2 = flexion.slice(-2);
	
	var x = '';

	if (superlatif != '')
	{
		if (superlatif_p != '')
		{
			racine_pron = superlatif_p;
			x = lettre;
		}
	}
	else
	{
		switch (type_flexion)
		{
			case 'ae':
			case 'ahe':
				x = 'e';
				break;

			case 'ai':
			case 'ahi':
			case 'ei':
			case 'ohi':
			case 'oi':
			case 'ioi':
			case 'e':
			case 'o':
				x = 'i';
				break;
	
			case 'si':
				x = 'j';
				break;
	
			case 'oa':
				x = 'a';
				break;
	
			case 'aie':
			case 'iae':
			case 'oia':
			case 'eaie':
			case 'oae':
			case 'oaie':
			case 'oahihe':
			case 'ioiaie':
				// ajout dernière lettre de la flexion
				x = lettre;
				break;
	
			case 'coci':
				x = 't͡ʃi';
				break;
	
			case 'gogi':
				x = 'd͡ʒi';
				break;
	
			case 'cocaciche':
				// dernière lettre de la flexion
				if (lettre == 'a' || lettre == 'e')
				{
					x = 'k' + lettre;
				}
				else
				{
					// i
					x = 't͡ʃi';
				}
				break;
	
			case 'gogagighe':
				// dernière lettre de la flexion
				if (lettre == 'a' || lettre == 'e')
				{
					x = 'ɡ' + lettre;
				}
				else
				{
					// i
					x = 'd͡ʒi';
				}
				break;
	
			case 'ioiaiie':
				if (lettre == 'a')
				{
					x = 'ja';
				}
				else if (lettre == 'e')
				{
					x = 'je';
				}
				else
				{
					// i
					x = 'i';
				}
				break;
	
			case 'tore':
				if (lettres2 == 'ri')
				{
					x = '\'to.ri';
				}
				else
				{
					// ci
					x = '\'tri.t͡ʃi';
				}
				break;
	
			default:
				alert('Type de flexion non pris en charge : ' + type_flexion);
		}
	}
	
	CreerFlexionsIt_Prononciation_flexion = racine_pron + x;
}

//</nowiki>