« Module:Episode/MultiSeries » : différence entre les versions
Apparence
Contenu supprimé Contenu ajouté
Aucun résumé des modifications |
m LIMAFOX76 a déplacé la page Module:Episode REAL/MultiSeries vers Module:Episode/MultiSeries sans laisser de redirection |
||
| (7 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) |
||
-- Fusion SG1 + SGA + SGU + SGI |
-- Fusion SG1 + SGA + SGU + SGI + SGO + FILMS |
||
-- Normalisation, alias, indexation, cache |
-- Normalisation, alias, indexation, cache interne |
||
------------------------------------------------------------ |
------------------------------------------------------------ |
||
-- 0. CACHE INTERNE : si déjà chargé, renvoyer immédiatement |
|||
local loaded = package.loaded["Module:Episode/MultiSeries"] |
|||
| ⚫ | |||
return loaded |
|||
| ⚫ | |||
local Multi = {} |
local Multi = {} |
||
------------------------------------------------------------ |
------------------------------------------------------------ |
||
-- |
-- 1. Chargement des séries |
||
------------------------------------------------------------ |
------------------------------------------------------------ |
||
local SG1 = require("Module:Episode/SG1/Index") |
local SG1 = require("Module:Episode/SG1/Index") |
||
local SGA = require("Module:Episode/SGA/Index") |
local SGA = require("Module:Episode/SGA/Index") |
||
local SGU = require("Module:Episode/SGU/Index") |
local SGU = require("Module:Episode/SGU/Index") |
||
local SGI = require("Module:Episode/SGI/Index") |
local SGI = require("Module:Episode/SGI/Index") |
||
local SGO = require("Module:Episode/SGO/Index") |
local SGO = require("Module:Episode/SGO/Index") |
||
local FILMS = require("Module:Episode/Films/Index") |
local FILMS = require("Module:Episode/Films/Index") |
||
------------------------------------------------------------ |
------------------------------------------------------------ |
||
-- |
-- 2. Tables globales |
||
------------------------------------------------------------ |
------------------------------------------------------------ |
||
Multi.episodes = {} |
Multi.episodes = {} |
||
Multi.by_id = {} |
Multi.by_id = {} |
||
Multi.by_alias = {} |
Multi.by_alias = {} |
||
Multi.by_page = {} |
Multi.by_page = {} |
||
Multi.by_series = {} |
Multi.by_series = {} |
||
Multi.by_season = {} |
Multi.by_season = {} |
||
------------------------------------------------------------ |
------------------------------------------------------------ |
||
-- |
-- 3. Fonction normalize() exposée |
||
------------------------------------------------------------ |
------------------------------------------------------------ |
||
local function normalize(str) |
local function normalize(str) |
||
if not str then return "" end |
if not str then return "" end |
||
-- Remplacement des ligatures et accents AVANT NFD |
|||
str = str |
str = str |
||
:gsub("œ", "oe"):gsub("Œ", "oe") |
:gsub("œ", "oe"):gsub("Œ", "oe") |
||
| Ligne 56 : | Ligne 60 : | ||
str = mw.ustring.lower(str) |
str = mw.ustring.lower(str) |
||
str = mw.ustring.toNFD(str) |
str = mw.ustring.toNFD(str) |
||
str = mw.ustring.gsub(str, "%pM", "") |
str = mw.ustring.gsub(str, "%pM", "") |
||
str = str:gsub("'%s*", "") |
str = str:gsub("'%s*", "") |
||
str = str:gsub("[{}]", " ") |
str = str:gsub("[{}]", " ") |
||
-- Ponctuation ASCII propre |
|||
str = str:gsub("[!\"#%$%%&%(%)*+,%.%/%:;%<%=%>%?%@%[%]%^_%`%{%|%}%~%-]", " ") |
str = str:gsub("[!\"#%$%%&%(%)*+,%.%/%:;%<%=%>%?%@%[%]%^_%`%{%|%}%~%-]", " ") |
||
str = str:gsub("[^%w%s]", " ") |
|||
str = str:gsub(" |
str = str:gsub("%s+", " ") |
||
str = str:gsub("%s+", " ") -- normalise les espaces |
|||
str = mw.text.trim(str) |
str = mw.text.trim(str) |
||
return str |
return str |
||
end |
end |
||
Multi.normalize = normalize |
|||
------------------------------------------------------------ |
------------------------------------------------------------ |
||
-- |
-- 4. Alias techniques SGX |
||
------------------------------------------------------------ |
------------------------------------------------------------ |
||
local function make_tech_aliases(series, season, episode) |
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 season_num = tonumber(season) |
||
local e = string.format("%02d", tonumber(episode)) |
local e = string.format("%02d", tonumber(episode)) |
||
| ⚫ | |||
-- Règle globale : |
|||
| ⚫ | |||
-- Alias 1 : saison sur 2 chiffres |
|||
| ⚫ | |||
-- Alias 2 : saison sans zéro |
|||
-- Alias 3 : saison sans zéro |
|||
| ⚫ | |||
| ⚫ | |||
| ⚫ | |||
series = normalize(series) |
series = normalize(series) |
||
return { |
return { |
||
string.format("%s s%se%s", series, s1, e), |
string.format("%s s%se%s", series, s1, e), |
||
string.format("%s %sx%s", series, s2, e), |
string.format("%s %sx%s", series, s2, e), |
||
string.format("%s %s%s", series, s3, e), |
string.format("%s %s%s", series, s3, e), |
||
} |
} |
||
end |
end |
||
------------------------------------------------------------ |
------------------------------------------------------------ |
||
-- |
-- 5. Génération complète des alias |
||
------------------------------------------------------------ |
------------------------------------------------------------ |
||
local function make_aliases(ep) |
local function make_aliases(ep) |
||
local a = {} |
local a = {} |
||
-- titres normalisés |
|||
table.insert(a, normalize(ep.page_title_fr)) |
table.insert(a, normalize(ep.page_title_fr)) |
||
table.insert(a, normalize(ep.page_title_en)) |
table.insert(a, normalize(ep.page_title_en)) |
||
-- id normalisé |
|||
table.insert(a, normalize(ep.id)) |
table.insert(a, normalize(ep.id)) |
||
-- alias techniques (uniquement si saison + épisode existent) |
|||
if ep.season and ep.episode then |
if ep.season and ep.episode then |
||
for _, alias in ipairs(make_tech_aliases(ep.series, ep.season, ep.episode)) do |
for _, alias in ipairs(make_tech_aliases(ep.series, ep.season, ep.episode)) do |
||
| Ligne 114 : | Ligne 113 : | ||
end |
end |
||
-- extra_aliases |
|||
if ep.extra_aliases then |
if ep.extra_aliases then |
||
for _, alias in ipairs(ep.extra_aliases) do |
for _, alias in ipairs(ep.extra_aliases) do |
||
| Ligne 125 : | Ligne 123 : | ||
------------------------------------------------------------ |
------------------------------------------------------------ |
||
-- |
-- 6. Ajout d’une série complète |
||
------------------------------------------------------------ |
------------------------------------------------------------ |
||
local function append_series(series_module) |
local function append_series(series_module) |
||
for _, ep in ipairs(series_module.episodes or {}) do |
for _, ep in ipairs(series_module.episodes or {}) do |
||
---------------------------------------------------- |
|||
-- Génération des alias |
|||
---------------------------------------------------- |
|||
ep.aliases = make_aliases(ep) |
ep.aliases = make_aliases(ep) |
||
---------------------------------------------------- |
|||
-- Index par ID |
|||
---------------------------------------------------- |
|||
Multi.by_id[ep.id] = ep |
Multi.by_id[ep.id] = ep |
||
---------------------------------------------------- |
|||
-- Index par page (FR + EN) |
|||
---------------------------------------------------- |
|||
if ep.page_title_fr then |
if ep.page_title_fr then |
||
Multi.by_page[normalize(ep.page_title_fr)] = ep |
Multi.by_page[normalize(ep.page_title_fr)] = ep |
||
| Ligne 150 : | Ligne 139 : | ||
end |
end |
||
---------------------------------------------------- |
|||
-- Index par alias |
|||
---------------------------------------------------- |
|||
for _, alias in ipairs(ep.aliases) do |
for _, alias in ipairs(ep.aliases) do |
||
alias = normalize(alias) |
alias = normalize(alias) |
||
| Ligne 159 : | Ligne 145 : | ||
end |
end |
||
---------------------------------------------------- |
|||
-- Index par série |
|||
---------------------------------------------------- |
|||
Multi.by_series[ep.series] = Multi.by_series[ep.series] or {} |
Multi.by_series[ep.series] = Multi.by_series[ep.series] or {} |
||
table.insert(Multi.by_series[ep.series], ep) |
table.insert(Multi.by_series[ep.series], ep) |
||
if ep.season then |
|||
---------------------------------------------------- |
|||
| ⚫ | |||
-- Index par saison |
|||
| ⚫ | |||
---------------------------------------------------- |
|||
| ⚫ | |||
| ⚫ | |||
end |
|||
| ⚫ | |||
| ⚫ | |||
| ⚫ | |||
| ⚫ | |||
---------------------------------------------------- |
|||
-- Ajout à la liste globale |
|||
---------------------------------------------------- |
|||
table.insert(Multi.episodes, ep) |
table.insert(Multi.episodes, ep) |
||
end |
end |
||
| Ligne 182 : | Ligne 159 : | ||
------------------------------------------------------------ |
------------------------------------------------------------ |
||
-- |
-- 7. Fusion des séries (UNE SEULE FOIS) |
||
------------------------------------------------------------ |
------------------------------------------------------------ |
||
append_series(SG1) |
append_series(SG1) |
||
| Ligne 192 : | Ligne 169 : | ||
------------------------------------------------------------ |
------------------------------------------------------------ |
||
-- 8. Enregistrer dans package.loaded (cache interne) |
|||
-- 9. Cache final |
|||
------------------------------------------------------------ |
------------------------------------------------------------ |
||
package.loaded["Module:Episode/MultiSeries"] = Multi |
|||
function Multi.debug() |
|||
return "MultiSeries chargé OK" |
|||
end |
|||
return Multi |
return Multi |
||
Dernière version du 3 juin 2026 à 14:15
| 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 (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