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
 
(3 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 204 : Ligne 158 :


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

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


------------------------------------------------------------------
------------------------------------------------------------------
-- TITRES
-- Conversion automatique du paramètre 5 (titre → code d’épisode)
------------------------------------------------------------------
------------------------------------------------------------------
local deathLink = Episode.getEpisodeLink{ args = { deathEp } }
local titleEp = Episode.getEpisodeLink{ args = { ep } }
local titleDeath = Episode.getEpisodeLink{ args = { deathEp } }


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


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


------------------------------------------------------------------
------------------------------------------------------------------
-- Suffixe affiché
-- DÉTECTION DU DÉCÈS PAR TITRE
------------------------------------------------------------------
------------------------------------------------------------------
local isDead = (titleEp ~= "" and titleDeath ~= "" and titleEp == titleDeath)
local rawSuffix = appearanceSuffix(typeApp, linkShort, deathLink)

------------------------------------------------------------------
-- Suffixe
------------------------------------------------------------------
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 252 : 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