La documentation pour ce module peut être créée à Module:Utilisateur:Maëlan/Brouillons/fr-flexion/Documentation
--========================================================================================
--Module:fr-flexion : génération des tableaux de flexions des mots en français
------------------------------------------------------------------------------------------
-- auteurs principaux : ArséniureDeGallium
-- licence : CC-BY-SA 3.0
--========================================================================================
lib_pron = require('Module:prononciation')
local p={}
------------------------------------------------------
-- raccourci pour prononciation en français
-- NB : nil est géré par lua_pron()
function pron(api,pref)
return '<br>'..(pref or '')..lib_pron.lua_pron(api,'fr')
end
------------------------------------------------------
-- raccourci pour prononciation additionnelle en français
-- si nil répond '', sinon préfixe par saut de ligne et le mot "ou" en small
function ou_pron(api,pref)
if api then
return '<br><small>ou</small> '..(pref or '')..lib_pron.lua_pron(api,'fr')
end
return ''
end
------------------------------------------------------
-- ajout du caractère adéquat devant la 2e partie invariable d'une prononciation
-- (espace, point, liaison)
-- "." et "‿" inchangés ; nbsp transformé en espace ; sinon espace ajouté
function fin_invar_pron(api)
-- si rien, alors rien
if (api==nil) or (api=='') then return '' end
local PremCar = mw.ustring.sub(api,1,1)
-- point
if PremCar=='.' then return api end
-- liaison
if PremCar=='‿' then return api end
-- espace normal 0x20
if PremCar==' ' then return api end
-- espace insécable en UTF8 0xC2 0xA0
if PremCar=='\194\160' then return ' '..mw.ustring.sub(api,2) end
-- espace insécable en html, non parsé avant d'envoyer la chaîne au Lua
if mw.ustring.sub(api,1,6)==' ' then return ' '..mw.ustring.sub(api,7) end
-- dans tous les autres cas ajouter un espace
return ' '..api
end
------------------------------------------------------
-- calcul des 4 préfpron avec valeurs par défaut, priorité au plus détaillé
-- inspiré du comportement de Modèle:fr-accord-mixte
function prefpron_4(mfsp,msp,fsp,ms,mp,fs,fp)
return ms or msp or mfsp, mp or msp or mfsp, fs or fsp or mfsp, fp or fsp or mfsp
end
------------------------------------------------------
-- Détection du radical parmi 1 à 4 possibilités, et de l'éventuelle partie invariable
-- Algo : première occurrence d'une des formes suivie d'un espace ou d'un tiret ou de la fin de la chaîne,
-- à gauche c'est le radical, à droite c'est le suffixe invar
-- Note 1 : %- est nécessaire pour le tiret, voir http://www.lua.org/manual/5.1/manual.html
-- Note 2 : l'ordre des tests est important si plusieurs peuvent être vrais simultanémént !!
function cherche_radic(TitrePage, p1, p2, p3, p4)
local Radic
local Separ = ''
local Fin = ''
local TitrePage1 = TitrePage..' ' -- pour que %s détecte aussi les fins de chaînes.
local n1, n2 = mw.ustring.find( TitrePage1, p1..'' )
if (not n1) and p2 then n1, n2 = mw.ustring.find( TitrePage1, p2..'' ) end
if (not n1) and p3 then n1, n2 = mw.ustring.find( TitrePage1, p3..'' ) end
if (not n1) and p4 then n1, n2 = mw.ustring.find( TitrePage1, p4..'' ) end
if n1 then
Radic = mw.ustring.sub(TitrePage, 1, n1-1)
if n2 <= mw.ustring.len(TitrePage) then
Fin = mw.ustring.sub(TitrePage, n2) -- comprend le séparateur
Separ = mw.ustring.sub(Fin,1,1)
end
return Radic, Separ, Fin
end
-- sinon return nil, nil, nil
end
------------------------------------------------------
-- Message d'erreur quand le radical n'a pas été trouvé
function pas_trouve_radic(modele)
local txt = "usage erroné de ].<br>"
txt = txt.."Le titre de la page ne comporte pas<br>une des terminaisons attendues."
return tableau_erreur(txt).."]"
end
------------------------------------------------------
-- Détermine si le modèle d’accord doit être interprété suivant l’ancienne ou
-- la nouvelle syntaxe (depuis la migration de ces modèles à Lua en 2014/2015).
-- Retourne un booléen qui vaut vrai s’il faut suivre l’ancienne syntaxe.
-- Fonction à usage transitoire, en attendant l'abandon définitif de l'ancienne
-- syntaxe.
--
-- ancienne syntaxe:
-- - paramètre 1: graphie du radical
-- - paramètre 2: prononciation du radical
-- - paramètre "inv": graphie du suffixe invariable
-- - paramètre "pinv": prononciation du suffixe invariable
--
-- nouvelle syntaxe:
-- - paramètre 1 ou "pron": prononciation du radical
-- - paramètre 2 ou "pinv": prononciation du suffixe invariable
--
-- On peut déterminer quelle syntaxe utiliser en comparant le paramètre 1
-- à la graphie du radical, qui est maintenant auto-détectée.
function faut_il_suivre_ancienne_syntaxe(radic, args)
-- si 1 est fourni et est égal à la graphie du radical, alors ça pourrait
-- être la graphie du radical, suivant l’ancienne syntaxe:
if args == radic then
-- cependant, pour certains mots la prononciation API est identique à
-- la graphie; dans ces cas, 1 pourrait aussi être une prononciation,
-- suivant la nouvelle syntaxe.
--
-- si on suppose qu’une prononciation contient des séparateurs de
-- syllabes, ce cas n’arrive que pour des mots monosyllabiques;
-- en pratique il suffit donc de tester un petit ensemble de radicaux,
-- cf ]
-- (les radicaux avec "r" supposent une erreur d’utilisation de l’API
-- où \r\ a été écrit au lieu de \ʁ\).
--
--if radic == 'b' or radic == 'bl' or radic == 'd' or radic == 'f' or
-- radic == 'k' or radic == 'kl' or radic == 'l' or radic == 'm' or
-- radic == 'n' or radic == 'p' or radic == 'pl' or radic == 'ps' or
-- radic == 's' or radic == 't' or radic == 'ts' or radic == 'v' or
-- radic == 'w' or radic == 'z' or radic == 'g' or radic == 'gl' --or
-- --radic == 'br' or radic == 'dr' or radic == 'fr' or radic == 'gr' or radic == 'kr' or
-- --radic == 'pr' or radic == 'sr' or radic == 'tr' or radic == 'vr'
--then
--
-- en 2023-12 il suffit de tester le radical "b", il n’y a aucune
-- occurrence des autres cas:
if radic == 'b' then
return (args == radic)
else
return true
end
-- si 1 diffère du radical alors c’est forcément une prononciation,
-- suivant la nouvelle syntaxe (ou une erreur):
else
return false
end
end
------------------------------------------------------
-- tableau en erreur
function tableau_erreur(msg, nocat)
local txt =
'{|class="flextable"\n'..
'|+<span style="color:red;"><b>Erreur !</b></span>\n'..
'|-\n'..
'!scope="col"| Singulier\n'..
'!scope="col"| Pluriel\n'..
'|-\n'..
'|scope="row" colspan="2" |<span style="color:red;">'..(msg or "erreur inconnue")..'</span>\n'..
'|}'
local ns = mw.title.getCurrentTitle().namespace
if (ns~=2) and (not nocat) then -- cf ]
txt = txt..']'
end
return txt
end
--=====================================================================================================
function p.boite_erreur(frame) -- message d'erreur pour tableau de flexion appelable depuis le wikicode
--=====================================================================================================
-- accepte un appel direct ou un appel via modèle
-----------------------------------------------------------------------------------------
local msg = frame.args or frame:getParent().args or "erreur inconnue"
local nocat = frame.args or frame:getParent().args
return tableau_erreur(msg,nocat)
end
------------------------------------------------------
-- tableau de flexions générique à 2 formes (habituellement singulier/pluriel)
function tableau_generique_2(prm)
-- génération tableau
local txt = '{|class="flextable flextable-fr-mfsp"\n'
if prm.titre then
txt = txt..'|+'..prm.titre..'\n'
end
txt = txt..
'|-\n'..
'|class="invisible"|\n'..
'!scope="col"| Singulier\n'..
'!scope="col"| Pluriel\n'..
'|-\n'..
'!scope="row"| Masculin\n'..
'|]'..pron(prm.MS1pron1,prm.MS1pref1)..ou_pron(prm.MS1pron2,prm.MS1pref2)..ou_pron(prm.MS1pron3,prm.MS1pref3)..'\n'..
'|]'..pron(prm.MP1pron1,prm.MP1pref1)..ou_pron(prm.MP1pron2,prm.MP1pref2)..ou_pron(prm.MP1pron3,prm.MP1pref3)..'\n'..
'|-\n'..
'|}'
return txt
end
------------------------------------------------------
-- tableau de flexions générique à 4 formes (habituellement ms/mp/fs/fp)
function tableau_generique_4(prm)
-- génération tableau
local txt = '{|class="flextable flextable-fr-mfsp"\n'
if prm.titre then
txt = txt..'|+'..prm.titre..'\n'
end
txt = txt..
'|-\n'..
'|class="invisible"|\n'..
'!scope="col"| Singulier\n'..
'!scope="col"| Pluriel\n'..
'|- class="flextable-fr-m"\n'..
'!scope="row"| Masculin\n'..
'|]'..pron(prm.MS1pron1,prm.MS1pref1)..ou_pron(prm.MS1pron2,prm.MS1pref2)..ou_pron(prm.MS1pron3,prm.MS1pref3)..'\n'..
'|]'..pron(prm.MP1pron1,prm.MP1pref1)..ou_pron(prm.MP1pron2,prm.MP1pref2)..ou_pron(prm.MP1pron3,prm.MP1pref3)..'\n'..
'|- class="flextable-fr-f"\n'..
'!scope="row"| Féminin\n'..
'|]'..pron(prm.FS1pron1,prm.FS1pref1)..ou_pron(prm.FS1pron2,prm.FS1pref2)..ou_pron(prm.FS1pron3,prm.FS1pref3)..'\n'..
'|]'..pron(prm.FP1pron1,prm.FP1pref1)..ou_pron(prm.FP1pron2,prm.FP1pref2)..ou_pron(prm.FP1pron3,prm.FP1pref3)..'\n'..
'|}'
return txt
end
------------------------------------------------------
-- boîte de 4 flexions, fonction générique paramétrée par les terminaisons
-- (graphie et prononciation) du ms/mp/fs/fp, à instancier par une fonction
-- spécialisée qui elle-même devra être invoquée via un modèle.
-- Pour les paramètres de frame, voir la documentation des modèles concernés.
-- `CompatSyntax` est un booléen indiquant s’il faut activer la compatibilité
-- avec la syntaxe pré-Lua de ces modèles (`faut_il_suivre_ancienne_syntaxe`,
-- hack dont il faut se débarrasser à terme).
function boite_accord_4(frame,
SufMasS, SufMasP, SufFemS, SufFemP,
PronSufMasS, PronSufMasP, PronSufFemS, PronSufFemP,
CompatSyntax
)
-- 2023-12-09 Maëlan : factorisation du code écrit par GaAs le 2014-11-23
-- récupération des paramètres passés au modèle
local args = frame:getParent().args
-- Détection du radical et de l'éventuelle partie invariable à partir du titre de la page
-- s'il existe un paramètre "mot", le prendre en priorité (utile pour les pages de doc)
local TitrePage = args or mw.title.getCurrentTitle().text
local Radic, Separ, FinInvar = cherche_radic(TitrePage, SufMasS,SufMasP,SufFemS,SufFemP)
if not Radic then return pas_trouve_radic("accord-"..SufMasS) end -- si pas trouvé dans le titre, erreur
-- récupération des paramètres de prononciation
local AncienneSyntaxe = CompatSyntax and faut_il_suivre_ancienne_syntaxe(Radic, args)
local PronRadic, PronFinInvar
if AncienneSyntaxe then -- ancienne syntaxe
-- prononciation du radical en param 2:
PronRadic = args or ''
-- prononciation du suffixe invariable en param "pinv":
PronFinInvar = args
else -- nouvelle syntaxe
-- prononciation du radical en param 1 ou "pron":
PronRadic = args or ''
if PronRadic == '' then
PronRadic = args or ''
end
-- prononciation du suffixe invariable en param 2 ou "pinv":
PronFinInvar = args or ''
if PronFinInvar == '' then
PronFinInvar = args
end
end
PronFinInvar = fin_invar_pron(PronFinInvar)
-- construction de la structure de paramètres pour tableau_generique_4
local params={}
params.titre = args
params.MS1 = Radic..SufMasS..FinInvar
params.MP1 = Radic..SufMasP..FinInvar
params.FS1 = Radic..SufFemS..FinInvar
params.FP1 = Radic..SufFemP..FinInvar
if PronRadic and (PronRadic~='') then
params.MS1pron1 = PronRadic..PronSufMasS..PronFinInvar
params.MP1pron1 = PronRadic..PronSufMasP..PronFinInvar
params.FS1pron1 = PronRadic..PronSufFemS..PronFinInvar
params.FP1pron1 = PronRadic..PronSufFemP..PronFinInvar
params.MS1pref1, params.MP1pref1, params.FS1pref1, params.FP1pref1 = prefpron_4(args)
if args then
params.MS1pron2 = args..PronSufMasS..PronFinInvar
params.MP1pron2 = args..PronSufMasP..PronFinInvar
params.FS1pron2 = args..PronSufFemS..PronFinInvar
params.FP1pron2 = args..PronSufFemP..PronFinInvar
params.MS1pref2, params.MP1pref2, params.FS1pref2, params.FP1pref2 = prefpron_4(args)
if args then
params.MS1pron3 = args..PronSufMasS..PronFinInvar
params.MP1pron3 = args..PronSufMasP..PronFinInvar
params.FS1pron3 = args..PronSufFemS..PronFinInvar
params.FP1pron3 = args..PronSufFemP..PronFinInvar
params.MS1pref3, params.MP1pref3, params.FS1pref3, params.FP1pref3 = prefpron_4(args)
end
end
end
-- génération du tableau
local resultat = tableau_generique_4(params)
-- catégorisation des pages qui utilisent l’ancienne syntaxe
if AncienneSyntaxe then
resultat = resultat .. ']'
end
return resultat
end
--=======================================================================================
-- Les fonctions spécialisées correspondant à chaque modèle d’accord.
-- Pour les paramètres de frame, voir la documentation du modèle correspondant.
--=======================================================================================
--=======================================================================================
function p.boite_ain_ains_aine_aines(frame) -- pour Modèle:fr-accord-ain
--=======================================================================================
-- 2014-12-02 GaAs : version initiale
-- 2023-12-09 Maëlan : factorisation
-----------------------------------------------------------------------------------------
-- récupération des paramètres passés au modèle
local args = frame:getParent().args
-- suffixe féminin avec un ou deux "n" selon le param
local SufFemS, SufFemP
if args then
SufFemS='ainne'
SufFemP='ainnes'
else
SufFemS='aine'
SufFemP='aines'
end
return boite_accord_4(frame, 'ain','ains',SufFemS,SufFemP, 'ɛ̃','ɛ̃','ɛn','ɛn', false)
end
--=======================================================================================
function p.boite_al_aux_ale_ales(frame) -- pour Modèle:fr-accord-al
--=======================================================================================
-- 2014-11-23 GaAs : version initiale
-- 2023-12-09 Maëlan : factorisation
-----------------------------------------------------------------------------------------
return boite_accord_4(frame, 'al','aux','ale','ales', 'al','o','al','al', true)
end
--=======================================================================================
function p.boite_an_ans_ane_anes(frame) -- pour Modèle:fr-accord-an
--=======================================================================================
-- 2015-01-22 GaAs : version initiale
-- 2023-12-09 Maëlan : factorisation
-----------------------------------------------------------------------------------------
-- récupération des paramètres passés au modèle
local args = frame:getParent().args
-- suffixe féminin avec un ou deux "n" selon le param
local SufFemS, SufFemP
if args then
SufFemS='anne'
SufFemP='annes'
else
SufFemS='ane'
SufFemP='anes'
end
return boite_accord_4(frame, 'an','ans',SufFemS,SufFemP, 'ɑ̃','ɑ̃','an','an', false)
end
--=======================================================================================
function p.boite_at_ats_atte_attes(frame) -- pour Modèle:fr-accord-at
--=======================================================================================
-- 2015-03-14 JackPotte : version initiale
-- 2023-12-09 Maëlan : factorisation
-----------------------------------------------------------------------------------------
return boite_accord_4(frame, 'at','ats','atte','attes', 'a','a','at','at', false)
end
--=======================================================================================
function p.boite_eau_eaux_elle_elles(frame) -- pour Modèle:fr-accord-eau
--=======================================================================================
-- 2014-12-07 GaAs : version initiale
-- 2023-12-09 Maëlan : factorisation
-----------------------------------------------------------------------------------------
return boite_accord_4(frame, 'eau','eaux','elle','elles', 'o','o','ɛl','ɛl', true)
end
--=======================================================================================
function p.boite_el_els_elle_elles(frame) -- pour Modèle:fr-accord-el
--=======================================================================================
-- 2015-01-26 GaAs : version initiale
-- 2023-12-09 Maëlan : factorisation
-----------------------------------------------------------------------------------------
return boite_accord_4(frame, 'el','els','elle','elles', 'ɛl','ɛl','ɛl','ɛl', false)
end
--=======================================================================================
function p.boite_en_ens_enne_ennes(frame) -- pour Modèle:fr-accord-en
--=======================================================================================
-- 2015-02-16 GaAs : version initiale
-- 2023-12-09 Maëlan : factorisation
-----------------------------------------------------------------------------------------
return boite_accord_4(frame, 'en','ens','enne','ennes', 'ɛ̃','ɛ̃','ɛn','ɛn', false)
end
--=======================================================================================
function p.boite_er_ers_ere_eres(frame) -- pour Modèle:fr-accord-er
--=======================================================================================
-- 2015-01-26 GaAs : version initiale
-- 2023-12-09 Maëlan : factorisation
-----------------------------------------------------------------------------------------
return boite_accord_4(frame, 'er','ers','ère','ères', 'e','e','ɛʁ','ɛʁ', true)
end
--=======================================================================================
function p.boite_et_ets_ette_ettes(frame) -- pour Modèle:fr-accord-et
--=======================================================================================
-- 2015-01-27 GaAs : version initiale
-- 2023-12-09 Maëlan : factorisation
-----------------------------------------------------------------------------------------
-- récupération des paramètres passés au modèle
local args = frame:getParent().args
-- suffixe féminin "ète" ou "ette" selon le param
local SufFemS, SufFemP
if args then
SufFemS='ète'
SufFemP='ètes'
else
SufFemS='ette'
SufFemP='ettes'
end
return boite_accord_4(frame, 'et','ets',SufFemS,SufFemP, 'ɛ','ɛ','ɛt','ɛt', false)
end
--=======================================================================================
function p.boite_in_ins_ine_ines(frame) -- pour Modèle:fr-accord-in
--=======================================================================================
-- 2015-02-27 GaAs : version initiale
-- 2023-12-09 Maëlan : factorisation
-----------------------------------------------------------------------------------------
-- récupération des paramètres passés au modèle
local args = frame:getParent().args
-- suffixe féminin avec un ou deux "n" selon le param
local SufFemS, SufFemP
if args then
SufFemS='inne'
SufFemP='innes'
else
SufFemS='ine'
SufFemP='ines'
end
return boite_accord_4(frame, 'in','ins',SufFemS,SufFemP, 'ɛ̃','ɛ̃','in','in', false)
end
--=======================================================================================
function p.boite_oin_oins_oine_oines(frame) -- pour Modèle:fr-accord-oin
--=======================================================================================
-- 2020-03-28 Urhixidur : version initiale
-- 2023-12-09 Maëlan : factorisation
-----------------------------------------------------------------------------------------
-- récupération des paramètres passés au modèle
local args = frame:getParent().args
-- suffixe féminin avec un ou deux "n" selon le param
local SufFemS, SufFemP
if args then
SufFemS='oinne'
SufFemP='oinnes'
else
SufFemS='oine'
SufFemP='oines'
end
return boite_accord_4(frame, 'oin','oins',SufFemS,SufFemP, 'wɛ̃','wɛ̃','wan','wan', false)
end
--=======================================================================================
function p.boite_ol_ols_olle_olles(frame) -- pour Modèle:fr-accord-ol
--=======================================================================================
-- 2020-07-01 Urhixidur : version initiale
-- 2023-12-09 Maëlan : factorisation
-----------------------------------------------------------------------------------------
return boite_accord_4(frame, 'ol','ols','olle','olles', 'ɔl','ɔl','ɔl','ɔl', false)
end
--=======================================================================================
function p.boite_on_ons_onne_onnes(frame) -- pour Modèle:fr-accord-on
--=======================================================================================
-- 2014-11-24 GaAs : version initiale
-- 2023-12-09 Maëlan : factorisation
-----------------------------------------------------------------------------------------
-- récupération des paramètres passés au modèle
local args = frame:getParent().args
-- suffixe féminin avec un ou deux "n" selon le param
local SufFemS, SufFemP
if args then
SufFemS='one'
SufFemP='ones'
else
SufFemS='onne'
SufFemP='onnes'
end
return boite_accord_4(frame, 'on','ons',SufFemS,SufFemP, 'ɔ̃','ɔ̃','ɔn','ɔn', false)
end
-- publication des fonctions publiques (pléonasme inside)
return p