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


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


----------------------------------------------------------------------
----------------------------------------------------------------------
-- 2) Normalisation avancée
-- Normalisation
----------------------------------------------------------------------
----------------------------------------------------------------------
local function normalize(str)
local function normalize(str)
Ligne 28 : Ligne 26 :


----------------------------------------------------------------------
----------------------------------------------------------------------
-- 3) 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 80 : 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 103 : Ligne 76 :


----------------------------------------------------------------------
----------------------------------------------------------------------
-- 4) Alias → catégories (Marquage type d’apparition)
-- Alias → catégories
----------------------------------------------------------------------
----------------------------------------------------------------------
local alias = {
local alias = {
m="principal", main="principal", ["main character"]="principal",
m="principal", main="principal", principal="principal",
s="secondaire", secondaire="secondaire",
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",
re="recurrent", recurring="recurrent",
["recurring character"]="recurrent", recurrent="recurrent",

os="oneshot", ["one shot"]="oneshot",
os="oneshot", ["one shot"]="oneshot",
["one-shot"]="oneshot", ["one shot character"]="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", mentionne="mention",

picture="photo", photo="photo",
picture="photo", photo="photo",
voice="voix", voix="voix",

voice="voix", voix="voix", ["voix seule"]="voix",
body="corps", corps="corps",
del="deleted", deleted="deleted",

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",
flash="flashback", flashback="flashback",
nom="nom"

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


Ligne 152 : Ligne 102 :


----------------------------------------------------------------------
----------------------------------------------------------------------
-- Suffixe brut basé sur isDead
-- 5) Génère le suffixe brut (sans italique)
----------------------------------------------------------------------
----------------------------------------------------------------------
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 ~= "")


-- Type vide → (décédé) si mort
if norm == "" then
if norm == "" then
if isDead then return " (décédé)" end
if isDead then return " (décédé)" end
Ligne 165 : Ligne 113 :
end
end


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


-- Type connu
local base = messages[key] or ""
local base = messages[key] or ""


Ligne 182 : Ligne 128 :


----------------------------------------------------------------------
----------------------------------------------------------------------
-- Italique
-- 6) Transforme le suffixe brut en suffixe affiché (italique)
----------------------------------------------------------------------
----------------------------------------------------------------------
local function buildDisplaySuffix(rawSuffix)
local function buildDisplaySuffix(rawSuffix)
Ligne 190 : Ligne 136 :


----------------------------------------------------------------------
----------------------------------------------------------------------
-- 7) Enregistre le nom du personnage dans l’épisode (SMW)
-- Nom du personnage (SMW)
----------------------------------------------------------------------
----------------------------------------------------------------------
local function setCharacterName(ep, name)
local function setCharacterName(ep, name)
Ligne 200 : Ligne 146 :


----------------------------------------------------------------------
----------------------------------------------------------------------
-- 8) Fonction principale
-- Fonction principale
----------------------------------------------------------------------
----------------------------------------------------------------------
function p.main(frame)
function p.main(frame)
Ligne 212 : 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 full = Episode.getEpisodeFullLink{ args = { deathEp } }
-- On récupère le lien complet depuis le titre
if full and full ~= "" then
local deathFull = Episode.getEpisodeFullLink{ args = { deathEp } }
titleDeath = Episode.getEpisodeLink{ args = { full } }
end
-- Puis on convertit ce lien complet en code d’épisode
end
deathLink = Episode.getEpisodeLink{ args = { deathFull } }
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) via preprocess
-- SMW
------------------------------------------------------------------
------------------------------------------------------------------
local smw = ""
local smw = ""
Ligne 263 : 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