Module:Episode/MultiSeries
Apparence
| Il sera peut-être nécessaire de créer une page documentation pour ce module Scribunto programmé dans la page créer Les éditeurs peuvent faire des tests sur les pages bac à sable (créer | miroir) et études de cas (créer) du module. Veuillez ajouter les catégories dans la sous-page /documentation. Sous-pages de ce module. |
------------------------------------------------------------
-- Module:Episode/MultiSeries
-- Fusion SG1 + SGA + SGU
-- 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")
------------------------------------------------------------
-- 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
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
------------------------------------------------------------
-- 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.title_fr))
table.insert(a, normalize(ep.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)
------------------------------------------------------------
-- 9. Cache final
------------------------------------------------------------
return Multi