Utilisateur:Otourly/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 italien depuis le lien rouge dans la page principale
// -----------------------------------------------------------------------------------------
// ArséniureDeGallium 2012-11-07
// Otourly 2017-11-04 Tentative d’adaptation italienne
// -----------------------------------------------------------------------------------------
//[[Catégorie:JavaScript du Wiktionnaire|CreerFlexionIt.js]]
//==========================================================================================
if ( mw.config.get('wgNamespaceNumber') === 0 ){ CrFlIt_ChangerLiensRouges(); }
//--------------------------------------------------------------------------------------
// Créer les liens vers le gadget
// pour tous les liens rouges dans les infobox de classe "flextable-it-mfsp"
//--------------------------------------------------------------------------------------
function CrFlIt_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-it-mfsp .selflink').length;
if ( flextable_vedette && $('.flextable-it-mfsp .selflink').first().parents('.flextable-it-m').length ) {
genre_pagename = 'm';
} else if ( flextable_vedette && $('.flextable-it-mfsp .selflink').first().parents('.flextable-it-f').length ) {
genre_pagename = 'f';
}
$(".flextable-it-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-it-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-it-m').length ) {
genre_lien_rouge = 'm';
} else if ( $(this).parents('.flextable-it-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 it-accord, 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();
CrFlIt_CreerFlexion1( flex.replace(/ /g, ' ') );
});
});
}
//==========================================================================================
var CrFlIt_Mot = "";
var CrFlIt_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 CrFlIt_CreerFlexion1(flx){
CrFlIt_Mot = mw.config.get('wgPageName').replace(/_/g," ");
CrFlIt_Flex = flx;
// requête pour obtenir le contenu de l'article
var urlMot =mw.config.get('wgServer') + mw.config.get('wgScript') + '?title=' + encodeURIComponent(CrFlIt_Mot);
CommonWikt_ajax.http({
url: urlMot + '&action=raw',
onSuccess:CrFlIt_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 CrFlIt_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 italienne
// ** 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 it";
var flex = false;
var new_codewiki="";
var mot_inv = false;
var nouvelleSyntaxe = false;
var k;
var pos;
//on recherche si {{it-inv}} est present, auquel cas on ne creera pas la section de nom commun
for (k=0; k<codesplit.length; k++) {
mot_inv = /^{\{it\-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_it = /^==[ ]*\{\{langue\|it\}\}[ ]*==/.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 = /^{\{it\-/.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 it" :
if (sec_it) {
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(/it(\|num=\d)?}}/,"it|flexion$1}}") + "\n";
else
new_codewiki += "=== {{S|adjectif|it|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(/it(\|num=\d)?}}/,"it|flexion$1}}") + "\n";
else
new_codewiki += "=== {{S|nom|it|flexion}} ===\n";
status = "wait frm nom";
}
break;
case "wait frm adj" :
var infobox_lig;
if (sec_qqq) { status="fini"; }
if (flex_box) {
new_codewiki += CrFlIt_Infobox(codesplit[k],CrFlIt_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(CrFlIt_Mot) == -1) {
alert("Le mot vedette sur la ligne de forme ne correspond pas au titre de la page.");
}
new_codewiki += codesplit[k].replace(CrFlIt_Mot,CrFlIt_Flex).replace("{{m}}","").replace("{{f}}","").replace("{{sp}}","") + "\n";
var frm_principale = CrFlIt_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
//*it-accord-oaie
//*it-accord-oi
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("it-accord-")+10,infobox_lig.indexOf("|"));
frm_principale = radical + suf;
trouve = true;
}
flex = false;
}
//*************************************************************//
//on cherche maintenant à traiter les différents cas possibles
//*it-accord-oaie
//*it-accord-oi
//*it-accord
//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( /it-accord-oaie\|/.test(new_codewiki) )
new_codewiki = Flex_oaie(new_codewiki,frm_principale);
else if( /it-accord-oi\|/.test(new_codewiki) )
new_codewiki = Flex_oi(new_codewiki,frm_principale);
}
status = "wait sec mot";
}
break;
case "wait frm nom" :
if (sec_qqq) { status="fini"; }
if (flex_box) {
new_codewiki += CrFlIt_Infobox(codesplit[k],CrFlIt_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(CrFlIt_Mot,CrFlIt_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 ?|it}}\n";
}
new_codewiki += "# ''Pluriel de ''[[";
new_codewiki += CrFlIt_Mot + "#it|" + CrFlIt_Mot + "]].\n\n";
status = "wait sec mot";
}
break;
}
if (status=="fini") { break; } //on ne traite que l’italien
}
//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 it") { alert("Pas de section « italien »."); }
//générer clé de tri
var cle = CommonWikt_CleTri(CrFlIt_Flex);
if (cle != CrFlIt_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(CrFlIt_Flex);
CommonWikt_ajax.http({
url: urlFlx + "&action=edit",
text: new_codewiki,
onSuccess:CrFlIt_CreerFlexion3
});
}
//--------------------------------------------------------------------------------------
// Troisième étape suite à clic :
// * charger le code wiki dans la zone d'édition
// * rendre la main à l'utilisateur
//--------------------------------------------------------------------------------------
function CrFlIt_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-CreerFlexionIt|Gadget-CreerFlexionIt]]";
}
//==========================================================================================
//--------------------------------------------------------------------------------------
// 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 CrFlIt_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 ( (/it-accord-oi\|/.test(lig) ||
/it-accord-oaie\|/.test(lig)) &&
lig.indexOf("|s=")==-1) {
return lig.substring(0,p) + "|s=" + mot + "}}";
} else if ( (/it-accord/.test(lig)) && lig.indexOf("|s=")==-1) {
return lig.substring(0,p) + "||s=" + mot + "}}";
}
if ( (/it-accord-oaie\|/.test(lig) ||
/it-accord-oi\|/.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 des mots qui utilisent it-accord-oaie
//--------------------------------------------------------------------------------------
function Flex_al(new_codewiki,CrFlIt_Mot){
var tmp_codewiki=new_codewiki;
// on cherche d'abord à quelle forme on doit s'occuper
var pos_mp = tmp_codewiki.indexOf("i'''");
var pos_fs = tmp_codewiki.indexOf("a'''");
var pos_fp = tmp_codewiki.indexOf("e'''");
verifFlexBox(pos_mp, pos_fs, pos_fp);
if( pos_mp>0 )
if(tmp_codewiki.indexOf("o|it}}")>0)
tmp_codewiki = tmp_codewiki.replace(/o\|it\}\}/mg,"i|it}}");
else if(tmp_codewiki.indexOf("o}}")>0)
tmp_codewiki = tmp_codewiki.replace(/o\}\}/mg,"i|it}}");
if( pos_fs>0 || pos_fp>0 )
if(tmp_codewiki.indexOf("i|it}}")>0)
tmp_codewiki = tmp_codewiki.replace(/o\|it\}\}/mg,"a|it}}");
else if(tmp_codewiki.indexOf("i}}")>0)
tmp_codewiki = tmp_codewiki.replace(/o\}\}/mg,"e|it}}");
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 += CrFlIt_Mot + "#it|" + CrFlIt_Mot + "]].\n\n";
return tmp_codewiki;
}