Aller au contenu

Module:Episode/MultiSeries

De Stargate Wiki Sémantique
Documentation icon Documentation module[créer]
------------------------------------------------------------
-- Module:Episode/MultiSeries
-- Fusion SG1 + SGA + SGU + SGI
-- Normalisation, alias, indexation, cache, doublons
------------------------------------------------------------

local Multi = {}

------------------------------------------------------------
-- 2. Chargement des séries
------------------------------------------------------------
local SG1 = require("Module:Episode/SG1/Index")
local SGA = require("Module:Episode/SGA/Index")
local SGU = require("Module:Episode/SGU/Index")
local SGI = require("Module:Episode/SGI/Index")
local FILMS = require("Module:Episode/Films/Index")

------------------------------------------------------------
-- 3. Tables globales
------------------------------------------------------------
Multi.episodes = {}
Multi.by_id = {}
Multi.by_alias = {}
Multi.by_page = {}
Multi.by_series = {}
Multi.by_season = {}

------------------------------------------------------------
-- 4. Fonction normalize() finale
------------------------------------------------------------

local function normalize(str)
    if not str then return "" end

    -- Remplacement des ligatures et accents AVANT NFD
    str = str
        :gsub("œ", "oe"):gsub("Œ", "oe")
        :gsub("æ", "ae"):gsub("Æ", "ae")
        :gsub("ç", "c"):gsub("Ç", "c")
        :gsub("é", "e"):gsub("É", "e")
        :gsub("è", "e"):gsub("È", "e")
        :gsub("ê", "e"):gsub("Ê", "e")
        :gsub("ë", "e"):gsub("Ë", "e")
        :gsub("à", "a"):gsub("À", "a")
        :gsub("â", "a"):gsub("Â", "a")
        :gsub("ä", "a"):gsub("Ä", "a")
        :gsub("î", "i"):gsub("Î", "i")
        :gsub("ï", "i"):gsub("Ï", "i")
        :gsub("ô", "o"):gsub("Ô", "o")
        :gsub("ö", "o"):gsub("Ö", "o")
        :gsub("ù", "u"):gsub("Ù", "u")
        :gsub("û", "u"):gsub("Û", "u")
        :gsub("ü", "u"):gsub("Ü", "u")

    str = mw.ustring.lower(str)
    str = mw.ustring.toNFD(str)
    str = mw.ustring.gsub(str, "%pM", "")      -- supprime les accents restants
    str = str:gsub("'%s*", "")                -- supprime les apostrophes
    str = str:gsub("[{}]", " ")               -- supprime les accolades

    -- Ponctuation ASCII propre
    str = str:gsub("[!\"#%$%%&%(%)*+,%.%/%:;%<%=%>%?%@%[%]%^_%`%{%|%}%~%-]", " ")

    str = str:gsub("[^%w%s]", " ")            -- supprime les caractères non alphanumériques
    str = str:gsub("%s+", " ")                -- normalise les espaces
    str = mw.text.trim(str)

    return str
end

------------------------------------------------------------
-- 5. Alias techniques SGX
------------------------------------------------------------
local function make_tech_aliases(series, season, episode)
    local season_num = tonumber(season)
    local e = string.format("%02d", tonumber(episode)) -- épisode toujours sur 2 chiffres

    -- Règle globale :
    -- Alias 1 : saison sur 2 chiffres
    -- Alias 2 : saison sans zéro
    -- Alias 3 : saison sans zéro
    local s1 = string.format("%02d", season_num) -- 01, 02, 10...
    local s2 = tostring(season_num)              -- 1, 2, 10...
    local s3 = tostring(season_num)              -- 1, 2, 10...

    series = normalize(series)

    return {
        string.format("%s s%se%s", series, s1, e),  -- sg1 s02e20
        string.format("%s %sx%s", series, s2, e),   -- sg1 2x20
        string.format("%s %s%s", series, s3, e),    -- sg1 220
    }
end

------------------------------------------------------------
-- 6. Génération complète des alias
------------------------------------------------------------
local function make_aliases(ep)
    local a = {}

    -- titres normalisés
    table.insert(a, normalize(ep.page_title_fr))
    table.insert(a, normalize(ep.page_title_en))

    -- id normalisé
    table.insert(a, normalize(ep.id))

    -- alias techniques
    for _, alias in ipairs(make_tech_aliases(ep.series, ep.season, ep.episode)) do
        table.insert(a, alias)
    end

    -- extra_aliases
    if ep.extra_aliases then
        for _, alias in ipairs(ep.extra_aliases) do
            table.insert(a, normalize(alias))
        end
    end

    return a
end

------------------------------------------------------------
-- 7. Ajout d'une série complète
------------------------------------------------------------
local function append_series(series_module)
    for _, ep in ipairs(series_module.episodes or {}) do

        ----------------------------------------------------
        -- Génération des alias
        ----------------------------------------------------
        ep.aliases = make_aliases(ep)

        ----------------------------------------------------
        -- Index par ID
        ----------------------------------------------------
        Multi.by_id[ep.id] = ep

        ----------------------------------------------------
        -- Index par page (FR + EN)
        ----------------------------------------------------
        if ep.page_title_fr then
            Multi.by_page[normalize(ep.page_title_fr)] = ep
        end
        if ep.page_title_en then
            Multi.by_page[normalize(ep.page_title_en)] = ep
        end

        ----------------------------------------------------
        -- Index par alias
        ----------------------------------------------------
        for _, alias in ipairs(ep.aliases) do
            alias = normalize(alias)
            Multi.by_alias[alias] = Multi.by_alias[alias] or {}
            table.insert(Multi.by_alias[alias], ep)
        end

        ----------------------------------------------------
        -- Index par série
        ----------------------------------------------------
        Multi.by_series[ep.series] = Multi.by_series[ep.series] or {}
        table.insert(Multi.by_series[ep.series], ep)

        ----------------------------------------------------
        -- Index par saison
        ----------------------------------------------------
        local key = ep.series .. "-" .. ep.season
        Multi.by_season[key] = Multi.by_season[key] or {}
        table.insert(Multi.by_season[key], ep)

        ----------------------------------------------------
        -- Ajout à la liste globale
        ----------------------------------------------------
        table.insert(Multi.episodes, ep)
    end
end

------------------------------------------------------------
-- 8. Fusion des séries
------------------------------------------------------------
append_series(SG1)
append_series(SGA)
append_series(SGU)
append_series(SGI)
append_series(FILMS)

------------------------------------------------------------
-- 9. Cache final
------------------------------------------------------------

return Multi