Aller au contenu

Module:Ligne apparition

De Stargate Wiki Sémantique
Version datée du 16 juin 2026 à 20:18 par LIMAFOX76 (discussion | contributions) (Page créée avec « local p = {} local Episode = require("Module:Episode") ---------------------------------------------------------------------- -- 1) Nettoyage UTF‑8 (anti-crash) ---------------------------------------------------------------------- local function safe_utf8(str) if type(str) ~= "string" then return "" end return mw.ustring.gsub(str, "[^\0-\x7F\xC2-\xF4][\x80-\xBF]*", " ") end ----------------------------------------------------------------... »)
(diff) ← Version précédente | Version actuelle (diff) | Version suivante → (diff)
Documentation icon Documentation module[créer]
local p = {}

local Episode = require("Module:Episode")

----------------------------------------------------------------------
-- 1) Nettoyage UTF‑8 (anti-crash)
----------------------------------------------------------------------
local function safe_utf8(str)
    if type(str) ~= "string" then
        return ""
    end
    return mw.ustring.gsub(str, "[^\0-\x7F\xC2-\xF4][\x80-\xBF]*", " ")
end

----------------------------------------------------------------------
-- 2) Normalisation avancée
----------------------------------------------------------------------
local function normalize(str)
    str = safe_utf8(str or "")
    str = mw.text.trim(str)
    str = mw.ustring.lower(str)
    str = str:gsub("[%-%_]", " ")
    str = mw.ustring.toNFD(str)
    str = str:gsub("[%pM]", "")
    str = str:gsub("%s+", " ")
    return str
end

----------------------------------------------------------------------
-- 3) Table des types (Type d'apparition)
----------------------------------------------------------------------
local types = {
    -- Main character
    main = "Personnage principal de ",
    ["main character"] = "Personnage principal de ",
    m = "Personnage principal de ",
    ma = "Personnage principal de ",
    p = "Personnage principal de ",
    principal = "Personnage principal de ",
    ["personnage principal"] = "Personnage principal de ",

    -- Supporting character
    supporting = "Personnage secondaire de ",
    ["supporting character"] = "Personnage secondaire de ",
    s = "Personnage secondaire de ",
    su = "Personnage secondaire de ",
    se = "Personnage secondaire de ",
    secondaire = "Personnage secondaire de ",
    ps = "Personnage secondaire de ",
    ["personnage secondaire"] = "Personnage secondaire de ",

    -- Recurring character
    recurring = "Personnage récurrent de ",
    ["recurring character"] = "Personnage récurrent de ",
    re = "Personnage récurrent de ",
    ["récurrent"] = "Personnage récurrent de ",
    ["personnage récurrent"] = "Personnage récurrent de ",

    -- One shot character
    ["one shot"] = "Personnage one shot de ",
    ["one-shot"] = "Personnage one shot de ",
    ["one shot character"] = "Personnage one shot de ",
    guest = "Personnage one shot de ",
    os = "Personnage one shot de ",
    g = "Personnage one shot de ",
    ["personnage one shot"] = "Personnage one shot de ",

    -- Minor character
    minor = "Personnage mineur de ",
    ["minor character"] = "Personnage mineur de ",
    mi = "Personnage mineur de ",
    ["personnage mineur"] = "Personnage mineur de ",
    mineur = "Personnage mineur de ",

    -- Présence générique
    yes = "Apparaît dans ",
    ['true'] = "Apparaît dans ",
    ["#default"] = "Apparaît dans ",
    y = "Apparaît dans ",
    t = "Apparaît dans ",
    o = "Apparaît dans ",
    oui = "Apparaît dans ",
    v = "Apparaît dans ",
    vrai = "Apparaît dans ",

    -- Mention
    mention = "Mentionné dans ",
    mentioned = "Mentionné dans ",
    me = "Mentionné dans ",
    men = "Mentionné dans ",
    ["mentionné"] = "Mentionné dans ",

    -- Visual presence only
    picture = "Photo seule dans ",
    photo = "Photo seule dans ",
    ["photo seule"] = "Photo seule dans ",

    -- Vocal presence only
    voice = "Voix seule dans ",
    voix = "Voix seule dans ",

    -- Corpse
    body = "Corps visible dans ",
    corpse = "Corps visible dans ",
    corps = "Corps visible dans ",
    cadavre = "Corps visible dans ",

    -- Deleted scenes only
    ["deleted scenes"] = "Apparaît uniquement dans les scènes supprimées de ",
    del = "Apparaît uniquement dans les scènes supprimées de ",
    sup = "Apparaît uniquement dans les scènes supprimées de ",
    supp = "Apparaît uniquement dans les scènes supprimées de ",
    ["scène supprimée"] = "Apparaît uniquement dans les scènes supprimées de ",
    ["scènes supprimées"] = "Apparaît uniquement dans les scènes supprimées de ",

    -- Flashback only
    flash = "Apparaît uniquement dans des flashbacks de ",
    flashback = "Apparaît uniquement dans des flashbacks de ",
    flashbacks = "Apparaît uniquement dans des flashbacks de ",

    -- Name visible only
    name = "Nom visible dans ",
    nom = "Nom visible dans ",
}

local function appearancePropertyLabel(typeApp)
    local key = normalize(typeApp)
    return types[key] or types["#default"]
end

----------------------------------------------------------------------
-- 4) Alias → catégories (Marquage type d'apparition)
----------------------------------------------------------------------
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",
}

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)",
}

local function appearanceSuffix(typeApp, epLink, deathLink)
    local key = alias[normalize(typeApp)]
    if not key then
        if epLink == deathLink and epLink ~= "" then
            return " (décédé)"
        end
        return ""
    end

    local base = messages[key] or ""
    local deceased = ""

    if epLink == deathLink and epLink ~= "" then
        deceased = ", décédé"
    end

    return base:format(deceased)
end

----------------------------------------------------------------------
-- 5) Nom du personnage dans l'épisode (SMW)
----------------------------------------------------------------------
local function setCharacterName(ep, name)
    if ep == "" or name == "" then
        return ""
    end

    local fullName = Episode.getEpisodeTitle{ args = { ep } }
    if not fullName or fullName == "" then
        return ""
    end

    return string.format(
        "{{#set: Nom du personnage dans %s = %s }}",
        fullName,
        name
    )
end

----------------------------------------------------------------------
-- 6) Fonction principale
----------------------------------------------------------------------
function p.main(frame)
    local args = frame.args

    local ep      = safe_utf8(args[1] or "")
    local typeApp = safe_utf8(args[2] or "")
    local order   = safe_utf8(args[3] or "")
    local name    = safe_utf8(args[4] or "")
    local deathEp = safe_utf8(args[5] or "")

    if ep == "" then
        return ""
    end

    local linkFull  = Episode.getEpisodeFullLink{ args = { ep } }
    local linkTitle = Episode.getEpisodeTitle{ args = { ep } }
    local linkShort = Episode.getEpisodeLink{ args = { ep } }

    local deathLink = Episode.getEpisodeLink{ args = { deathEp } }

    local suffix = appearanceSuffix(typeApp, linkShort, deathLink)
    local propLabel = appearancePropertyLabel(typeApp)

    local display
    if typeApp ~= "" then
        display = string.format(
            "'''[[%s::%s|%s]]'''%s",
            propLabel,
            linkFull,
            linkTitle,
            suffix
        )
    else
        display = string.format(
            "<span style=\"color:#555555;\">%s</span>",
            linkTitle
        )
    end

    local smwDeath = ""
    if deathLink == linkShort and deathLink ~= "" then
        smwDeath = string.format("{{#set: Décédé dans = %s}}", linkFull)
    end

    local smwOrder = ""
    if order ~= "" then
        smwOrder = string.format(
            "{{#set: Ordre d'apparition dans %s = %s }}",
            linkShort,
            order
        )
    end

    local smwName = setCharacterName(ep, name)

    return display .. smwDeath .. smwOrder .. smwName
end

return p