Module:anagrammes

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

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

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

local p = {}

--- Normalize a string before building its alphagramme.
--- @param langCode string Language code.
--- @param s string The string.
--- @return string The same string with all diacritics stripped.
local function normalize(langCode, s)
  local langConfig
  local dataModuleTitle = "Module:anagrammes/" .. langCode
  if mw.title.new(dataModuleTitle).exists then
    langConfig = require(dataModuleTitle)
  else
    langConfig = {
      keep = {},
      mappings = {},
    }
  end
  local res = mw.ustring.gsub(mw.ustring.lower(s), "%w", function(c)
    if m_table.contains(langConfig.keep, c) then
      return c
    else
      -- Decompose the character into NFD form (base letter followed by eventual combining diacritics)
      -- then keep only the letter (first char)
      return mw.ustring.sub(mw.ustring.toNFD(c), 1, 1)
    end
  end)
  for k, v in pairs(langConfig.mappings) do
    res = mw.ustring.gsub(res, k, v)
  end
  return res
end

local function _toTable(langCode, title, rawTable)
  local i = 1
  local maxLinks = 200
  local alphasTable = {}
  local paramsTable = {}
  local alpha_title = mw.ustring.gsub(normalize(langCode, title), "[%p%s]", "")

  while rawTable[i] ~= nil and i <= maxLinks do
    local item = mw.text.trim(rawTable[i])

    local alpha = mw.ustring.gsub(normalize(langCode, item), "[%p%s]", "")
    if alpha ~= alpha_title then
      if paramsTable[alpha] ~= nil then
        paramsTable[alpha] = mw.ustring.format("%s, [[%s#%s|%s]]", paramsTable[alpha], item, langCode, item)
      else
        table.insert(alphasTable, alpha)
        paramsTable[alpha] = "[[" .. item .. "#" .. langCode .. "|" .. item .. "]]"
      end
    end
    i = i + 1
  end

  return alphasTable, paramsTable
end

local function _getValues(alphas, args)
  local values = {}
  for _, alpha in pairs(alphas) do
    table.insert(values, args[alpha])
  end
  return values
end

local function _buildListText(list)
  local text

  if #list > 0 then
    text = "* " .. table.concat(list, "\n* ")
  else
    text = "(Merci de rajouter les articles en paramètres, ou à défaut d’enlever ce modèle)"
    text = text .. m_bases.fait_categorie_contenu("Modèle anagramme sans paramètre valide")
  end

  return text
end

local function _makeText(langCode, title, values)
  local alphas, args = _toTable(langCode, title, values)
  return _buildListText(_getValues(alphas, args))
end

--- Invoqué par [[Modèle:anagrammes]].
--- Params:
--- - frame.args["lang"]: Code de langue.
function p.listeAnagrammes(frame)
  local args = frame:getParent().args
  local langCode = args["lang"]
  local title = mw.title.getCurrentTitle()
  local text = _makeText(langCode, title.fullText, args)
  -- Catégorisation des sous-modèles de [[Modèle:anagrammes]]
  local pattern = mw.ustring.format("^Modèle:anagrammes/%s/(.+)", mw.ustring.gsub(langCode, "%-", "%-"))
  local _, _, match = mw.ustring.find(title.fullText, pattern)
  if match then
    text = text .. mw.ustring.format(
        "[[Catégorie:Modèles d’anagramme en %s|%s]]",
        m_langues.get_nom(langCode),
        match
    )
  end
  return text
end

--- Invoqué par [[Modèle:voir anagrammes]].
--- - frame.args[1]: Code de langue.
--- - frame.args[2]: Texte dont il faut calculer l’alphagramme.
function p.alphagramme(frame)
  local args = m_params.process(frame.args, {
    [1] = { },
    [2] = { },
  })

  local langCode = args[1]
  if langCode == nil then
    return '<span style="color:red">Code de langue absent !</span>[[Catégorie:Appel au modèle voir anagrammes sans code de langue]]'
  end

  local pageName = mw.ustring.gsub(normalize(langCode, args[2]), "[%p%s]", "")
  local tablePageName = {}

  -- Sépare le mot, caractère par caractère
  mw.ustring.gsub(pageName, ".", function(c)
    table.insert(tablePageName, c)
  end)
  -- Trie les lettres
  table.sort(tablePageName)

  local alphagramme = table.concat(tablePageName, "")
  local templateName = mw.ustring.format("anagrammes/%s/%s", langCode, alphagramme)

  if mw.title.new("Modèle:" .. templateName).exists then
    return mw.ustring.format("→ [[Spécial:EditPage/Modèle:%s|Modifier la liste d’anagrammes]]", templateName)
        .. frame:expandTemplate { title = templateName }
  end
  return mw.ustring.format(
      '<span style="color:red">Le modèle d’anagrammes n’existe pas. '
          .. 'Cliquez [[Modèle:%s|ici]] pour le créer.</span>'
          .. '[[Catégorie:Pages avec modèle d’anagrammes manquant en %s]]',
      templateName,
      m_langues.get_nom(langCode)
  )
end

return p