Aller au contenu

Module:Episode

De Stargate Wiki Sémantique
Documentation icon Documentation module[créer]
------------------------------------------------------------
-- Module:Episode
-- API publique pour accéder aux épisodes Stargate
-- Utilise Module:Episode/MultiSeries (indexation complète)
------------------------------------------------------------

local p = {}
local Multi = require("Module:Episode/MultiSeries")

------------------------------------------------------------
-- Normalisation locale (même logique que MultiSeries)
------------------------------------------------------------
local function normalize(str)
    if not str then return "" end

    str = mw.ustring.lower(str)
    str = mw.ustring.toNFD(str)
    str = mw.ustring.gsub(str, "%pM", "")
    str = str:gsub("'%s*", "")
    str = str:gsub("[{}]", " ")
    str = str:gsub("[%p]", " ")
    str = str:gsub("[^%w%s]", " ")
    str = str:gsub("%s+", " ")
    str = mw.text.trim(str)

    return str
end

------------------------------------------------------------
-- Récupération d’un épisode par ID
------------------------------------------------------------
function p.getEpisodeById(id)
    if not id then return nil end
    return Multi.by_id[id]
end

------------------------------------------------------------
-- Récupération d’un épisode par alias
------------------------------------------------------------
function p.getEpisodeByAlias(alias)
    if not alias then return nil end
    alias = normalize(alias)
    local list = Multi.by_alias[alias]
    if not list then return nil end

    -- Si un seul épisode correspond → renvoyer directement
    if #list == 1 then
        return list[1]
    end

    -- Sinon renvoyer la liste complète (ambiguïté)
    return list
end

------------------------------------------------------------
-- Récupération d’un épisode par titre de page
------------------------------------------------------------
function p.getEpisodeByPage(page)
    if not page then return nil end
    return Multi.by_page[normalize(page)]
end

------------------------------------------------------------
-- Récupération d’un épisode par série + saison + numéro
------------------------------------------------------------
function p.getEpisode(series, season, episode)
    if not (series and season and episode) then return nil end

    local key = series .. "-" .. season
    local list = Multi.by_season[key]
    if not list then return nil end

    for _, ep in ipairs(list) do
        if ep.episode == tonumber(episode) then
            return ep
        end
    end

    return nil
end

------------------------------------------------------------
-- Génération d’un lien vers l’épisode
------------------------------------------------------------
function p.getEpisodeLink(ep)
    if not ep then return "" end
    return string.format("[[%s:%s]]", ep.namespace_fr or "Épisode", ep.page_title_fr)
end

------------------------------------------------------------
-- Génération d’un lien complet (FR + EN)
------------------------------------------------------------
function p.getEpisodeFullLink(ep)
    if not ep then return "" end

    local fr = string.format("[[%s:%s|%s]]",
        ep.namespace_fr or "Épisode",
        ep.page_title_fr,
        ep.title_fr or ep.page_title_fr
    )

    local en = string.format("[[%s:%s|%s]]",
        ep.namespace_en or "Episode",
        ep.page_title_en,
        ep.title_en or ep.page_title_en
    )

    return fr .. " / " .. en
end

------------------------------------------------------------
-- Raccourcis API pour #invoke
------------------------------------------------------------
function p.id(frame)
    local id = frame.args[1] or frame.args.id
    local ep = p.getEpisodeById(id)
    if not ep then return "" end
    return p.getEpisodeLink(ep)
end

function p.alias(frame)
    local alias = frame.args[1] or frame.args.alias
    local ep = p.getEpisodeByAlias(alias)
    if not ep then return "" end

    if type(ep) == "table" and ep.id then
        return p.getEpisodeLink(ep)
    end

    -- Ambiguïté : renvoyer la liste
    local out = {}
    for _, e in ipairs(ep) do
        table.insert(out, p.getEpisodeLink(e))
    end
    return table.concat(out, " • ")
end

function p.page(frame)
    local page = frame.args[1] or frame.args.page
    local ep = p.getEpisodeByPage(page)
    if not ep then return "" end
    return p.getEpisodeLink(ep)
end

return p