Aller au contenu

« Module:Ligne apparition » : différence entre les versions

De Stargate Wiki Sémantique
Contenu supprimé Contenu ajouté
Aucun résumé des modifications
Aucun résumé des modifications
Ligne 28 : Ligne 28 :


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


-- Supporting character
supporting = "Personnage secondaire de ",
supporting = "Personnage secondaire de ",
["supporting character"] = "Personnage secondaire de ",
["supporting character"] = "Personnage secondaire de ",
Ligne 47 : Ligne 43 :
se = "Personnage secondaire de ",
se = "Personnage secondaire de ",
secondaire = "Personnage secondaire de ",
secondaire = "Personnage secondaire de ",
ps = "Personnage secondaire de ",
["personnage secondaire"] = "Personnage secondaire de ",


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


-- One shot character
["one shot"] = "Personnage one shot de ",
["one shot"] = "Personnage one shot de ",
["one-shot"] = "Personnage one shot de ",
["one-shot"] = "Personnage one shot de ",
["one shot character"] = "Personnage one shot de ",
["one shot character"] = "Personnage one shot de ",
guest = "Personnage one shot de ",
os = "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 = "Personnage mineur de ",
["minor character"] = "Personnage mineur de ",
mi = "Personnage mineur de ",
mi = "Personnage mineur de ",
["personnage mineur"] = "Personnage mineur de ",
["minor character"] = "Personnage mineur de ",
mineur = "Personnage mineur de ",
mineur = "Personnage mineur de ",


-- Présence générique
yes = "Apparaît dans ",
yes = "Apparaît dans ",
['true'] = "Apparaît dans ",
['true'] = "Apparaît dans ",
["#default"] = "Apparaît dans ",
y = "Apparaît dans ",
y = "Apparaît dans ",
t = "Apparaît dans ",
t = "Apparaît dans ",
Ligne 84 : Ligne 68 :
vrai = "Apparaît dans ",
vrai = "Apparaît dans ",


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


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


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


-- Corpse
body = "Corps visible dans ",
body = "Corps visible dans ",
corpse = "Corps visible dans ",
corpse = "Corps visible dans ",
corps = "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 ",
["deleted scenes"] = "Apparaît uniquement dans les scènes supprimées de ",
del = "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 ",
sup = "Apparaît uniquement dans les scènes supprimées de ",
supp = "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 ",
flash = "Apparaît uniquement dans des flashbacks de ",
flashback = "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 ",
name = "Nom visible dans ",
nom = "Nom visible dans ",
nom = "Nom visible dans ",

["#default"] = "Apparaît dans "
}
}


Ligne 130 : Ligne 103 :


----------------------------------------------------------------------
----------------------------------------------------------------------
-- 4) Alias → catégories (Marquage type d'apparition)
-- 4) Alias → catégories (Marquage type d’apparition)
----------------------------------------------------------------------
----------------------------------------------------------------------
local alias = {
local alias = {
m="principal", main="principal", ["main character"]="principal",
-- Principal
["m"] = "principal",
p="principal", principal="principal", ["personnage principal"]="principal",
["main"] = "principal",
["main character"] = "principal",
["p"] = "principal",
["principal"] = "principal",
["personnage principal"] = "principal",


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


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


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


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


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


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


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


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


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


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


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


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


local messages = {
local messages = {
principal = "",
principal="", secondaire="", recurrent="", oneshot="", mineur="", ["true"]="",
mention=" (mention)", photo=" (photo seule)", voix=" (voix seule)",
secondaire = "",
deleted=" (scenes supprimees)", flashback=" (flashbacks)",
recurrent = "",
nom=" (nom uniquement)", corps=" (corps)"
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) Génère le suffixe brut (sans italique)
----------------------------------------------------------------------
local function appearanceSuffix(typeApp, epLink, deathLink)
local function appearanceSuffix(typeApp, epLink, deathLink)
local norm = normalize(typeApp)
local norm = normalize(typeApp)
local key = alias[norm]
local key = alias[norm]

local isDead = (epLink == deathLink and epLink ~= "")
local isDead = (epLink == deathLink and epLink ~= "")


-- 1) Si type d'apparition vide → afficher (décédé) si mort
-- Aucun type suffixe = (décédé) si mort
if norm == "" then
if norm == "" then
if isDead then
if isDead then return " (décédé)" end
return " (décédé)"
end
return ""
return ""
end
end


-- 2) Si alias inconnu → même logique que type vide
-- Alias inconnu → même logique
if not key then
if not key then
if isDead then
if isDead then return " (décédé)" end
return " (décédé)"
end
return ""
return ""
end
end


-- 3) Type d'apparition connu → suffixe normal
-- Type connu
local base = messages[key] or ""
local base = messages[key] or ""
local deceased = ""

if isDead then
if isDead then
deceased = ", décédé"
return base:gsub("%)$", ", décédé)")
end
end


return base:format(deceased)
return base
end
end


----------------------------------------------------------------------
----------------------------------------------------------------------
-- 6) Transforme le suffixe brut en suffixe affiché (italique)
-- 5) Nom du personnage dans l'épisode (SMW)
----------------------------------------------------------------------
local function buildDisplaySuffix(rawSuffix)
if rawSuffix == "" then return "" end
return " ''" .. rawSuffix .. "''"
end

----------------------------------------------------------------------
-- 7) Enregistre le nom du personnage dans l’épisode
----------------------------------------------------------------------
----------------------------------------------------------------------
local function setCharacterName(ep, name)
local function setCharacterName(ep, name)
if ep == "" or name == "" then
if ep == "" or name == "" then return "" end
return ""
end

local fullName = Episode.getEpisodeTitle{ args = { ep } }
local fullName = Episode.getEpisodeTitle{ args = { ep } }
if not fullName or fullName == "" then
if not fullName or fullName == "" then return "" end
return string.format(" {{#set: Nom du personnage dans %s = %s }}", fullName, name)
return ""
end

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


----------------------------------------------------------------------
----------------------------------------------------------------------
-- 6) Fonction principale
-- 8) Fonction principale
----------------------------------------------------------------------
----------------------------------------------------------------------
function p.main(frame)
function p.main(frame)
Ligne 303 : Ligne 210 :
local deathEp = safe_utf8(args[5] or "")
local deathEp = safe_utf8(args[5] or "")


if ep == "" then
if ep == "" then return "" end
return ""
end


local linkFull = Episode.getEpisodeFullLink{ args = { ep } }
local linkFull = Episode.getEpisodeFullLink{ args = { ep } }
Ligne 312 : Ligne 217 :


local deathLink = Episode.getEpisodeLink{ args = { deathEp } }
local deathLink = Episode.getEpisodeLink{ args = { deathEp } }
local isDead = (deathLink == linkShort and deathLink ~= "")

local rawSuffix = appearanceSuffix(typeApp, linkShort, deathLink)
local suffix = buildDisplaySuffix(rawSuffix)


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


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


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


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



Version du 16 juin 2026 à 20:37

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 → propriété SMW)
----------------------------------------------------------------------
local types = {
    main = "Personnage principal de ",
    ["main character"] = "Personnage principal de ",
    m = "Personnage principal de ",
    p = "Personnage principal de ",
    principal = "Personnage principal de ",

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

    recurring = "Personnage récurrent de ",
    re = "Personnage récurrent de ",
    ["recurring character"] = "Personnage récurrent de ",
    recurrent = "Personnage récurrent de ",

    ["one shot"] = "Personnage one shot de ",
    ["one-shot"] = "Personnage one shot de ",
    ["one shot character"] = "Personnage one shot de ",
    os = "Personnage one shot de ",

    minor = "Personnage mineur de ",
    mi = "Personnage mineur de ",
    ["minor character"] = "Personnage mineur de ",
    mineur = "Personnage mineur de ",

    yes = "Apparaît dans ",
    ['true'] = "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 = "Mentionné dans ",
    me = "Mentionné dans ",
    men = "Mentionné dans ",
    mentioned = "Mentionné dans ",

    picture = "Photo seule dans ",
    photo = "Photo seule dans ",

    voice = "Voix seule dans ",
    voix = "Voix seule dans ",

    body = "Corps visible dans ",
    corpse = "Corps visible dans ",
    corps = "Corps visible dans ",

    ["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 ",

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

    name = "Nom visible dans ",
    nom = "Nom visible dans ",

    ["#default"] = "Apparaît 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 = {
    m="principal", main="principal", ["main character"]="principal",
    p="principal", principal="principal", ["personnage principal"]="principal",

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

    re="recurrent", recurring="recurrent",
    ["recurring character"]="recurrent", recurrent="recurrent",

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

    mi="mineur", minor="mineur",
    ["minor character"]="mineur", mineur="mineur",

    y="true", yes="true", t="true", ["true"]="true",
    o="true", oui="true", v="true", vrai="true",

    me="mention", men="mention", mention="mention",
    mentioned="mention", mentionne="mention",

    picture="photo", photo="photo",

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

    body="corps", corpse="corps", corps="corps", cadavre="corps",

    del="deleted", ["deleted scenes"]="deleted",
    sup="deleted", supp="deleted",
    ["scene supprimee"]="deleted",
    ["scenes supprimees"]="deleted",

    flash="flashback", flashback="flashback",

    name="nom", nom="nom"
}

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

----------------------------------------------------------------------
-- 5) Génère le suffixe brut (sans italique)
----------------------------------------------------------------------
local function appearanceSuffix(typeApp, epLink, deathLink)
    local norm = normalize(typeApp)
    local key = alias[norm]
    local isDead = (epLink == deathLink and epLink ~= "")

    -- Aucun type → suffixe = (décédé) si mort
    if norm == "" then
        if isDead then return " (décédé)" end
        return ""
    end

    -- Alias inconnu → même logique
    if not key then
        if isDead then return " (décédé)" end
        return ""
    end

    -- Type connu
    local base = messages[key] or ""
    if isDead then
        return base:gsub("%)$", ", décédé)")
    end

    return base
end

----------------------------------------------------------------------
-- 6) Transforme le suffixe brut en suffixe affiché (italique)
----------------------------------------------------------------------
local function buildDisplaySuffix(rawSuffix)
    if rawSuffix == "" then return "" end
    return " ''" .. rawSuffix .. "''"
end

----------------------------------------------------------------------
-- 7) Enregistre le nom du personnage dans l’épisode
----------------------------------------------------------------------
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

----------------------------------------------------------------------
-- 8) 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 isDead = (deathLink == linkShort and deathLink ~= "")

    local rawSuffix = appearanceSuffix(typeApp, linkShort, deathLink)
    local suffix = buildDisplaySuffix(rawSuffix)

    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>%s",
            linkTitle, suffix)
    end

    local smwDeath = ""
    if isDead 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