Utilisateur:Pamputt/Gadget-CreerFlexionEn.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 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;
}