« Module:Episode/index » : différence entre les versions
Apparence
Contenu supprimé Contenu ajouté
Aucun résumé des modifications |
Aucun résumé des modifications Balise : Révocation manuelle |
||
| (12 versions intermédiaires par le même utilisateur non affichées) | |||
| Ligne 1 : | Ligne 1 : | ||
local data = mw.loadData("Module:Episode/index/data") |
|||
local p = {} |
local p = {} |
||
local sources = { |
|||
"Module:Episode/SG1Season1", |
|||
"Module:Episode/SG1Season2", |
|||
"Module:Episode/SG1Season3", |
|||
"Module:Episode/SG1Season4", |
|||
"Module:Episode/SG1Season5", |
|||
"Module:Episode/SG1Season6", |
|||
"Module:Episode/SG1Season7", |
|||
"Module:Episode/SG1Season8", |
|||
"Module:Episode/SG1Season9", |
|||
"Module:Episode/SG1Season10", |
|||
"Module:Episode/SGASeason1", |
|||
"Module:Episode/SGASeason2", |
|||
"Module:Episode/SGASeason3", |
|||
"Module:Episode/SGASeason4", |
|||
"Module:Episode/SGASeason5", |
|||
"Module:Episode/SGUSeason1", |
|||
"Module:Episode/SGUSeason2", |
|||
"Module:Episode/SGISeason1", |
|||
"Module:Episode/SGOSeason1", |
|||
"Module:Episode/SGUMovies", |
|||
} |
|||
p.index = {} |
|||
local function normalize(s) |
local function normalize(s) |
||
s = s or "" |
s = s or "" |
||
s = mw.text.trim(s) |
s = mw.text.trim(s) |
||
-- Décomposition Unicode |
|||
s = mw.ustring.toNFD(s) |
s = mw.ustring.toNFD(s) |
||
-- Suppression des diacritiques (accents) |
|||
local combining_start = mw.ustring.char(0x0300) |
|||
s = mw.ustring.gsub(s, "%pM", "") |
|||
s = mw.ustring.gsub(s, "[" .. combining_start .. "-" .. combining_end .. "]", "") |
|||
-- Normalisation apostrophes |
|||
s = mw.ustring.gsub(s, "[’‘´`]", "'") |
s = mw.ustring.gsub(s, "[’‘´`]", "'") |
||
-- Guillemets |
|||
s = mw.ustring.gsub(s, "[“”]", "\"") |
s = mw.ustring.gsub(s, "[“”]", "\"") |
||
-- Tirets |
|||
s = mw.ustring.gsub(s, "[–—−]", "-") |
s = mw.ustring.gsub(s, "[–—−]", "-") |
||
-- Espaces multiples |
|||
s = mw.ustring.gsub(s, "%s+", " ") |
s = mw.ustring.gsub(s, "%s+", " ") |
||
s = mw.ustring.lower(s) |
|||
s = mw.text.trim(s) |
|||
return s |
|||
end |
|||
-- Génère une version sans tirets |
|||
local function alias_no_dash(a) |
|||
return mw.ustring.gsub(a, "[-–—]", "") |
|||
end |
|||
-- Génère une version où les tirets deviennent des espaces |
|||
local function alias_dash_to_space(a) |
|||
return mw.ustring.gsub(a, "[-–—]", " ") |
|||
end |
|||
-- Construction de l’index multi‑clé |
|||
for _, modname in ipairs(sources) do |
|||
local ok, mod = pcall(require, modname) |
|||
if ok and mod.episodes then |
|||
local isMovieModule = modname:match("SGUMovies") |
|||
for _, ep in ipairs(mod.episodes) do |
|||
-- Ajustements spécifiques aux films |
|||
if isMovieModule then |
|||
ep.namespace = ep.namespace or "" |
|||
ep.season = ep.season or "" |
|||
ep.episode = ep.episode or "" |
|||
end |
|||
for _, key in ipairs(ep.alias or {}) do |
|||
-- Variantes d’alias |
|||
local variants = { key } |
|||
-- 1) Sans tirets |
|||
local nd = alias_no_dash(key) |
|||
if nd ~= key then |
|||
table.insert(variants, nd) |
|||
end |
|||
-- 2) Tirets → espaces |
|||
local sp = alias_dash_to_space(key) |
|||
if sp ~= key then |
|||
table.insert(variants, sp) |
|||
end |
|||
-- Indexation de toutes les variantes |
|||
for _, raw in ipairs(variants) do |
|||
local nkey = normalize(raw) |
|||
return mw.ustring.lower(mw.text.trim(s)) |
|||
if p.index[nkey] then |
|||
mw.log(string.format( |
|||
"[EpisodeIndex] Collision d'alias détectée : '%s' → %s et %s", |
|||
nkey, |
|||
p.index[nkey].id or "(sans id)", |
|||
ep.id or "(sans id)" |
|||
)) |
|||
else |
|||
p.index[nkey] = ep |
|||
end |
|||
end |
|||
end |
|||
end |
|||
end |
|||
end |
end |
||
-- Fonction d'accès |
|||
function p.get(key) |
function p.get(key) |
||
return data[normalize(key)] |
|||
if not ep then return nil end |
|||
return { |
|||
id = ep.id, |
|||
namespace = ep.namespace, |
|||
page_title = ep.page_title, |
|||
title_fr = ep.title_fr, |
|||
title_qc = ep.title_qc, |
|||
title_vo = ep.title_vo, |
|||
property = ep.property, |
|||
season = ep.season, |
|||
episode = ep.episode, |
|||
} |
|||
end |
end |
||
Dernière version du 31 mai 2026 à 20:48
| 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. |
local data = mw.loadData("Module:Episode/index/data")
local p = {}
local function normalize(s)
s = s or ""
s = mw.text.trim(s)
-- Décomposition Unicode
s = mw.ustring.toNFD(s)
-- Suppression des diacritiques (accents)
s = mw.ustring.gsub(s, "%pM", "")
-- Normalisation apostrophes
s = mw.ustring.gsub(s, "[’‘´`]", "'")
-- Guillemets
s = mw.ustring.gsub(s, "[“”]", "\"")
-- Tirets
s = mw.ustring.gsub(s, "[–—−]", "-")
-- Espaces multiples
s = mw.ustring.gsub(s, "%s+", " ")
return mw.ustring.lower(mw.text.trim(s))
end
function p.get(key)
return data[normalize(key)]
end
return p