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
 
(2 versions intermédiaires par le même utilisateur non affichées)
Ligne 26 : Ligne 26 :


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


supporting = "Personnage secondaire de ",
supporting = "Personnage secondaire de ",
["supporting character"] = "Personnage secondaire de ",
s = "Personnage secondaire de ",
s = "Personnage secondaire de ",
su = "Personnage secondaire de ",
se = "Personnage secondaire de ",
secondaire = "Personnage secondaire de ",
secondaire = "Personnage secondaire de ",


recurring = "Personnage récurrent de ",
recurring = "Personnage récurrent de ",
re = "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"] = "Personnage one shot de ",
["one shot character"] = "Personnage one shot de ",
os = "Personnage one shot de ",
os = "Personnage one shot de ",


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


yes = "Apparaît dans ",
yes = "Apparaît dans ",
['true'] = "Apparaît dans ",
y = "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 ",
vrai = "Apparaît dans ",


mention = "Mentionné dans ",
mention = "Mentionné dans ",
me = "Mentionné dans ",
me = "Mentionné dans ",
men = "Mentionné dans ",
mentioned = "Mentionné dans ",


picture = "Photo seule dans ",
picture = "Photo seule dans ",
Ligne 78 : Ligne 60 :


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


["deleted scenes"] = "Apparaît uniquement dans les scènes supprimées de ",
deleted = "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 ",
flashback = "Apparaît uniquement dans des flashbacks de ",


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


Ligne 101 : Ligne 76 :


----------------------------------------------------------------------
----------------------------------------------------------------------
-- Alias → catégories (Marquage)
-- Alias → catégories
----------------------------------------------------------------------
----------------------------------------------------------------------
local alias = {
local alias = {
m="principal", main="principal", ["main character"]="principal",
m="principal", main="principal", principal="principal",
p="principal", principal="principal",
s="secondaire", secondaire="secondaire",

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

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

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

mi="mineur", minor="mineur",
mi="mineur", minor="mineur",
["minor character"]="mineur", mineur="mineur",
y="true", yes="true", vrai="true",
me="mention", mention="mention",

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

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

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

voice="voix", voix="voix",
voice="voix", voix="voix",
body="corps", corps="corps",

body="corps", corpse="corps", corps="corps",
del="deleted", deleted="deleted",

del="deleted", ["deleted scenes"]="deleted",
sup="deleted", supp="deleted",

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

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


Ligne 147 : Ligne 102 :


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


if norm == "" then
if norm == "" then
Ligne 205 : Ligne 159 :
if ep == "" then return "" end
if ep == "" then return "" end


------------------------------------------------------------------
local linkFull = Episode.getEpisodeFullLink{ args = { ep } }
-- TITRES
local linkTitle = Episode.getEpisodeTitle{ args = { ep } }
------------------------------------------------------------------
local linkShort = Episode.getEpisodeLink{ args = { ep } }
local titleEp = Episode.getEpisodeLink{ args = { ep } }
local titleDeath = Episode.getEpisodeLink{ args = { deathEp } }

if (not titleDeath or titleDeath == "") and deathEp ~= "" then
local full = Episode.getEpisodeFullLink{ args = { deathEp } }
if full and full ~= "" then
titleDeath = Episode.getEpisodeLink{ args = { full } }
end
end

if (not titleDeath or titleDeath == "") and deathEp ~= "" then
titleDeath = Episode.getEpisodeLink{ args = { deathEp } }
end


------------------------------------------------------------------
------------------------------------------------------------------
-- DÉTECTION DU DÉCÈS PAR TITRE
-- Conversion automatique du paramètre 5 (titre → code d’épisode)
------------------------------------------------------------------
------------------------------------------------------------------
local isDead = (titleEp ~= "" and titleDeath ~= "" and titleEp == titleDeath)
local deathLink = Episode.getEpisodeLink{ args = { deathEp } }

-- 1) Si vide, on tente avec le titre FR de l’épisode
if deathLink == "" then
local titleFR = Episode.getEpisodeTitle{ args = { deathEp } }
if titleFR and titleFR ~= "" then
deathLink = Episode.getEpisodeLink{ args = { titleFR } }
end
end
-- 2) Si encore vide, on tente avec le lien complet
if deathLink == "" then
local full = Episode.getEpisodeFullLink{ args = { deathEp } }
if full and full ~= "" then
deathLink = Episode.getEpisodeLink{ args = { full } }
end
end
------------------------------------------------------------------
------------------------------------------------------------------
-- Suffixe affiché
-- Suffixe
------------------------------------------------------------------
------------------------------------------------------------------
local rawSuffix = appearanceSuffix(typeApp, linkShort, deathLink)
local rawSuffix = appearanceSuffix(typeApp, isDead)
local suffix = buildDisplaySuffix(rawSuffix)
local suffix = buildDisplaySuffix(rawSuffix)


------------------------------------------------------------------
------------------------------------------------------------------
-- Affichage principal
-- Affichage
------------------------------------------------------------------
------------------------------------------------------------------
local propLabel = appearancePropertyLabel(typeApp)
local propLabel = appearancePropertyLabel(typeApp)
local linkFull = Episode.getEpisodeFullLink{ args = { ep } }


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


------------------------------------------------------------------
------------------------------------------------------------------
-- SMW (invisible)
-- SMW
------------------------------------------------------------------
------------------------------------------------------------------
local smw = ""
local smw = ""
Ligne 261 : Ligne 213 :
if order ~= "" then
if order ~= "" then
smw = smw .. string.format("{{#set: Ordre d'apparition dans %s = %s}}",
smw = smw .. string.format("{{#set: Ordre d'apparition dans %s = %s}}",
linkShort, order)
titleEp, order)
end
end



Dernière version du 16 juin 2026 à 21:20

Documentation icon Documentation module[créer]
local p = {}

local Episode = require("Module:Episode")

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

----------------------------------------------------------------------
-- Normalisation
----------------------------------------------------------------------
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

----------------------------------------------------------------------
-- Types d’apparition → propriété SMW
----------------------------------------------------------------------
local types = {
    main = "Personnage principal de ",
    m = "Personnage principal de ",
    principal = "Personnage principal de ",

    supporting = "Personnage secondaire de ",
    s = "Personnage secondaire de ",
    secondaire = "Personnage secondaire de ",

    recurring = "Personnage récurrent de ",
    re = "Personnage récurrent de ",

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

    minor = "Personnage mineur de ",
    mi = "Personnage mineur de ",

    yes = "Apparaît dans ",
    y = "Apparaît dans ",
    vrai = "Apparaît dans ",

    mention = "Mentionné dans ",
    me = "Mentionné dans ",

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

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

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

    deleted = "Apparaît uniquement dans les scènes supprimées de ",
    flashback = "Apparaît uniquement dans des flashbacks de ",

    nom = "Nom visible dans ",

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

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

----------------------------------------------------------------------
-- Alias → catégories
----------------------------------------------------------------------
local alias = {
    m="principal", main="principal", principal="principal",
    s="secondaire", secondaire="secondaire",
    re="recurrent", recurring="recurrent",
    os="oneshot", ["one shot"]="oneshot",
    mi="mineur", minor="mineur",
    y="true", yes="true", vrai="true",
    me="mention", mention="mention",
    picture="photo", photo="photo",
    voice="voix", voix="voix",
    body="corps", corps="corps",
    del="deleted", deleted="deleted",
    flash="flashback", flashback="flashback",
    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)"
}

----------------------------------------------------------------------
-- Suffixe brut basé sur isDead
----------------------------------------------------------------------
local function appearanceSuffix(typeApp, isDead)
    local norm = normalize(typeApp)
    local key = alias[norm]

    if norm == "" then
        if isDead then return " (décédé)" end
        return ""
    end

    if not key then
        if isDead then return " (décédé)" end
        return ""
    end

    local base = messages[key] or ""

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

    return base
end

----------------------------------------------------------------------
-- Italique
----------------------------------------------------------------------
local function buildDisplaySuffix(rawSuffix)
    if rawSuffix == "" then return "" end
    return " ''" .. rawSuffix .. "''"
end

----------------------------------------------------------------------
-- Nom du personnage (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

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

    ------------------------------------------------------------------
    -- TITRES
    ------------------------------------------------------------------
    local titleEp = Episode.getEpisodeLink{ args = { ep } }
    local titleDeath = Episode.getEpisodeLink{ args = { deathEp } }

    if (not titleDeath or titleDeath == "") and deathEp ~= "" then
        local full = Episode.getEpisodeFullLink{ args = { deathEp } }
        if full and full ~= "" then
            titleDeath = Episode.getEpisodeLink{ args = { full } }
        end
    end

    if (not titleDeath or titleDeath == "") and deathEp ~= "" then
        titleDeath = Episode.getEpisodeLink{ args = { deathEp } }
    end

    ------------------------------------------------------------------
    -- DÉTECTION DU DÉCÈS PAR TITRE
    ------------------------------------------------------------------
    local isDead = (titleEp ~= "" and titleDeath ~= "" and titleEp == titleDeath)

    ------------------------------------------------------------------
    -- Suffixe
    ------------------------------------------------------------------
    local rawSuffix = appearanceSuffix(typeApp, isDead)
    local suffix = buildDisplaySuffix(rawSuffix)

    ------------------------------------------------------------------
    -- Affichage
    ------------------------------------------------------------------
    local propLabel = appearancePropertyLabel(typeApp)
    local linkFull  = Episode.getEpisodeFullLink{ args = { ep } }

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

    ------------------------------------------------------------------
    -- SMW
    ------------------------------------------------------------------
    local smw = ""

    if isDead then
        smw = smw .. string.format("{{#set: Décédé dans = %s}}", linkFull)
    end

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

    if name ~= "" then
        smw = smw .. setCharacterName(ep, name)
    end

    if smw ~= "" then
        frame:preprocess(smw)
    end

    return display
end

return p