Aller au contenu

Module:Marquage type d'apparition

De Stargate Wiki Sémantique
Version datée du 16 juin 2026 à 19:18 par LIMAFOX76 (discussion | contributions)
(diff) ← Version précédente | Version actuelle (diff) | Version suivante → (diff)
Documentation icon Documentation module[créer]
local p = {}

----------------------------------------------------------------------
-- 1) Nettoyage UTF‑8 : supprime les séquences invalides (anti-crash)
----------------------------------------------------------------------
local function safe_utf8(str)
    if type(str) ~= "string" then
        return ""
    end

    -- Remplace toute séquence UTF‑8 invalide par un espace
    str = mw.ustring.gsub(str, "[^\0-\x7F\xC2-\xF4][\x80-\xBF]*", " ")

    return str
end

----------------------------------------------------------------------
-- 2) Normalisation avancée : trim, minuscules, accents, tirets, espaces
----------------------------------------------------------------------
local function normalize(str)
    str = safe_utf8(str or "")

    -- Trim
    str = mw.text.trim(str)

    -- Minuscules Unicode
    str = mw.ustring.lower(str)

    -- Tirets / underscores → espace
    str = str:gsub("[%-%_]", " ")

    -- Décomposition Unicode
    str = mw.ustring.toNFD(str)

    -- Suppression des diacritiques
    str = str:gsub("[%pM]", "")

    -- Espaces multiples
    str = str:gsub("%s+", " ")

    return str
end

----------------------------------------------------------------------
-- 3) Table des alias → catégories normalisées
----------------------------------------------------------------------
local alias = {
    -- Principal
    ["m"] = "principal",
    ["main"] = "principal",
    ["main character"] = "principal",
    ["p"] = "principal",
    ["principal"] = "principal",
    ["personnage principal"] = "principal",

    -- Secondaire
    ["s"] = "secondaire",
    ["su"] = "secondaire",
    ["supporting"] = "secondaire",
    ["supporting character"] = "secondaire",
    ["se"] = "secondaire",
    ["secondaire"] = "secondaire",
    ["ps"] = "secondaire",
    ["personage secondaire"] = "secondaire",

    -- Récurrent
    ["re"] = "recurrent",
    ["recurring"] = "recurrent",
    ["recurring character"] = "recurrent",
    ["recurrent"] = "recurrent",
    ["recurent"] = "recurrent",
    ["personnage recurrent"] = "recurrent",

    -- One-shot
    ["os"] = "oneshot",
    ["one shot"] = "oneshot",
    ["one shot character"] = "oneshot",
    ["one-shot"] = "oneshot",
    ["personnage one shot"] = "oneshot",

    -- Mineur
    ["mi"] = "mineur",
    ["minor"] = "mineur",
    ["minor character"] = "mineur",
    ["mineur"] = "mineur",
    ["personnage mineur"] = "mineur",

    -- Booléens (yes/true)
    ["y"] = "true",
    ["yes"] = "true",
    ["t"] = "true",
    ["true"] = "true",
    ["o"] = "true",
    ["oui"] = "true",
    ["v"] = "true",
    ["vrai"] = "true",

    -- Mentionné
    ["me"] = "mention",
    ["men"] = "mention",
    ["mention"] = "mention",
    ["mentioned"] = "mention",
    ["mentionne"] = "mention",

    -- Photo seule
    ["picture"] = "photo",
    ["photo"] = "photo",

    -- Voix seule
    ["voice"] = "voix",
    ["voix"] = "voix",
    ["voix seule"] = "voix",

    -- Corps visible
    ["body"] = "corps",
    ["corpse"] = "corps",
    ["corps"] = "corps",
    ["cadavre"] = "corps",

    -- Scènes supprimées
    ["del"] = "deleted",
    ["deleted scenes"] = "deleted",
    ["sup"] = "deleted",
    ["supp"] = "deleted",
    ["scene supprimee"] = "deleted",
    ["scenes supprimees"] = "deleted",

    -- Flashbacks
    ["flash"] = "flashback",
    ["flashback"] = "flashback",

    -- Nom uniquement
    ["name"] = "nom",
    ["nom"] = "nom",
}

----------------------------------------------------------------------
-- 4) Messages finaux
----------------------------------------------------------------------
local messages = {
    principal = "",
    secondaire = "",
    recurrent = "",
    oneshot = "",
    mineur = "",
    ["true"] = "",
    mention = " (mention%s)",
    photo = " (photo seule%s)",
    voix = " (voix seule%s)",
    deleted = " (scenes supprimees%s)",
    flashback = " (flashbacks%s)",
    nom = " (nom uniquement%s)",
    corps = " (corps%s)",
}

----------------------------------------------------------------------
-- 5) Fonction principale
----------------------------------------------------------------------
function p.main(frame)
    local arg1 = normalize(frame.args[1])
    local arg2 = safe_utf8(frame.args[2] or "")
    local arg3 = safe_utf8(frame.args[3] or "")

    local key = alias[arg1]

    -- Cas par défaut : renvoyer "(décédé)" si arg2 == arg3
    if not key then
        if arg2 == arg3 and arg2 ~= "" then
            return " (décédé)"
        end
        return ""
    end

    local base = messages[key] or ""

    -- Ajout ", décédé" si arg2 == arg3
    local deceased = ""
    if arg2 == arg3 and arg2 ~= "" then
        deceased = ", décédé"
    end

    return base:format(deceased)
end

return p