<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="fr">
	<id>https://fr.battlestarwiki.ddns.net/index.php?action=history&amp;feed=atom&amp;title=Module%3ALigne_apparition</id>
	<title>Module:Ligne apparition - Historique des versions</title>
	<link rel="self" type="application/atom+xml" href="https://fr.battlestarwiki.ddns.net/index.php?action=history&amp;feed=atom&amp;title=Module%3ALigne_apparition"/>
	<link rel="alternate" type="text/html" href="https://fr.battlestarwiki.ddns.net/index.php?title=Module:Ligne_apparition&amp;action=history"/>
	<updated>2026-08-06T22:34:49Z</updated>
	<subtitle>Historique des versions pour cette page sur le wiki</subtitle>
	<generator>MediaWiki 1.45.3</generator>
	<entry>
		<id>https://fr.battlestarwiki.ddns.net/index.php?title=Module:Ligne_apparition&amp;diff=10716&amp;oldid=prev</id>
		<title>LIMAFOX76 : Page créée avec « local p = {}  local Episode = require(&quot;Module:Episode&quot;)  ---------------------------------------------------------------------- -- Nettoyage UTF‑8 ---------------------------------------------------------------------- local function safe_utf8(str)     if type(str) ~= &quot;string&quot; then return &quot;&quot; end     return mw.ustring.gsub(str, &quot;[^\0-\x7F\xC2-\xF4][\x80-\xBF]*&quot;, &quot; &quot;) end  ---------------------------------------------------------------------- -- Normalisation ----... »</title>
		<link rel="alternate" type="text/html" href="https://fr.battlestarwiki.ddns.net/index.php?title=Module:Ligne_apparition&amp;diff=10716&amp;oldid=prev"/>
		<updated>2026-08-06T19:17:10Z</updated>

		<summary type="html">&lt;p&gt;Page créée avec « local p = {}  local Episode = require(&amp;quot;Module:Episode&amp;quot;)  ---------------------------------------------------------------------- -- Nettoyage UTF‑8 ---------------------------------------------------------------------- local function safe_utf8(str)     if type(str) ~= &amp;quot;string&amp;quot; then return &amp;quot;&amp;quot; end     return mw.ustring.gsub(str, &amp;quot;[^\0-\x7F\xC2-\xF4][\x80-\xBF]*&amp;quot;, &amp;quot; &amp;quot;) end  ---------------------------------------------------------------------- -- Normalisation ----... »&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
local Episode = require(&amp;quot;Module:Episode&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------&lt;br /&gt;
-- Nettoyage UTF‑8&lt;br /&gt;
----------------------------------------------------------------------&lt;br /&gt;
local function safe_utf8(str)&lt;br /&gt;
    if type(str) ~= &amp;quot;string&amp;quot; then return &amp;quot;&amp;quot; end&lt;br /&gt;
    return mw.ustring.gsub(str, &amp;quot;[^\0-\x7F\xC2-\xF4][\x80-\xBF]*&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------&lt;br /&gt;
-- Normalisation&lt;br /&gt;
----------------------------------------------------------------------&lt;br /&gt;
local function normalize(str)&lt;br /&gt;
    str = safe_utf8(str or &amp;quot;&amp;quot;)&lt;br /&gt;
    str = mw.text.trim(str)&lt;br /&gt;
    str = mw.ustring.lower(str)&lt;br /&gt;
    str = str:gsub(&amp;quot;[%-%_]&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
    str = mw.ustring.toNFD(str)&lt;br /&gt;
    str = str:gsub(&amp;quot;[%pM]&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
    str = str:gsub(&amp;quot;%s+&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
    return str&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------&lt;br /&gt;
-- Types d’apparition → propriété SMW&lt;br /&gt;
----------------------------------------------------------------------&lt;br /&gt;
local types = {&lt;br /&gt;
    main = &amp;quot;Personnage principal de &amp;quot;,&lt;br /&gt;
    m = &amp;quot;Personnage principal de &amp;quot;,&lt;br /&gt;
    principal = &amp;quot;Personnage principal de &amp;quot;,&lt;br /&gt;
&lt;br /&gt;
    supporting = &amp;quot;Personnage secondaire de &amp;quot;,&lt;br /&gt;
    s = &amp;quot;Personnage secondaire de &amp;quot;,&lt;br /&gt;
    secondaire = &amp;quot;Personnage secondaire de &amp;quot;,&lt;br /&gt;
&lt;br /&gt;
    recurring = &amp;quot;Personnage récurrent de &amp;quot;,&lt;br /&gt;
    re = &amp;quot;Personnage récurrent de &amp;quot;,&lt;br /&gt;
&lt;br /&gt;
    [&amp;quot;one shot&amp;quot;] = &amp;quot;Personnage one shot de &amp;quot;,&lt;br /&gt;
    os = &amp;quot;Personnage one shot de &amp;quot;,&lt;br /&gt;
&lt;br /&gt;
    minor = &amp;quot;Personnage mineur de &amp;quot;,&lt;br /&gt;
    mi = &amp;quot;Personnage mineur de &amp;quot;,&lt;br /&gt;
&lt;br /&gt;
    yes = &amp;quot;Apparaît dans &amp;quot;,&lt;br /&gt;
    y = &amp;quot;Apparaît dans &amp;quot;,&lt;br /&gt;
    vrai = &amp;quot;Apparaît dans &amp;quot;,&lt;br /&gt;
&lt;br /&gt;
    mention = &amp;quot;Mentionné dans &amp;quot;,&lt;br /&gt;
    me = &amp;quot;Mentionné dans &amp;quot;,&lt;br /&gt;
&lt;br /&gt;
    picture = &amp;quot;Photo seule dans &amp;quot;,&lt;br /&gt;
    photo = &amp;quot;Photo seule dans &amp;quot;,&lt;br /&gt;
&lt;br /&gt;
    voice = &amp;quot;Voix seule dans &amp;quot;,&lt;br /&gt;
    voix = &amp;quot;Voix seule dans &amp;quot;,&lt;br /&gt;
&lt;br /&gt;
    body = &amp;quot;Corps visible dans &amp;quot;,&lt;br /&gt;
    corps = &amp;quot;Corps visible dans &amp;quot;,&lt;br /&gt;
&lt;br /&gt;
    deleted = &amp;quot;Apparaît uniquement dans les scènes supprimées de &amp;quot;,&lt;br /&gt;
    flashback = &amp;quot;Apparaît uniquement dans des flashbacks de &amp;quot;,&lt;br /&gt;
&lt;br /&gt;
    nom = &amp;quot;Nom visible dans &amp;quot;,&lt;br /&gt;
&lt;br /&gt;
    [&amp;quot;#default&amp;quot;] = &amp;quot;Apparaît dans &amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function appearancePropertyLabel(typeApp)&lt;br /&gt;
    local key = normalize(typeApp)&lt;br /&gt;
    return types[key] or types[&amp;quot;#default&amp;quot;]&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------&lt;br /&gt;
-- Alias → catégories&lt;br /&gt;
----------------------------------------------------------------------&lt;br /&gt;
local alias = {&lt;br /&gt;
    m=&amp;quot;principal&amp;quot;, main=&amp;quot;principal&amp;quot;, principal=&amp;quot;principal&amp;quot;,&lt;br /&gt;
    s=&amp;quot;secondaire&amp;quot;, secondaire=&amp;quot;secondaire&amp;quot;,&lt;br /&gt;
    re=&amp;quot;recurrent&amp;quot;, recurring=&amp;quot;recurrent&amp;quot;,&lt;br /&gt;
    os=&amp;quot;oneshot&amp;quot;, [&amp;quot;one shot&amp;quot;]=&amp;quot;oneshot&amp;quot;,&lt;br /&gt;
    mi=&amp;quot;mineur&amp;quot;, minor=&amp;quot;mineur&amp;quot;,&lt;br /&gt;
    y=&amp;quot;true&amp;quot;, yes=&amp;quot;true&amp;quot;, vrai=&amp;quot;true&amp;quot;,&lt;br /&gt;
    me=&amp;quot;mention&amp;quot;, mention=&amp;quot;mention&amp;quot;,&lt;br /&gt;
    picture=&amp;quot;photo&amp;quot;, photo=&amp;quot;photo&amp;quot;,&lt;br /&gt;
    voice=&amp;quot;voix&amp;quot;, voix=&amp;quot;voix&amp;quot;,&lt;br /&gt;
    body=&amp;quot;corps&amp;quot;, corps=&amp;quot;corps&amp;quot;,&lt;br /&gt;
    del=&amp;quot;deleted&amp;quot;, deleted=&amp;quot;deleted&amp;quot;,&lt;br /&gt;
    flash=&amp;quot;flashback&amp;quot;, flashback=&amp;quot;flashback&amp;quot;,&lt;br /&gt;
    nom=&amp;quot;nom&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local messages = {&lt;br /&gt;
    principal=&amp;quot;&amp;quot;, secondaire=&amp;quot;&amp;quot;, recurrent=&amp;quot;&amp;quot;, oneshot=&amp;quot;&amp;quot;, mineur=&amp;quot;&amp;quot;, [&amp;quot;true&amp;quot;]=&amp;quot;&amp;quot;,&lt;br /&gt;
    mention=&amp;quot; (mention)&amp;quot;, photo=&amp;quot; (photo seule)&amp;quot;, voix=&amp;quot; (voix seule)&amp;quot;,&lt;br /&gt;
    deleted=&amp;quot; (scenes supprimees)&amp;quot;, flashback=&amp;quot; (flashbacks)&amp;quot;,&lt;br /&gt;
    nom=&amp;quot; (nom uniquement)&amp;quot;, corps=&amp;quot; (corps)&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------&lt;br /&gt;
-- Suffixe d’apparition (type + décès)&lt;br /&gt;
-- Règle :&lt;br /&gt;
-- - principal / one shot / récurrent / mineur → pas de type, mais (décédé) si mort&lt;br /&gt;
-- - autres types → suffixe normal, et &amp;quot;, décédé&amp;quot; si mort&lt;br /&gt;
----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
local invisibleTypes = {&lt;br /&gt;
    principal = true,&lt;br /&gt;
    oneshot   = true,&lt;br /&gt;
    recurrent = true,&lt;br /&gt;
    mineur    = true,&lt;br /&gt;
    [&amp;quot;true&amp;quot;]  = true,  -- &amp;quot;Apparaît dans&amp;quot;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
local function appearanceSuffix(typeApp, isDead)&lt;br /&gt;
    local norm = normalize(typeApp)&lt;br /&gt;
    local key = alias[norm]&lt;br /&gt;
&lt;br /&gt;
    -- Si type inconnu → on ne montre rien, sauf décès&lt;br /&gt;
    if not key then&lt;br /&gt;
        if isDead then return &amp;quot; (décédé)&amp;quot; end&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Si type invisible (principal, mineur, etc.)&lt;br /&gt;
    if invisibleTypes[key] then&lt;br /&gt;
        if isDead then return &amp;quot; (décédé)&amp;quot; end&lt;br /&gt;
        return &amp;quot;&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- Type visible (mention, photo, voix, etc.)&lt;br /&gt;
    local base = messages[key] or &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if isDead then&lt;br /&gt;
        return base:gsub(&amp;quot;%)$&amp;quot;, &amp;quot;, décédé)&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return base&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function buildDisplaySuffix(raw)&lt;br /&gt;
    if raw == &amp;quot;&amp;quot; then return &amp;quot;&amp;quot; end&lt;br /&gt;
    return &amp;quot; &amp;#039;&amp;#039;&amp;quot; .. raw .. &amp;quot;&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------&lt;br /&gt;
-- Nom du personnage (SMW)&lt;br /&gt;
----------------------------------------------------------------------&lt;br /&gt;
local function setCharacterName(ep, name)&lt;br /&gt;
    if ep == &amp;quot;&amp;quot; or name == &amp;quot;&amp;quot; then return &amp;quot;&amp;quot; end&lt;br /&gt;
    local fullName = Episode.getEpisodeTitle{ args = { ep } }&lt;br /&gt;
    if not fullName or fullName == &amp;quot;&amp;quot; then return &amp;quot;&amp;quot; end&lt;br /&gt;
    return string.format(&amp;quot;{{#set: Nom du personnage dans %s = %s}}&amp;quot;, fullName, name)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------&lt;br /&gt;
-- Fonction principale&lt;br /&gt;
----------------------------------------------------------------------&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
&lt;br /&gt;
    local ep      = safe_utf8(args[1] or &amp;quot;&amp;quot;)&lt;br /&gt;
    local typeApp = safe_utf8(args[2] or &amp;quot;&amp;quot;)&lt;br /&gt;
    local order   = safe_utf8(args[3] or &amp;quot;&amp;quot;)&lt;br /&gt;
    local name    = safe_utf8(args[4] or &amp;quot;&amp;quot;)&lt;br /&gt;
    local deathEp = safe_utf8(args[5] or &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    if ep == &amp;quot;&amp;quot; then return &amp;quot;&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    ------------------------------------------------------------------&lt;br /&gt;
    -- TITRES&lt;br /&gt;
    ------------------------------------------------------------------&lt;br /&gt;
    local titleEp = Episode.getEpisodeLink{ args = { ep } }&lt;br /&gt;
    local titleDeath = Episode.getEpisodeLink{ args = { deathEp } }&lt;br /&gt;
&lt;br /&gt;
    if (not titleDeath or titleDeath == &amp;quot;&amp;quot;) and deathEp ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        local full = Episode.getEpisodeFullLink{ args = { deathEp } }&lt;br /&gt;
        if full and full ~= &amp;quot;&amp;quot; then&lt;br /&gt;
            titleDeath = Episode.getEpisodeLink{ args = { full } }&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if (not titleDeath or titleDeath == &amp;quot;&amp;quot;) and deathEp ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        titleDeath = Episode.getEpisodeLink{ args = { deathEp } }&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ------------------------------------------------------------------&lt;br /&gt;
    -- DÉTECTION DU DÉCÈS PAR TITRE&lt;br /&gt;
    ------------------------------------------------------------------&lt;br /&gt;
    local isDead = (titleEp ~= &amp;quot;&amp;quot; and titleDeath ~= &amp;quot;&amp;quot; and titleEp == titleDeath)&lt;br /&gt;
&lt;br /&gt;
    ------------------------------------------------------------------&lt;br /&gt;
    -- Suffixe&lt;br /&gt;
    ------------------------------------------------------------------&lt;br /&gt;
    local rawSuffix = appearanceSuffix(typeApp, isDead)&lt;br /&gt;
    local suffix = buildDisplaySuffix(rawSuffix)&lt;br /&gt;
&lt;br /&gt;
    ------------------------------------------------------------------&lt;br /&gt;
    -- Affichage&lt;br /&gt;
    ------------------------------------------------------------------&lt;br /&gt;
    local titleEpFr = frame:preprocess(Episode.getEpisodeTitle{ args = { ep } })&lt;br /&gt;
    local propLabel = appearancePropertyLabel(typeApp)&lt;br /&gt;
    local linkFull  = Episode.getEpisodeFullLink{ args = { ep } }&lt;br /&gt;
&lt;br /&gt;
    local display&lt;br /&gt;
    if typeApp ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        display = string.format(&amp;quot;&amp;#039;&amp;#039;&amp;#039;[[%s::%s|%s]]&amp;#039;&amp;#039;&amp;#039;%s&amp;quot;,&lt;br /&gt;
            propLabel, linkFull, titleEpFr, suffix)&lt;br /&gt;
    else&lt;br /&gt;
        display = string.format(&amp;quot;&amp;lt;span style=\&amp;quot;color:#555555;\&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt;%s&amp;quot;,&lt;br /&gt;
            titleEpFr, suffix)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    ------------------------------------------------------------------&lt;br /&gt;
    -- SMW&lt;br /&gt;
    ------------------------------------------------------------------&lt;br /&gt;
    local smw = &amp;quot;&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    if isDead then&lt;br /&gt;
        smw = smw .. string.format(&amp;quot;{{#set: Décédé dans = %s}}&amp;quot;, linkFull)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if order ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        smw = smw .. string.format(&amp;quot;{{#set: Ordre d&amp;#039;apparition dans %s = %s}}&amp;quot;,&lt;br /&gt;
            titleEp, order)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if name ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        smw = smw .. setCharacterName(ep, name)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if smw ~= &amp;quot;&amp;quot; then&lt;br /&gt;
        frame:preprocess(smw)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return display&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>LIMAFOX76</name></author>
	</entry>
</feed>