Aller au contenu

Module:eo-flexions

Définition, traduction, prononciation, anagramme et synonyme sur le dictionnaire libre Wiktionnaire.

La documentation pour ce module peut être créée à Module:eo-flexions/Documentation

local m_bases = require('Module:bases')
local m_pron = require('Module:prononciation')

local p = {}

-- Calcule la forme nominative singulière d'un nom ou d'un adjectif
function p.get_ns(word)
  return mw.ustring.match(word, '^(.+[oau])j?n?$')
end

-- Ajoute la terminaison au radical.
-- Prend en charge les locutions
function p.conjugator(word, term, args)
  local t = {}
  if args['dern'] then
    return word .. term
  end
  for str in mw.ustring.gmatch(word, '([^ ]+)') do
    t[#t + 1] = str .. term
  end
  return table.concat(t, ' ')
end

-- Calcule les flexions, puis retourne un tableau
function p.get_forms(name, args)
  local forms = {
    ['sing_nom'] = '',
    ['plur_nom'] = '',
    ['sing_acc'] = '',
    ['plur_acc'] = ''
  }

  if name == nil or name == '' then
    return forms
  end

  name = p.get_ns(name) or args['name'] or args['ns'] or mw.title.getCurrentTitle().text
  forms.sing_nom = name
  forms.plur_nom = args[2] or p.conjugator(name, 'j', args)
  forms.sing_acc = args[3] or p.conjugator(name, 'n', args)
  forms.plur_acc = args[4] or p.conjugator(name, 'jn', args)

  return forms
end

-- Calcule les prononciations, puis retourne un tableau
function p.get_pronunciations(args)
  local prons = {
    ['sing_nom'] = '',
    ['plur_nom'] = '',
    ['sing_acc'] = '',
    ['plur_acc'] = ''
  }
  local pron = args[1] or args['pron'] or args['pron1'] or ''

  if pron == nil or pron == '' then
    return prons
  end

  pron = p.get_ns(pron)
  prons.sing_nom = args['pron1'] or pron
  prons.plur_nom = args['pron2'] or p.conjugator(pron, 'j', args)
  prons.sing_acc = args['pron3'] or p.conjugator(pron, 'n', args)
  prons.plur_acc = args['pron4'] or p.conjugator(pron, 'jn', args)

  return prons
end

function p.make_table(name, forms, pron_forms, args)
  local t = {}
  local last_letter = mw.ustring.sub(name, -1)

  local categories = ""

  table.insert(t, "{| class=\"flextable flextable-eo\"\n" ..
      "! Cas\n")
  if not args['plur'] then
    table.insert(t, "! Singulier\n")
  end
  if not args['sing'] then
    table.insert(t, "! Pluriel\n")
  end
  table.insert(t, "|-\n" ..
      "! Nominatif\n")
  if not args['plur'] then
    table.insert(t, "| class=\"sing_nom\" | " .. m_bases.lien_modele(forms.sing_nom, 'eo') .. "<br>" .. m_pron.lua_pron({ pron_forms.sing_nom }, 'eo') .. "\n")
  end
  if not args['sing'] then
    table.insert(t, "| class=\"plur_nom\" | " .. m_bases.lien_modele(forms.plur_nom, 'eo') .. "<br>" .. m_pron.lua_pron({ pron_forms.plur_nom }, 'eo') .. "\n")
    if not m_bases.page_existe(forms.plur_nom) and (last_letter == "a" or last_letter == "o") then
      categories = categories .. "[[Catégorie:Wiktionnaire:Nominatifs pluriels manquants en espéranto]]"
    end
  end
  table.insert(t, "|-\n")
  if args['dir'] then
    table.insert(t, "! Accusatif<br>(''direction'')\n")
  elseif args['dir+'] then
    table.insert(t, "! Accusatif<br>(''+ direction'')\n")
  else
    table.insert(t, "! Accusatif\n")
  end
  if not args['plur'] then
    table.insert(t, "| class=\"sing_acc\" | " .. m_bases.lien_modele(forms.sing_acc, 'eo') .. "<br>" .. m_pron.lua_pron({ pron_forms.sing_acc }, 'eo') .. "\n")
    if not m_bases.page_existe(forms.sing_acc) and (last_letter == "a" or last_letter == "o") then
      categories = categories .. "[[Catégorie:Wiktionnaire:Accusatifs singuliers manquants en espéranto]]"
    end
  end
  if not args['sing'] then
    table.insert(t, "| class=\"plur_acc\" | " .. m_bases.lien_modele(forms.plur_acc, 'eo') .. "<br>" .. m_pron.lua_pron({ pron_forms.plur_acc }, 'eo') .. "\n")
    if not m_bases.page_existe(forms.plur_acc) and (last_letter == "a" or last_letter == "o") then
      categories = categories .. "[[Catégorie:Wiktionnaire:Accusatifs pluriels manquants en espéranto]]"
    end
  end
  table.insert(t, "|}")

  return table.concat(t) .. categories
end

function p.declinaison(frame)
  local args = frame:getParent().args
  local name = args['name'] or args['ns'] or args['n'] or mw.title.getCurrentTitle().text

  local forms = p.get_forms(name, args)
  local pron_forms = p.get_pronunciations(args)

  return p.make_table(name, forms, pron_forms, args)
end

function p.getTenseAndRoot(verb)
  if verb:sub(-mw.ustring.len("i")) == "i" then
    return verb, "Infinitif"
  elseif verb:sub(-mw.ustring.len("as")) == "as" then
    return mw.ustring.match(verb, '^(.+)as$') .. "i", "Présent de l’indicatif"
  elseif verb:sub(-mw.ustring.len("is")) == "is" then
    return mw.ustring.match(verb, '^(.+)is$') .. "i", "Passé de l’indicatif"
  elseif verb:sub(-mw.ustring.len("os")) == "os" then
    return mw.ustring.match(verb, '^(.+)os$') .. "i", "Futur de l’indicatif"
  elseif verb:sub(-mw.ustring.len("us")) == "us" then
    return mw.ustring.match(verb, '^(.+)us$') .. "i", "Conditionnel"
  elseif verb:sub(-mw.ustring.len("u")) == "u" then
    return mw.ustring.match(verb, '^(.+)u$') .. "i", "Volitif"
  elseif verb:sub(-mw.ustring.len("inta")) == "inta" then
    return mw.ustring.match(verb, '^(.+)inta$') .. "i", "Participe actif passé"
  elseif verb:sub(-mw.ustring.len("anta")) == "anta" then
    return mw.ustring.match(verb, '^(.+)anta$') .. "i", "Participe actif présent"
  elseif verb:sub(-mw.ustring.len("onta")) == "onta" then
    return mw.ustring.match(verb, '^(.+)onta$') .. "i", "Participe actif futur"
  elseif verb:sub(-mw.ustring.len("ita")) == "ita" then
    return mw.ustring.match(verb, '^(.+)ita$') .. "i", "Participe passif passé"
  elseif verb:sub(-mw.ustring.len("ata")) == "ata" then
    return mw.ustring.match(verb, '^(.+)ata$') .. "i", "Participe passif présent"
  elseif verb:sub(-mw.ustring.len("ota")) == "ota" then
    return mw.ustring.match(verb, '^(.+)ota$') .. "i", "Participe passif futur"
  else
    error("Unknown verb tense")
  end
end

function p.verbe(frame)
  local args = frame:getParent().args
  local verb = args['verb'] or mw.title.getCurrentTitle().text
  local label = args['label'] or mw.title.getCurrentTitle().text
  local root, tense = p.getTenseAndRoot(verb)

  local cat = ""

  if not m_bases.page_existe("Conjugaison:espéranto/" .. root) and mw.ustring.sub(verb, -1) == "i" then
    cat = "[[Catégorie:Wiktionnaire:Conjugaisons manquantes en espéranto]]"
  end

  return "{| class=\"flextable\"\n" ..
      "! colspan=\"2\"|<small>[[Conjugaison:espéranto/" .. root .. "|Voir la conjugaison du verbe ''" .. root .. "'']]</small>\n" ..
      "|-\n" ..
      "| style=\"font-variant:small-caps;text-align:center;vertical-align:top\"|" .. tense .. "\n" ..
      "| " .. label .. "\n" ..
      "|}" .. cat
end

return p