Aller au contenu

« Module:Episode/MultiSeries » : différence entre les versions

De Stargate Wiki Sémantique
Contenu supprimé Contenu ajouté
Page créée avec « -- Module:Episode/MultiSeries -- Loads series index modules and season modules, merges episodes and aliases local utils = require("Module:Episode/Shared/Utils") local Master = { episodes = {}, -- id -> episode table aliases = {}, -- normalized alias -> id loaded = {}, -- list of loaded module paths } -- Load a season module safely and merge local function load_and_merge(module_path) local ok, mod = pcall(require, module_path) if not... »
 
m LIMAFOX76 a déplacé la page Module:Episode REAL/MultiSeries vers Module:Episode/MultiSeries sans laisser de redirection
 
(25 versions intermédiaires par le même utilisateur non affichées)
Ligne 1 : Ligne 1 :
------------------------------------------------------------
-- Module:Episode/MultiSeries
-- Module:Episode/MultiSeries (VERSION FINALE + CACHE INTERNE)
-- Loads series index modules and season modules, merges episodes and aliases
-- Fusion SG1 + SGA + SGU + SGI + SGO + FILMS
local utils = require("Module:Episode/Shared/Utils")
-- Normalisation, alias, indexation, cache interne
local Master = {
------------------------------------------------------------
episodes = {}, -- id -> episode table
aliases = {}, -- normalized alias -> id
loaded = {}, -- list of loaded module paths
}


-- 0. CACHE INTERNE : si déjà chargé, renvoyer immédiatement
-- Load a season module safely and merge
local loaded = package.loaded["Module:Episode/MultiSeries"]
local function load_and_merge(module_path)
if loaded then
local ok, mod = pcall(require, module_path)
return loaded
if not ok or type(mod) ~= "table" then return false end
end
for k,v in pairs(mod) do

if type(v) == "table" and v.id and utils.validate_episode(v) then
local Multi = {}
Master.episodes[v.id] = v

if type(v.aliases) == "table" then
------------------------------------------------------------
for _, a in ipairs(v.aliases) do
-- 1. Chargement des séries
local norm = utils.normalize_alias(a)
------------------------------------------------------------
if norm then Master.aliases[norm] = v.id end
local SG1 = require("Module:Episode/SG1/Index")
end
local SGA = require("Module:Episode/SGA/Index")
end
local SGU = require("Module:Episode/SGU/Index")
elseif type(v) == "string" then
local SGI = require("Module:Episode/SGI/Index")
local norm = utils.normalize_alias(k)
local SGO = require("Module:Episode/SGO/Index")
if norm and v ~= "" then Master.aliases[norm] = v end
local FILMS = require("Module:Episode/Films/Index")

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

------------------------------------------------------------
-- 3. Fonction normalize() exposée
------------------------------------------------------------
local function normalize(str)
if not str then return "" end

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", "")
str = str:gsub("'%s*", "")
str = str:gsub("[{}]", " ")
str = str:gsub("[!\"#%$%%&%(%)*+,%.%/%:;%<%=%>%?%@%[%]%^_%`%{%|%}%~%-]", " ")
str = str:gsub("[^%w%s]", " ")
str = str:gsub("%s+", " ")
str = mw.text.trim(str)

return str
end

Multi.normalize = normalize

------------------------------------------------------------
-- 4. Alias techniques SGX
------------------------------------------------------------
local function make_tech_aliases(series, season, episode)
if not season or not episode then
return {} -- films → aucun alias technique
end

local season_num = tonumber(season)
local e = string.format("%02d", tonumber(episode))

local s1 = string.format("%02d", season_num)
local s2 = tostring(season_num)
local s3 = tostring(season_num)

series = normalize(series)

return {
string.format("%s s%se%s", series, s1, e),
string.format("%s %sx%s", series, s2, e),
string.format("%s %s%s", series, s3, e),
}
end

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

table.insert(a, normalize(ep.page_title_fr))
table.insert(a, normalize(ep.page_title_en))
table.insert(a, normalize(ep.id))

if ep.season and ep.episode then
for _, alias in ipairs(make_tech_aliases(ep.series, ep.season, ep.episode)) do
table.insert(a, alias)
end
end
end
end

table.insert(Master.loaded, module_path)
if ep.extra_aliases then
return true
for _, alias in ipairs(ep.extra_aliases) do
table.insert(a, normalize(alias))
end
end

return a
end
end


------------------------------------------------------------
-- Public: load a list of series index modules
-- 6. Ajout d’une série complète
function Master.load_series(series_index_modules)
------------------------------------------------------------
series_index_modules = series_index_modules or {
local function append_series(series_module)
"Module:Episode/SGU/Index",
for _, ep in ipairs(series_module.episodes or {}) do
"Module:Episode/SG1/Index",

}
ep.aliases = make_aliases(ep)
for _, idx_path in ipairs(series_index_modules) do

local ok, idx = pcall(require, idx_path)
Multi.by_id[ep.id] = ep
if ok and type(idx) == "table" and idx.list_seasons then

for _, s in ipairs(idx.list_seasons()) do
if ep.page_title_fr then
load_and_merge(s.module)
end
Multi.by_page[normalize(ep.page_title_fr)] = ep
end
end
if ep.page_title_en then
Multi.by_page[normalize(ep.page_title_en)] = ep
end

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

Multi.by_series[ep.series] = Multi.by_series[ep.series] or {}
table.insert(Multi.by_series[ep.series], ep)

if ep.season then
local key = ep.series .. "-" .. ep.season
Multi.by_season[key] = Multi.by_season[key] or {}
table.insert(Multi.by_season[key], ep)
end

table.insert(Multi.episodes, ep)
end
end
return {
episodes_count = (function() local c=0; for _ in pairs(Master.episodes) do c=c+1 end; return c end)(),
aliases_count = (function() local c=0; for _ in pairs(Master.aliases) do c=c+1 end; return c end)(),
loaded = Master.loaded,
}
end
end


------------------------------------------------------------
function Master.get_by_id(id) return Master.episodes[id] end
-- 7. Fusion des séries (UNE SEULE FOIS)
function Master.resolve_alias(alias) return Master.aliases[utils.normalize_alias(alias)] end
------------------------------------------------------------
function Master.get_by_alias(alias)
append_series(SG1)
local id = Master.resolve_alias(alias)
append_series(SGA)
if id then return Master.get_by_id(id) end
append_series(SGU)
return nil
append_series(SGI)
append_series(SGO)
append_series(FILMS)

------------------------------------------------------------
-- 8. Enregistrer dans package.loaded (cache interne)
------------------------------------------------------------
package.loaded["Module:Episode/MultiSeries"] = Multi

function Multi.debug()
return "MultiSeries chargé OK"
end
end


return Master
return Multi

Dernière version du 3 juin 2026 à 14:15

Documentation icon Documentation module[créer]
------------------------------------------------------------
-- Module:Episode/MultiSeries (VERSION FINALE + CACHE INTERNE)
-- Fusion SG1 + SGA + SGU + SGI + SGO + FILMS
-- Normalisation, alias, indexation, cache interne
------------------------------------------------------------

-- 0. CACHE INTERNE : si déjà chargé, renvoyer immédiatement
local loaded = package.loaded["Module:Episode/MultiSeries"]
if loaded then
    return loaded
end

local Multi = {}

------------------------------------------------------------
-- 1. 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 SGO   = require("Module:Episode/SGO/Index")
local FILMS = require("Module:Episode/Films/Index")

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

------------------------------------------------------------
-- 3. Fonction normalize() exposée
------------------------------------------------------------
local function normalize(str)
    if not str then return "" end

    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", "")
    str = str:gsub("'%s*", "")
    str = str:gsub("[{}]", " ")
    str = str:gsub("[!\"#%$%%&%(%)*+,%.%/%:;%<%=%>%?%@%[%]%^_%`%{%|%}%~%-]", " ")
    str = str:gsub("[^%w%s]", " ")
    str = str:gsub("%s+", " ")
    str = mw.text.trim(str)

    return str
end

Multi.normalize = normalize

------------------------------------------------------------
-- 4. Alias techniques SGX
------------------------------------------------------------
local function make_tech_aliases(series, season, episode)
    if not season or not episode then
        return {} -- films → aucun alias technique
    end

    local season_num = tonumber(season)
    local e = string.format("%02d", tonumber(episode))

    local s1 = string.format("%02d", season_num)
    local s2 = tostring(season_num)
    local s3 = tostring(season_num)

    series = normalize(series)

    return {
        string.format("%s s%se%s", series, s1, e),
        string.format("%s %sx%s", series, s2, e),
        string.format("%s %s%s", series, s3, e),
    }
end

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

    table.insert(a, normalize(ep.page_title_fr))
    table.insert(a, normalize(ep.page_title_en))
    table.insert(a, normalize(ep.id))

    if ep.season and ep.episode then
        for _, alias in ipairs(make_tech_aliases(ep.series, ep.season, ep.episode)) do
            table.insert(a, alias)
        end
    end

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

    return a
end

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

        ep.aliases = make_aliases(ep)

        Multi.by_id[ep.id] = ep

        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

        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

        Multi.by_series[ep.series] = Multi.by_series[ep.series] or {}
        table.insert(Multi.by_series[ep.series], ep)

        if ep.season then
            local key = ep.series .. "-" .. ep.season
            Multi.by_season[key] = Multi.by_season[key] or {}
            table.insert(Multi.by_season[key], ep)
        end

        table.insert(Multi.episodes, ep)
    end
end

------------------------------------------------------------
-- 7. Fusion des séries (UNE SEULE FOIS)
------------------------------------------------------------
append_series(SG1)
append_series(SGA)
append_series(SGU)
append_series(SGI)
append_series(SGO)
append_series(FILMS)

------------------------------------------------------------
-- 8. Enregistrer dans package.loaded (cache interne)
------------------------------------------------------------
package.loaded["Module:Episode/MultiSeries"] = Multi

function Multi.debug()
    return "MultiSeries chargé OK"
end

return Multi