Module:Prononciation

Documentation for this module may be created at Module:Prononciation/doc

local m_params = require("Module:paramètres")
local m_langues = require("Module:langues")
local m_bases = require("Module:bases")

local export = {}

--- Page principale des annexes de prononciations
export.racine_pron = 'Annexe:Prononciation'

--- Retourne la page de l’annexe de prononciation pour une langue donnée.
--- @param lang_code string le code de langue
--- @return string|nil la page de prononciation si elle existe, nil sinon
function export.page_pron(lang_code)
  local lang_name = m_langues.get_nom(lang_code)

  if lang_name then
    local pron_page = export.racine_pron .. '/' .. lang_name
    if m_bases.page_existe(export.racine_pron .. '/' .. lang_name) then
      return pron_page
    end
  end

  return nil
end

--- Met en forme une prononciation avec un lien vers l’annexe dédiée si elle existe.
--- Cette fonction destinée à être appelée par d’autres modules lua.
--- @param pron string la prononciation API ; si la valeur "-" est passé, la prononciation n’est pas affichée
--- @param lang_code string le code de la langue ; s’il est absent, un message d’erreur est affichée à la place de la prononciation et la page est catégorisée dans Wiktionnaire:Prononciations avec langue manquante
--- @param delimiters string les délimiteurs ("[]", "//" ou "\\") ; la valeur par défaut est "\\"
--- @param is_audio_linked boolean indique si un fichier audio est associé à la prononciation pour ajouter la catégorie adéquate
--- @return string la prononciation formatée
function export.lua_pron(pron, lang_code, delimiters, is_audio_linked)
  delimiters = delimiters or '\\\\' -- valeur par défaut
  is_audio_linked = is_audio_linked or false -- valeur par défaut
  local delimiter1 = string.sub(delimiters, 1, 1)
  local delimiter2 = string.sub(delimiters, 2, 2)
  local lang_name = m_langues.get_nom(lang_code)
  local current_page_title = mw.title.getCurrentTitle()

  if not lang_code or lang_code == '' or not lang_name then
    return m_bases.fait_categorie_contenu("Wiktionnaire:Prononciations avec langue manquante") .. [[<span style="color:red">'''Erreur sur la langue !'''</span>]]
  end

  local text = ""

  -- Pas de prononciation donnée : invite + catégorie
  if not pron or pron == '' then
    -- Invitation à ajouter la prononciation
    text = ('<span title="Prononciation à préciser">' .. delimiter1 .. '<small><span class="plainlinks stubedit">['
        .. tostring(mw.uri.fullUrl(current_page_title.fullText, 'action=edit'))
        .. ' Prononciation ?]</span></small>' .. delimiter2 .. '</span>')

    -- Catégorisation de cette absence de prononciation
    local category_lang = lang_name and ('en ' .. lang_name) or 'sans langue précisée'
    local category_name = 'Prononciations '
    if is_audio_linked then
      category_name = category_name .. 'phonétiques'
    end
    category_name = category_name .. ' manquantes ' .. category_lang
    local category = m_bases.fait_categorie_contenu('Wiktionnaire:' .. category_name)
    if category then
      text = text .. category
    end
  elseif pron ~= '-' then
    -- Page d’aide de la prononciation dans la langue donnée
    local pron_page = export.page_pron(lang_code) or export.racine_pron
    -- On affiche la prononciation avec le lien vers la page d’aide
    text = '[[' .. pron_page .. '|<span class="API" title="Prononciation API">' .. delimiter1 .. pron .. delimiter2 .. '</span>]]'
  end

  return text
end

--- Extrait les paramètres de l’objet frame.
--- Lance une erreur si les paramètres ne sont pas corrects, sauf si uniquement la langue est erronée ou absente.
--- @param frame table le 1er paramètre est la prononciation en API, le 2e le code de la langue
--- @return table|nil,boolean les paramètres si la langue est correcte, nil sinon ; un booléen indiquant si la langue est correctement renseignée
local function get_params(frame)
  local params = {
    [1] = { required = true, allow_empty = true },
    [2] = { required = true },
    ["pron"] = { alias_of = 1 },
    ["lang"] = { alias_of = 2 },
  }
  local args, success = m_params.process(frame:getParent().args, params, true)
  if success then
    return { args[1], args[2] }, true
  elseif args[1] == 2 and (args[2] == m_params.EMPTY_PARAM or args[2] == m_params.MISSING_PARAM) then
    return nil, false
  end
  error(args[3])
end

--- Fonction qui récupère les paramètres de l’objet frame et retourne la pronoctiation formatée.
--- @param frame table le 1er paramètre est la prononciation en API, le 2e le code de la langue
--- @param delimiters string les délimiteurs ("[]", "//" ou "\\")
--- @return string la prononciation formatée
local function pronunciation(frame, delimiters)
  local args, success = get_params(frame)
  local api_pron = ""
  local lang_code = ""

  if success then
    api_pron = args[1]
    lang_code = args[2]
  end

  return export.lua_pron(api_pron, lang_code, delimiters)
end

--- Fonction destinée à être utilisée directement depuis le modèle pron.
--- @param frame table le 1er paramètre est la prononciation en API, le 2e le code de la langue
function export.pron(frame)
  return pronunciation(frame, '\\\\')
end

--- Fonction destinée à être utilisée directement depuis le modèle phon.
--- @param frame table le 1er paramètre est la prononciation en API, le 2e le code de la langue
function export.phon(frame)
  -- Prononciation entre crochets
  return pronunciation(frame, '[]')
end

--- Fonction destinée à être utilisée directement depuis le modèle phono.
--- @param frame table le 1er paramètre est la prononciation en API, le 2e le code de la langue
function export.phono(frame)
  -- Prononciation entre barres obliques
  return pronunciation(frame, '//')
end

--- Fonction destinée à être utilisée directement depuis le modèle écouter.
--- @param frame table Paramètres :
--- 1 = pays/région
--- 2 ou pron = prononciation en API
--- 3 ou lang = code ISO de la langue (obligatoire)
--- audio = nom du fichier audio (sans le préfixe File:)
--- titre = texte prononcé si différent du mot vedette
function export.pron_reg(frame)
  local params = {
    [1] = { default = '<small>(Région à préciser)</small>' },
    [2] = {},
    [3] = { required = true },
    ["pron"] = { alias_of = 2 },
    ["lang"] = { alias_of = 3 },
    ["audio"] = {},
    ["titre"] = { default = mw.title.getCurrentTitle().text },
  }
  local args = m_params.process(frame:getParent().args, params)
  local country = args[1]
  local pron = args[2]
  local lang_code = args[3]
  local audio_file = args["audio"]
  local title = args["titre"]

  -- Génération du wikicode
  local text = country .. ' : '

  if pron or audio_file then
    if audio_file and audio_file ~= '' then
      text = text .. 'écouter « ' .. title
      if lang_code and mw.title.getCurrentTitle().namespace == 0 then
        local lang_name = m_langues.get_nom(lang_code)
        if lang_name then
          text = text .. '[[Catégorie:Prononciations audio en ' .. lang_name .. ']]'
        else
          text = text .. '[[Catégorie:Prononciations audio sans langue précisée]]'
        end
      end
      text = text .. ' ' .. export.lua_pron(pron, lang_code, '[]', true)
      text = text .. ' »[[File:' .. audio_file .. ']]'
    else
      text = text .. export.lua_pron(pron, lang_code, '[]', true)
    end
  else
    text = text .. '<small>merci de préciser une prononciation phonétique ou un fichier audio (voir la [[Modèle:écouter|notice]])</small>'
  end

  return text
end

--- Fonction destinée à être utilisée directement depuis le modèle h aspiré.
--- Pour les paramètres, voir la doc du modèle h_aspiré (c'est un peu compliqué).
function export.h_aspire(frame)
  local params = {
    ["nocat"] = { type = "boolean" },
  }
  local args = m_params.process(frame:getParent().args, params)
  local nocat = args["nocat"]
  local txt = '<sup style="font-size:83.33%;line-height:1"><small>([[h aspiré]])</small></sup>'

  -- catégorisation si dans "principal" (namespace = 0)
  if mw.title.getCurrentTitle().namespace == 0 and not nocat then
    txt = txt .. '[[Catégorie:Termes en français à h aspiré]]'
  end

  return txt
end

return export