<?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%3AEpisode</id>
	<title>Module:Episode - 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%3AEpisode"/>
	<link rel="alternate" type="text/html" href="https://fr.battlestarwiki.ddns.net/index.php?title=Module:Episode&amp;action=history"/>
	<updated>2026-08-06T20:43:24Z</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:Episode&amp;diff=10709&amp;oldid=prev</id>
		<title>LIMAFOX76 : Page créée avec « local data = mw.loadData(&quot;Module:Episode/data&quot;) local p = {}  -- Sécurisation des valeurs nil local function safe(v)     return v or &quot;&quot; end  -- Normalisation robuste des alias local function normalizeAlias(s)     if not s then return &quot;&quot; end      s = mw.ustring.lower(s)      -- 0) Supprimer les apostrophes HTML     s = mw.ustring.gsub(s, &quot;&amp;#39;&quot;, &quot;&quot;)     s = mw.ustring.gsub(s, &quot;&amp;apos;&quot;, &quot;&quot;)     s = mw.ustring.gsub(s, &quot;&amp;rsquo;&quot;, &quot;&quot;)     s = mw.ustring.gsub(s, &quot;&amp;ls... »</title>
		<link rel="alternate" type="text/html" href="https://fr.battlestarwiki.ddns.net/index.php?title=Module:Episode&amp;diff=10709&amp;oldid=prev"/>
		<updated>2026-08-06T18:10:09Z</updated>

		<summary type="html">&lt;p&gt;Page créée avec « local data = mw.loadData(&amp;quot;Module:Episode/data&amp;quot;) local p = {}  -- Sécurisation des valeurs nil local function safe(v)     return v or &amp;quot;&amp;quot; end  -- Normalisation robuste des alias local function normalizeAlias(s)     if not s then return &amp;quot;&amp;quot; end      s = mw.ustring.lower(s)      -- 0) Supprimer les apostrophes HTML     s = mw.ustring.gsub(s, &amp;quot;&amp;#039;&amp;quot;, &amp;quot;&amp;quot;)     s = mw.ustring.gsub(s, &amp;quot;&amp;#039;&amp;quot;, &amp;quot;&amp;quot;)     s = mw.ustring.gsub(s, &amp;quot;’&amp;quot;, &amp;quot;&amp;quot;)     s = mw.ustring.gsub(s, &amp;quot;&amp;amp;ls... »&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Nouvelle page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local data = mw.loadData(&amp;quot;Module:Episode/data&amp;quot;)&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Sécurisation des valeurs nil&lt;br /&gt;
local function safe(v)&lt;br /&gt;
    return v or &amp;quot;&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Normalisation robuste des alias&lt;br /&gt;
local function normalizeAlias(s)&lt;br /&gt;
    if not s then return &amp;quot;&amp;quot; end&lt;br /&gt;
&lt;br /&gt;
    s = mw.ustring.lower(s)&lt;br /&gt;
&lt;br /&gt;
    -- 0) Supprimer les apostrophes HTML&lt;br /&gt;
    s = mw.ustring.gsub(s, &amp;quot;&amp;amp;#39;&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
    s = mw.ustring.gsub(s, &amp;quot;&amp;amp;apos;&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
    s = mw.ustring.gsub(s, &amp;quot;&amp;amp;rsquo;&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
    s = mw.ustring.gsub(s, &amp;quot;&amp;amp;lsquo;&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    -- 1) Supprimer les apostrophes simples et typographiques&lt;br /&gt;
    s = mw.ustring.gsub(s, &amp;quot;[’&amp;#039;]&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    -- 2) Supprimer les virgules sans laisser d&amp;#039;espace&lt;br /&gt;
    s = mw.ustring.gsub(s, &amp;quot;,&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    -- 3) Remplacement des accents&lt;br /&gt;
    local accents = {&lt;br /&gt;
        [&amp;quot;à&amp;quot;]=&amp;quot;a&amp;quot;, [&amp;quot;á&amp;quot;]=&amp;quot;a&amp;quot;, [&amp;quot;â&amp;quot;]=&amp;quot;a&amp;quot;, [&amp;quot;ä&amp;quot;]=&amp;quot;a&amp;quot;, [&amp;quot;ã&amp;quot;]=&amp;quot;a&amp;quot;, [&amp;quot;å&amp;quot;]=&amp;quot;a&amp;quot;,&lt;br /&gt;
        [&amp;quot;ç&amp;quot;]=&amp;quot;c&amp;quot;,&lt;br /&gt;
        [&amp;quot;è&amp;quot;]=&amp;quot;e&amp;quot;, [&amp;quot;é&amp;quot;]=&amp;quot;e&amp;quot;, [&amp;quot;ê&amp;quot;]=&amp;quot;e&amp;quot;, [&amp;quot;ë&amp;quot;]=&amp;quot;e&amp;quot;,&lt;br /&gt;
        [&amp;quot;ì&amp;quot;]=&amp;quot;i&amp;quot;, [&amp;quot;í&amp;quot;]=&amp;quot;i&amp;quot;, [&amp;quot;î&amp;quot;]=&amp;quot;i&amp;quot;, [&amp;quot;ï&amp;quot;]=&amp;quot;i&amp;quot;,&lt;br /&gt;
        [&amp;quot;ñ&amp;quot;]=&amp;quot;n&amp;quot;,&lt;br /&gt;
        [&amp;quot;ò&amp;quot;]=&amp;quot;o&amp;quot;, [&amp;quot;ó&amp;quot;]=&amp;quot;o&amp;quot;, [&amp;quot;ô&amp;quot;]=&amp;quot;o&amp;quot;, [&amp;quot;ö&amp;quot;]=&amp;quot;o&amp;quot;, [&amp;quot;õ&amp;quot;]=&amp;quot;o&amp;quot;,&lt;br /&gt;
        [&amp;quot;ù&amp;quot;]=&amp;quot;u&amp;quot;, [&amp;quot;ú&amp;quot;]=&amp;quot;u&amp;quot;, [&amp;quot;û&amp;quot;]=&amp;quot;u&amp;quot;, [&amp;quot;ü&amp;quot;]=&amp;quot;u&amp;quot;,&lt;br /&gt;
        [&amp;quot;ý&amp;quot;]=&amp;quot;y&amp;quot;, [&amp;quot;ÿ&amp;quot;]=&amp;quot;y&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
    s = mw.ustring.gsub(s, &amp;quot;.&amp;quot;, accents)&lt;br /&gt;
&lt;br /&gt;
    -- 4) Remplacer les autres caractères non alphanumériques par un espace&lt;br /&gt;
    s = mw.ustring.gsub(s, &amp;quot;[^%w]&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    -- 5) Compresser les espaces&lt;br /&gt;
    s = mw.ustring.gsub(s, &amp;quot;%s+&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    -- 6) Trim&lt;br /&gt;
    s = mw.text.trim(s)&lt;br /&gt;
&lt;br /&gt;
    return s&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
-- Exécution des parseurs MediaWiki&lt;br /&gt;
local function parse(wikitext)&lt;br /&gt;
    return mw.getCurrentFrame():preprocess(wikitext)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Function 1: Get full episode link from key&lt;br /&gt;
function p.getEpisode(frame)&lt;br /&gt;
    local key = normalizeAlias(frame.args[1])&lt;br /&gt;
    local entry = data[key]&lt;br /&gt;
&lt;br /&gt;
    if not entry then&lt;br /&gt;
        return &amp;quot;Épisode non référencé&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local ns  = safe(entry[1])&lt;br /&gt;
    local link = safe(entry[2])&lt;br /&gt;
    local title = safe(entry[3])&lt;br /&gt;
&lt;br /&gt;
    local wikitext&lt;br /&gt;
    if ns == &amp;quot;&amp;quot; then&lt;br /&gt;
        wikitext = string.format(&amp;quot;[[%s|%s]]&amp;quot;, link, title)&lt;br /&gt;
    else&lt;br /&gt;
        wikitext = string.format(&amp;quot;[[%s:%s|%s]]&amp;quot;, ns, link, title)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return parse(wikitext)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Function 2: Force namespace to &amp;quot;Credits:&amp;quot;&lt;br /&gt;
function p.getCreditsLink(frame)&lt;br /&gt;
    local key = normalizeAlias(frame.args[1])&lt;br /&gt;
    local entry = data[key]&lt;br /&gt;
&lt;br /&gt;
    if not entry then&lt;br /&gt;
        return &amp;quot;Épisode non référencé&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local link = safe(entry[2])&lt;br /&gt;
    local title = safe(entry[3])&lt;br /&gt;
&lt;br /&gt;
    return parse(string.format(&amp;quot;[[Crédits:%s|%s]]&amp;quot;, link, title))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Function 3: Force namespace to &amp;quot;Transcript:&amp;quot;&lt;br /&gt;
function p.getTranscriptLink(frame)&lt;br /&gt;
    local key = normalizeAlias(frame.args[1])&lt;br /&gt;
    local entry = data[key]&lt;br /&gt;
&lt;br /&gt;
    if not entry then&lt;br /&gt;
        return &amp;quot;Épisode non référencé&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local link = safe(entry[2])&lt;br /&gt;
    local title = safe(entry[3])&lt;br /&gt;
&lt;br /&gt;
    return parse(string.format(&amp;quot;[[Retranscription:%s|%s]]&amp;quot;, link, title))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Function 4: Force namespace to &amp;quot;Quotes:&amp;quot;&lt;br /&gt;
function p.getQuotesLink(frame)&lt;br /&gt;
    local key = normalizeAlias(frame.args[1])&lt;br /&gt;
    local entry = data[key]&lt;br /&gt;
&lt;br /&gt;
    if not entry then&lt;br /&gt;
        return &amp;quot;Épisode non référencé&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local link = safe(entry[2])&lt;br /&gt;
    local title = safe(entry[3])&lt;br /&gt;
&lt;br /&gt;
    return parse(string.format(&amp;quot;[[Citations:%s|%s]]&amp;quot;, link, title))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Function 5: Force namespace to &amp;quot;Category:Images from&amp;quot;&lt;br /&gt;
function p.getImagesLink(frame)&lt;br /&gt;
    local key = normalizeAlias(frame.args[1])&lt;br /&gt;
    local entry = data[key]&lt;br /&gt;
&lt;br /&gt;
    if not entry then&lt;br /&gt;
        return &amp;quot;Épisode non référencé&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local link = safe(entry[2])&lt;br /&gt;
    local title = safe(entry[3])&lt;br /&gt;
&lt;br /&gt;
    return parse(string.format(&amp;quot;[[:Catégorie:Images de %s|%s]]&amp;quot;, link, title))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Function 6: Retrieve from link&lt;br /&gt;
function p.getEpisodeLink(frame)&lt;br /&gt;
    local key = normalizeAlias(frame.args[1])&lt;br /&gt;
    local entry = data[key]&lt;br /&gt;
&lt;br /&gt;
    if not entry then&lt;br /&gt;
        return &amp;quot;Épisode non référencé&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return safe(entry[2])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Function 7: Get full episode link only from key&lt;br /&gt;
function p.getEpisodeFullLink(frame)&lt;br /&gt;
    local key = normalizeAlias(frame.args[1])&lt;br /&gt;
    local entry = data[key]&lt;br /&gt;
&lt;br /&gt;
    if not entry then&lt;br /&gt;
        return &amp;quot;Épisode non référencé&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local ns = safe(entry[1])&lt;br /&gt;
    local link = safe(entry[2])&lt;br /&gt;
&lt;br /&gt;
    if ns == &amp;quot;&amp;quot; then&lt;br /&gt;
        return link&lt;br /&gt;
    else&lt;br /&gt;
        return ns .. &amp;quot;:&amp;quot; .. link&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Function 8: Get episode title only from key&lt;br /&gt;
function p.getEpisodeTitle(frame)&lt;br /&gt;
    local key = normalizeAlias(frame.args[1])&lt;br /&gt;
    local entry = data[key]&lt;br /&gt;
&lt;br /&gt;
    if not entry then&lt;br /&gt;
        return &amp;quot;Episode not found&amp;quot;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return safe(entry[3])&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Alias → pages&lt;br /&gt;
function p.aliasToPages()&lt;br /&gt;
    local map = {}&lt;br /&gt;
&lt;br /&gt;
    for alias, entry in pairs(data) do&lt;br /&gt;
        local link = entry[2]&lt;br /&gt;
&lt;br /&gt;
        if not map[alias] then&lt;br /&gt;
            map[alias] = { link }&lt;br /&gt;
        else&lt;br /&gt;
            local exists = false&lt;br /&gt;
            for _, v in ipairs(map[alias]) do&lt;br /&gt;
                if v == link then&lt;br /&gt;
                    exists = true&lt;br /&gt;
                    break&lt;br /&gt;
                end&lt;br /&gt;
            end&lt;br /&gt;
            if not exists then&lt;br /&gt;
                table.insert(map[alias], link)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return map&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
function p.debugAllAliases()&lt;br /&gt;
    local out = {}&lt;br /&gt;
    table.insert(out, &amp;quot;== Vérification complète des alias ==&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
    for alias, entry in pairs(data) do&lt;br /&gt;
        local norm = normalizeAlias(alias)&lt;br /&gt;
        local ok = data[norm] and &amp;quot;✔&amp;quot; or &amp;quot;✘&amp;quot;&lt;br /&gt;
&lt;br /&gt;
        table.insert(out,&lt;br /&gt;
            string.format(&lt;br /&gt;
                &amp;quot;* %s &amp;lt;code&amp;gt;%s&amp;lt;/code&amp;gt; → &amp;lt;code&amp;gt;%s&amp;lt;/code&amp;gt;%s&amp;quot;,&lt;br /&gt;
                ok,&lt;br /&gt;
                alias,&lt;br /&gt;
                norm,&lt;br /&gt;
                ok == &amp;quot;✘&amp;quot; and &amp;quot; (introuvable)&amp;quot; or &amp;quot;&amp;quot;&lt;br /&gt;
            )&lt;br /&gt;
        )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return table.concat(out, &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.testTitle(frame)&lt;br /&gt;
    local input = frame.args[1] or &amp;quot;&amp;quot;&lt;br /&gt;
    local norm = normalizeAlias(input)&lt;br /&gt;
    local exists = data[norm] ~= nil&lt;br /&gt;
&lt;br /&gt;
    local out = {}&lt;br /&gt;
    table.insert(out, &amp;quot;== Test de normalisation ==&amp;quot;)&lt;br /&gt;
    table.insert(out, &amp;quot;* Entrée : &amp;lt;code&amp;gt;&amp;quot; .. input .. &amp;quot;&amp;lt;/code&amp;gt;&amp;quot;)&lt;br /&gt;
    table.insert(out, &amp;quot;* Normalisé : &amp;lt;code&amp;gt;&amp;quot; .. norm .. &amp;quot;&amp;lt;/code&amp;gt;&amp;quot;)&lt;br /&gt;
    table.insert(out, &amp;quot;* Trouvé : &amp;quot; .. (exists and &amp;quot;✔ oui&amp;quot; or &amp;quot;✘ non&amp;quot;))&lt;br /&gt;
&lt;br /&gt;
    return table.concat(out, &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>LIMAFOX76</name></author>
	</entry>
</feed>