Utilisateur:Automatik/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]]
//==========================================================================================
//<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() {
	$('.translations').find('.new').filter(function() {
		// On évite la colorisation des liens rouges pour les écritures traditionnelles (chinois et coréen)
		// ainsi que pour les liens interwikis en exposants qui utilisent des codes langue redirigés
		// (cf. [[Discussion_module:traduction#Liens en exposant et codes wikimédia]])
		var enfants = $(this).children();
		return enfants.length > 0 && enfants.first().prop('nodeName').toLowerCase() == 'span';
	})
	.each(function() {
		var link = $(this);
		var title = link.attr('title');
		var trad = /^(.*?) \(page inexistante\)$/.exec(title);
		if (trad !== null) {
			trad = trad[1];
		} else {
			// l'attribut title n'est pas sous la forme "<titre> (page inexistante)"
			// le lien ne sera pas colorisé
			return;
		}
		var code_langue = link.children().first().attr('lang');
		link.css('background-color', '#77B5FE');
		link.attr('title', 'cliquez pour créer « ' + trad + ' » avec le gadget');
		link.click(function(event) {
			event.preventDefault();
			CrTr_CreerTrad1(trad, code_langue);
		});
	});
}

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

//--------------------------------------------------------------------------------------
// 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, lang ) {
	CrTr_Mot  = mw.config.get( 'wgPageName' ).replace(/_/g," ");
	CrTr_Trad = trad;
	CrTr_codelangue = lang;

	// 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 = "";

	var ligne_trad = 0;
	var lig_trad_trouve = false;
	var a_rechercher = CrTr_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 une transcription est indiquée, on la récupère
	var transcription = "";
	var regex_transcription = new RegExp("\\{\\{trad[+-]{0,2}\\|" + CrTr_codelangue +
	                          "\\|" + CrTr_Trad + "\\|(?:[^}]*?\\|)?(?:R|tr)=([^=|}]*?)[|}]");
	var array_transcription = regex_transcription.exec(codesplit[ligne_trad]);
	if (array_transcription !== null) {
		transcription = array_transcription[1];
	}

	// si le paramètre dif est utilisé, on récupère sa valeur
	// exemple : * {{T|he}} : {{trad+|he|מכלב|R=makhlev|dif=מַכְלֵב}} {{m}}
	var dif = "";
	a_rechercher = CrTr_codelangue + "\\|" + CrTr_Trad + "[^}]*?dif=([^|}]*?)[|}]";
	var dif_regex = new RegExp( a_rechercher, "" );
	if ( dif_regex.exec( codesplit[ligne_trad] ) !== null ) {
		dif = dif_regex.exec( codesplit[ligne_trad] )[1];
	}

	// si un genre est indiqué, on le récupère
	var genre = "";
	var regex_genre = new RegExp("\\{\\{trad[+-]{0,2}\\|" + CrTr_codelangue +
	                  "\\|" + CrTr_Trad + "\\|(?:[^}]*?\\|)?([^=|}]*?)[|}]");
	var array_genre = regex_genre.exec(codesplit[ligne_trad]);
	if (array_genre !== null) {
		genre = array_genre[1];
	}

	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]) || /S\|adjectif\|/.test(codesplit[kk])) { nature = "adjectif"; }
			if (/-adv-\|/.test(codesplit[kk]) || /S\|adverbe\|/.test(codesplit[kk])) { nature = "adverbe"; }
			if (/-nom-\|/.test(codesplit[kk]) || /S\|nom\|/.test(codesplit[kk])) { nature = "nom"; }
			if (/-verbe?-\|/.test(codesplit[kk]) || /-verb-pr-\|/.test(codesplit[kk]) || /S\|verbe\|/.test(codesplit[kk])) { nature = "verbe"; }
			if (/-conj-\|/.test(codesplit[kk]) || /S\|conjonction\|/.test(codesplit[kk])) { nature = "conjonction"; }
			if (/-nom-pr-\|/.test(codesplit[kk]) || /S\|nom propre\|/.test(codesplit[kk])) { nature = "nom propre"; }
			if (/-phr-\|/.test(codesplit[kk])) { nature = "locution-phrase"; }

			var diese = '#';
			var etoile = '*';
			if ( codesplit[kk].charAt(0) == diese && codesplit[kk].charAt(1) != etoile) {
				cmptDef++;
				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) {
			var regex_domaine = /\{\{([^|}]+?)\|[^|}]+?\}\}/;
			var array_domaine = regex_domaine.exec(ligne_def);
			if (array_domaine !== null) {
				domaine = array_domaine[1];
			}
		}



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

	//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, genre) {
	var new_codewiki = "";
	new_codewiki = "== {{langue|" + codelangue + "}} ==\n";
	new_codewiki += "{{ébauche|"+ codelangue + "}}\n";
	new_codewiki += "=== {{S|étymologie}} ===\n";
	new_codewiki += ": {{ébauche-étym|" + codelangue + "}}\n\n";

	new_codewiki += "=== {{S|" + 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 + "}}";
	if (nature === "nom" && genre.length>0)
		new_codewiki += " {{" + genre + "}}";
	new_codewiki += "\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, genre) {
	var new_codewiki = "";
	new_codewiki = "== {{langue|ca}} ==\n";
	new_codewiki += "{{ébauche|ca}}\n";
	new_codewiki += "=== {{S|étymologie}} ===\n";
	new_codewiki += ": {{ébauche-étym|ca}}\n\n";

	new_codewiki += "=== {{S|" + nature + "|ca}} ===\n";

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

	new_codewiki += "'''" + CrTr_Trad + "''' {{pron||ca}}";
	if (nature === "nom" && genre.length>0)
		new_codewiki += " {{" + genre + "}}";
	new_codewiki += "\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 += "=== {{S|étymologie}} ===\n";
	new_codewiki += ": {{ébauche-étym|eo}}\n\n";

	new_codewiki += "=== {{S|" + nature + "|eo}} ===\n";

	if (nature=="adjectif" || 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, genre) {
	var new_codewiki = "";
	new_codewiki = "== {{langue|es}} ==\n";
	new_codewiki += "{{ébauche|es}}\n";
	new_codewiki += "=== {{S|étymologie}} ===\n";
	new_codewiki += ": {{ébauche-étym|es}}\n\n";

	new_codewiki += "=== {{S|" + nature + "|es}} ===\n";

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

	new_codewiki += "'''" + CrTr_Trad + "''' {{pron||es}}";
	if (nature === "nom" && genre.length>0)
		new_codewiki += " {{" + genre + "}}";
	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 += "=== {{S|étymologie}} ===\n";
	new_codewiki += ": {{ébauche-étym|oc}}\n\n";

	new_codewiki += "=== {{S|" + nature + "|oc}} ===\n";

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

	new_codewiki += "'''" + CrTr_Trad + "''' {{pron||oc}}";
	if (nature === "nom" && genre.length>0)
		new_codewiki += " {{" + genre + "}}";
	new_codewiki += "\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>