Utilisateur:Chinedine/bac à sable/Module:el-décl-nom

-- Exemple d'utilisation

--

{{#invoke:el-décl-nom|ouranos|αριθμ}}

-- Principe: les déclinaisons régulières ont besoin de connaître: -- * le radical avec son accent premier (désinences courtes) -- * le radical avec l'accent sur la dernière syllabe (désinence longue) -- * le radical sans accent (désinence très longue) -- Le premier vient du titre de la page, le troisième est obtenu par simple remplacement -- le second se fait par remplacement. -- -- Librement inspiré de el:Module:el-nouns-decl

--

local p = {}

-- Fonction auxiliaire pour faire les lignes du tableau.
function ligne_tableau(cas, as, ms, ap, mp, ms2, mp2)
    local ligne = "|-"
    ligne = ligne .. "\r\n! " .. cas
    ligne = ligne .. '\r\n| class="colle-droite" | '
    if as ~= nil then
        ligne = ligne .. '<span lang="el" class="lang-el">' .. as .. '&nbsp;</span>'
    end
    ligne = ligne .. '\r\n| class="colle-gauche" | [[' .. ms .. '#el|' .. ms .. ']]'
    if ms2 ~= nil then
        ligne = ligne .. '<br />[[' .. ms2 .. '#el|' .. ms2 .. ']]'
    end
    ligne = ligne .. '\r\n| class="colle-droite" | '
    if ap ~= nil then
        ligne = ligne .. '<span lang="el" class="lang-el">' .. ap .. '&nbsp;</span>'
    end
    ligne = ligne .. '\r\n| class="colle-gauche" | [[' .. mp .. '#el|' .. mp .. ']]'
    if mp2 ~= nil then
        ligne = ligne .. '<br />[[' .. mp2 .. '#el|' .. mp2 .. ']]'
    end
    return ligne .. "\r\n"
end

-- Fonction de formatage principale. Les arguments sont des tables comportant
-- des champs ns/as/gs/vs et np/ap/gp/vp pour les différents cas.
function fait_tableau(art, mots, mots2)
    local tableau = [==[
{| class="flextable"
! Cas
! colspan="2" | Singulier
! colspan="2" | Pluriel
]==]
    tableau = tableau .. ligne_tableau("Nominatif", art.ns, mots.ns, art.np, mots.np, mots2.ns, mots2.np)
    tableau = tableau .. ligne_tableau("Génitif",   art.gs, mots.gs, art.gp, mots.gp, mots2.gs, mots2.gp)
    tableau = tableau .. ligne_tableau("Accusatif", art.as, mots.as, art.ap, mots.ap, mots2.as, mots2.ap)
    tableau = tableau .. ligne_tableau("Vocatif",      nil, mots.vs,    nil, mots.vp, mots2.vs, mots2.vp)
    return tableau .. "|}"
end

function lien_couleur(r, desinence)
    local des_couleur = '<font style="color:DeepPink">' .. desinence .. '</span>'
    return "[[" .. r .. desinence .. "|" .. r .. des_couleur .. "]]"
end

local accentue = {
   ['α']='ά',
   ['ε']='έ',
   ['η']='ή',
   ['ι']='ί',
   ['ϊ']='ΐ',
   ['ο']='ό',
   ['υ']='ύ',
   ['ϋ']='ΰ',
   ['ω']='ώ',
}

local sans_accents = {
   ['ά']='α',
   ['έ']='ε',
   ['ή']='η',
   ['ί']='ι',
   ['ΐ']='ϊ',
   ['ό']='ο',
   ['ύ']='υ',
   ['ΰ']='ϋ',
   ['ώ']='ω',
}

-- tronque retourne le mot sans sa desinence. En cas d'argument
-- invalide (si le mot ne termine pas par desinence), renvoie "ERREUR"
function tronque(mot, desinence)
    local l = mw.ustring.len(desinence)
    if mw.ustring.len(mot) < l then
        return "ERREUR"
    end
    if mw.ustring.sub(mot, -l, -1) ~= desinence then
        return "ERREUR"
    end
    return mw.ustring.sub(mot, 1, -l-1)
end

-- radicaux déplace l'accent de l'argument premier et renvoie
-- les trois variantes d'accentuation du radical.
-- Le déplacement peut faire apparaître un tréma:
-- άι -> αϊ (χάιδεμα: caresse)
-- έι -> εϊ (?)
-- όι -> οϊ (κορόιδεμα: moquerie)
-- ύι -> υϊ (?)
-- άυ -> αϋ (πράυνση)
-- έυ -> εϋ (?)
-- όυ -> οϋ (?)
function radicaux(premier)
    local r2 = ""
    local r3 = ""
    local voyelle = 0 -- indice de la dernière voyelle
    local i = 0
    -- on fait r3 en enlevant tous les accents
    for c in mw.ustring.gcodepoint(premier) do
    	c = mw.ustring.char(c)
    	i = i + 1
        c2 = sans_accents[c] -- TODO: implémenter le tréma
        if c2 == nil then c2 = c end
        if accentue[c2] ~= nil then voyelle = i end
        r3 = r3 .. c2
    end
    if voyelle == 0 then
    	r2 = premier
    else
    	local pre = mw.ustring.sub(r3, 1, voyelle-1)
    	local voy = mw.ustring.sub(r3, voyelle, voyelle)
    	local suf = mw.ustring.sub(r3, voyelle+1, -1)
    	if accentue[voy] ~= nil then voy = accentue[voy] end
    	r2 = pre .. voy .. suf
    end
    return premier, r2, r3
end

local artm = {
    ns = "ο",  as = "το(ν)", gs = "του",
    np = "οι", ap = "τους",  gp = "των",
}

local artf = {
    ns = "η",  as = "τη(ν)", gs = "της",
    np = "οι", ap = "τις",   gp = "των",
}

local artn = {
    ns = "το", as = "το", gs = "του",
    np = "τα", ap = "τα", gp = "των",
}

-- Déclinaisons de noms masculins.
-- - ouranos: ός accentué
-- - dromos/angelos: ος non accentué
-- - antilalos: ος accent fixe
-- - nikitis: ής accentué
-- - navtis: ης non accentué
-- - fylakas/agonas: ας non accentué
-- - balomatis/sfoungaras/kafes: imparisyllabiques oxytons
-- - manavis: imparisyllabique paroxyton

function p._ouranos(mot)
    local r = tronque(mot, "ός")
    local desinences = {
        ns = "ός", as = "ό",   gs = "ού", vs = "έ",
        np = "οί", ap = "ούς", gp = "ών", vp = "οί",
    }
    local formes = {}
    for cas, d in pairs(desinences) do
        formes[cas] = r .. d
    end
    return fait_tableau(artm, formes, {})
end

function p._angelos(mot)
    local radical = tronque(mot, "ος")
    local r1, r2, r3 = radicaux(radical)
    local formes = {
        ns = r1.."ος", as = r1.."ο",   gs = r2.."ου", vs = r1.."ε",
        np = r1.."οι", ap = r2.."ους", gp = r2.."ων", vp = r1.."οι",
    }
    return fait_tableau(artm, formes, {})
end

-- Mot sans déplacement d'accent.
function p._antilalos(mot)
    local r = tronque(mot, "ος")
    local formes = {
        ns = r.."ος", as = r.."ο",   gs = r.."ου", vs = r.."ε",
        np = r.."οι", ap = r.."ους", gp = r.."ων", vp = r.."οι",
    }
    return fait_tableau(artm, formes, {})
end

function p._nikitis(mot)
    local r = tronque(mot, "ής")
    local formes = {
        ns = r.."ής", as = r.."ή",  gs = r.."ή",  vs = r.."ή",
        np = r.."ές", ap = r.."ές", gp = r.."ών", vp = r.."ές",
    }
    return fait_tableau(artm, formes, {})
end

function p._navtis(mot)
    local r1, r2, r3 = radicaux(tronque(mot, "ης"))
    local formes = {
        ns = r1.."ης", as = r1.."η",  gs = r1.."η",  vs = r1.."η",
        np = r1.."ες", ap = r1.."ες", gp = r3.."ών", vp = r1.."ες",
    }
    return fait_tableau(artm, formes, {})
end

function p._fylakas(mot)
    local r1, r2, r3 = radicaux(tronque(mot, "ας"))
    local formes = {
        ns = r1.."ας", as = r1.."α",  gs = r1.."α",  vs = r1.."α",
        np = r1.."ες", ap = r1.."ες", gp = r2.."ων", vp = r1.."ες",
    }
    return fait_tableau(artm, formes, {})
end

function p._impari_masc(mot)
    local r = tronque(mot, "ς")
    local formes = {
        ns = r.."ς", as = r.."",  gs = r.."",  vs = r.."",
        np = r.."δες", ap = r.."δες", gp = r.."δων", vp = r.."δες",
    }
    return fait_tableau(artm, formes, {})
end

-- Les fonctions à utiliser en temps normal (utilisent le titre de page).
function p.ouranos(frame) return p._ouranos(mw.title.getCurrentTitle().baseText) end
function p.dromos(frame)  return p._angelos(mw.title.getCurrentTitle().baseText) end
function p.angelos(frame) return p._angelos(mw.title.getCurrentTitle().baseText) end -- alias
function p.antilalos(frame) return p._antilalos(mw.title.getCurrentTitle().baseText) end
function p.nikitis(frame) return p._nikitis(mw.title.getCurrentTitle().baseText) end
function p.navtis(frame)  return p._navtis (mw.title.getCurrentTitle().baseText) end
function p.fylakas(frame) return p._fylakas(mw.title.getCurrentTitle().baseText) end
function p.agonas(frame)  return p._fylakas(mw.title.getCurrentTitle().baseText) end -- alias
function p.balomatis(frame)  return p._impari_masc(mw.title.getCurrentTitle().baseText) end -- variante en η
function p.sfoungaras(frame) return p._impari_masc(mw.title.getCurrentTitle().baseText) end -- variante en α
function p.kafes(frame)      return p._impari_masc(mw.title.getCurrentTitle().baseText) end -- variante en ε
function p.manavis(frame)    return p._impari_masc(mw.title.getCurrentTitle().baseText) end -- variante en η proparoxyton

-- Modèles de déclinaison de noms féminins
-- - kardia: ά oxyton
-- - ora/thalassa: α non accentué, -ών
-- - elpida/salpigga: α non accentué, -ων non accentué
-- - psychi: ή oxyton
-- - niki: η, -ών
-- - diametros: ος non accentué
-- - skepsi/dynami: η, -εως
-- - giagia/alepou: imparisyllabiques

function p._kardia(mot)
    local r = tronque(mot, "ά")
    local formes = {
        ns = r.."ά",  as = r.."ά",  gs = r.."άς", vs = r.."ά",
        np = r.."ές", ap = r.."ές", gp = r.."ών", vp = r.."ές",
    }
    return fait_tableau(artf, formes, {})
end

function p._ora(mot)
    local r1, r2, r3 = radicaux(tronque(mot, "α"))
    local formes = {
        ns = r1.."α",  as = r1.."α",  gs = r1.."ας", vs = r1.."α",
        np = r1.."ες", ap = r1.."ες", gp = r3.."ών", vp = r1.."ες",
    }
    return fait_tableau(artf, formes, {})
end

function p._elpida(mot)
    local r1, r2, r3 = radicaux(tronque(mot, "α"))
    local formes = {
        ns = r1.."α",  as = r1.."α",  gs = r1.."ας", vs = r1.."α",
        np = r1.."ες", ap = r1.."ες", gp = r2.."ων", vp = r1.."ες",
    }
    return fait_tableau(artf, formes, {})
end

function p._psychi(mot)
    local r = tronque(mot, "ή")
    local formes = {
        ns = r.."ή",  as = r.."ή",  gs = r.."ής", vs = r.."ή",
        np = r.."ές", ap = r.."ές", gp = r.."ών", vp = r.."ές",
    }
    return fait_tableau(artf, formes, {})
end

function p._niki(mot)
    local r1, r2, r3 = radicaux(tronque(mot, "η"))
    local formes = {
        ns = r1.."η",  as = r1.."η",  gs = r1.."ης", vs = r1.."η",
        np = r1.."ες", ap = r1.."ες", gp = r3.."ών", vp = r1.."ες",
    }
    return fait_tableau(artf, formes, {})
end

function p._dynami(mot)
    local r1, r2, r3 = radicaux(tronque(mot, "η"))
    local formes = {
        ns = r1.."η",   as = r1.."η",   gs = r1.."ης",  vs = r1.."η",
        np = r2.."εις", ap = r2.."εις", gp = r2.."εων", vp = r2.."εις",
    }
    return fait_tableau(artf, formes, {gs = r2.."εως"})
end

function p._giagia(r)
    local formes = {
        ns = r, as = r, gs = r.."ς",  vs = r,
        np = r.."δες", ap = r.."δες", gp = r.."δων", vp = r.."δες",
    }
    return fait_tableau(artf, formes, {})
end

function p.kardia(frame)   return p._kardia(mw.title.getCurrentTitle().baseText) end -- ά
function p.ora(frame)      return p._ora   (mw.title.getCurrentTitle().baseText) end -- α
function p.thalassa(frame) return p._ora   (mw.title.getCurrentTitle().baseText) end -- α
function p.elpida(frame)   return p._elpida(mw.title.getCurrentTitle().baseText) end -- α < 3e décl.
function p.salpigga(frame) return p._elpida(mw.title.getCurrentTitle().baseText) end -- α < 3e décl.
function p.psychi(frame)   return p._psychi(mw.title.getCurrentTitle().baseText) end -- ή
function p.niki(frame)     return p._niki  (mw.title.getCurrentTitle().baseText) end -- η
function p.dynami(frame)   return p._dynami(mw.title.getCurrentTitle().baseText) end -- η/εις
function p.skepsi(frame)   return p._dynami(mw.title.getCurrentTitle().baseText) end -- η/εις
function p.giagia(frame)   return p._giagia(mw.title.getCurrentTitle().baseText) end -- pluriel δες
function p.alepou(frame)   return p._giagia(mw.title.getCurrentTitle().baseText) end -- pluriel δες

-- Modèles de noms neutres
-- bouno: ό oxyton
-- pevko: ο accent fixe
-- prosopo: -ο accent qui descend
-- provato: -ο accent qui descend optionnellement
-- paidi: -ί oxyton
-- tragoudi: -ι gén. -ιού
-- kyma/onoma: -μα/-ματα
-- desimo: -μο/-ματα
-- meros/edafos: -ος gén. -ους
-- anthos: -ος gén.pl. -έων
-- kreas:  -ας/-ατα
-- mellon: -ον/-οντα

function p._bouno(mot)
    local r = tronque(mot, "ό")
    local formes = {
        ns = r.."ό", as = r.."ό", gs = r.."ού", vs = r.."ό",
        np = r.."ά", ap = r.."ά", gp = r.."ών", vp = r.."ά",
    }
    return fait_tableau(artn, formes, {})
end

function p._onoma(mot)
    local r1, r2, r3 = radicaux(tronque(mot, "α"))
	local formes = {
        ns = r1.."α",   as = r1.."α",   gs = r2.."ατος", vs = r1.."α",
        np = r2.."ατα", ap = r2.."ατα", gp = r3.."άτων", vp = r2.."ατα",
    }
    return fait_tableau(artn, formes, {})
end

function p._meros(mot)
    local r1, r2, r3 = radicaux(tronque(mot, "ος"))
	local formes = {
        ns = r1.."ος", as = r1.."oς", gs = r2.."ους", vs = r1.."ος",
        np = r2.."η",  ap = r2.."η",  gp = r3.."ών",  vp = r2.."η",
    }
    return fait_tableau(artn, formes, {})
end

function p.bouno(frame)  return p._bouno(mw.title.getCurrentTitle().baseText) end -- -ό
function p.kyma(frame)   return p._onoma(mw.title.getCurrentTitle().baseText) end -- -μα
function p.onoma(frame)  return p._onoma(mw.title.getCurrentTitle().baseText) end -- -μα
function p.meros(frame)  return p._meros(mw.title.getCurrentTitle().baseText) end -- -ος
function p.edafos(frame) return p._meros(mw.title.getCurrentTitle().baseText) end -- -ος

-- Fonctions de test.

function p.test(frame)
	return p._ouranos("ουρανός") .. "\r\n" ..
	       p._angelos("λόγος") .. "\r\n" ..
	       p._angelos("άνθρωπος") .. "\r\n" ..
	       p._antilalos("αντίλαλος") .. "\r\n" ..
	       p._nikitis("νικητής") .. "\r\n" ..
	       p._impari_masc("μπαλοματής") .. "\r\n" ..
	       p._navtis("μετανάστης") .. "\r\n" ..
	       p._impari_masc("μανάβης") .. "\r\n" ..
	       p._fylakas("αγώνας") .. "\r\n" ..
	       p._fylakas("φύλακας") .. "\r\n" ..
	       p._impari_masc("σφουγγαράς") .. "\r\n" ..
	       p._impari_masc("καφές") .. "\r\n" ..
               p._kardia("καρδιά") .. "\r\n" ..
	       p._ora("ώρα") .. "\r\n" ..
	       p._ora("θάλασσα") .. "\r\n" ..
               p._elpida("ελπίδα") .. "\r\n" ..
               p._elpida("σάλπιγγα") .. "\r\n" ..
               p._dynami("δύναμη") .. "\r\n" ..
               p._dynami("σκέψη") .. "\r\n" ..
               p._giagia("γιαγιά") .. "\r\n" ..
               p._giagia("αλεπού") .. "\r\n" ..
               p._bouno("βουνό") .. "\r\n" ..
               p._onoma("κύμα") .. "\r\n" ..
               p._onoma("όνομα") .. "\r\n" ..
               p._meros("μέρος") .. "\r\n" ..
               p._meros("έδαφος") .. "\r\n"
end

function p.test_radicaux(frame)
    local ret = ""
	local r1, r2, r3 = radicaux("δύναμ") -- δύναμ δυνάμ δυναμ
	ret = r1 .. " " .. r2 .. " " .. r3 .. "\r\n"
	r1, r2, r3 = radicaux("όνομ") -- όνομ ονόμ ονομ
	ret = ret .. r1 .. " " .. r2 .. " " .. r3 .. "\r\n"
	r1, r2, r3 = radicaux("πόλ") -- πόλ πόλ πολ
	ret = ret .. r1 .. " " .. r2 .. " " .. r3 .. "\r\n"
	r1, r2, r3 = radicaux("έτ") -- έτ έτ ετ
	ret = ret .. r1 .. " " .. r2 .. " " .. r3 .. "\r\n"
	r1, r2, r3 = radicaux("φ") -- φ φ φ
	ret = ret .. r1 .. " " .. r2 .. " " .. r3 .. "\r\n"
	r1, r2, r3 = radicaux("ί") -- ί ί ι
	ret = ret .. r1 .. " " .. r2 .. " " .. r3 .. "\r\n"
	return ret
end

return p

--