Aller au contenu

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

De Stargate Wiki Sémantique
Contenu supprimé Contenu ajouté
Aucun résumé des modifications
Aucun résumé des modifications
Ligne 1 : Ligne 1 :
------------------------------------------------------------
------------------------------------------------------------
-- Module:Episode
-- Module:Episode (ULTRA OPTIMISÉ)
-- API publique pour accéder aux épisodes (toutes séries)
-- API publique pour accéder aux épisodes (toutes séries)
-- Backend : Module:Episode/MultiSeries
-- Backend : Module:Episode/MultiSeries
Ligne 6 : Ligne 6 :


local Index = require("Module:Episode/MultiSeries")
local Index = require("Module:Episode/MultiSeries")
local normalize = require("Module:Episode/MultiSeries").normalize
local p = {}
local p = {}


Ligne 17 : Ligne 18 :
end
end


-- Normalisation simple pour les alias
-- Normalisation identique à MultiSeries
local norm = mw.ustring.lower(key)
local norm = normalize(key)
norm = norm:gsub("%s+", " ")


-- 1) Recherche par ID exact
-- 1) Recherche par ID exact
Ligne 27 : Ligne 27 :


-- 2) Recherche par alias normalisé
-- 2) Recherche par alias normalisé
if Index.by_alias[norm] then
local list = Index.by_alias[norm]
if list and list[1] then
return Index.by_alias[norm][1] -- premier match
return list[1]
end
end


Ligne 38 : Ligne 39 :
------------------------------------------------------------
------------------------------------------------------------
local function preprocessTitle(frame, ep)
local function preprocessTitle(frame, ep)
-- Pré-calculé dans MultiSeries si possible
local raw = ep.title_fr or ep.id or ""
local parsed = frame:preprocess(raw or "")
local raw = ep.title_fr or ep.page_title_fr or ep.id or ""
return parsed or raw
return frame:preprocess(raw)
end
end


Ligne 47 : Ligne 48 :
------------------------------------------------------------
------------------------------------------------------------
local function buildEpisodeLink(frame, ep, labelOverride)
local function buildEpisodeLink(frame, ep, labelOverride)
-- Titre affiché = title_fr (toujours)
local title = labelOverride or preprocessTitle(frame, ep)
local title = labelOverride or preprocessTitle(frame, ep)
title = title or (ep.title_fr or ep.id or "")
local page = ep.page_title_fr or ep.id

-- Page ouverte = page_title_fr (toujours)
local page = ep.page_title_fr or ep.id


if not ep.namespace_fr or ep.namespace_fr == "" then
if not ep.namespace_fr or ep.namespace_fr == "" then
-- Films / téléfilms
return string.format("[[%s|%s]]", page, title)
return string.format("[[%s|%s]]", page, title)
else
else
-- Épisodes normaux
return string.format("[[%s:%s|%s]]", ep.namespace_fr, page, title)
return string.format("[[%s:%s|%s]]", ep.namespace_fr, page, title)
end
end
Ligne 68 : Ligne 63 :
function p.getEpisode(frame)
function p.getEpisode(frame)
local ep = getEntry(frame)
local ep = getEntry(frame)
if not ep then
if not ep then return "Épisode ou film non référencé" end
return "Épisode ou film non référencé"
end
return buildEpisodeLink(frame, ep)
return buildEpisodeLink(frame, ep)
end
end
Ligne 132 : Ligne 125 :
local ep = getEntry(frame)
local ep = getEntry(frame)
if not ep then return "Épisode ou film non référencé" end
if not ep then return "Épisode ou film non référencé" end

return ep.page_title_fr or ep.id
return ep.page_title_fr or ep.id
end
end
Ligne 158 : Ligne 150 :
local ep = getEntry(frame)
local ep = getEntry(frame)
if not ep then return "Épisode ou film non référencé" end
if not ep then return "Épisode ou film non référencé" end

return preprocessTitle(frame, ep)
return preprocessTitle(frame, ep)
end
end
Ligne 169 : Ligne 160 :
if not ep then return "Épisode ou film non référencé" end
if not ep then return "Épisode ou film non référencé" end


if not ep.episode or ep.episode == "" then
local n = tonumber(ep.episode)
return ""
return n and string.format("%02d", n) or ""
end

return string.format("%02d", tonumber(ep.episode))
end
end


Ligne 183 : Ligne 171 :
if not ep then return "Épisode ou film non référencé" end
if not ep then return "Épisode ou film non référencé" end


if not ep.season or ep.season == "" then
return ep.season and tostring(ep.season) or ""
return ""
end

return tostring(ep.season)
end

------------------------------------------------------------
-- 11. Rapport lisible des doublons
------------------------------------------------------------
function p.debugDuplicates(frame)
local d = Index.duplicates
if not d then return "Aucun rapport de doublons disponible" end

local out = {}

table.insert(out, "== Doublons d’ID ==")
if #d.duplicate_ids == 0 then
table.insert(out, "Aucun")
else
for _, id in ipairs(d.duplicate_ids) do
table.insert(out, "* " .. id)
end
end

table.insert(out, "\n== Alias dupliqués ==")
if #d.duplicate_aliases == 0 then
table.insert(out, "Aucun")
else
for _, alias in ipairs(d.duplicate_aliases) do
table.insert(out, "* " .. alias)
end
end

table.insert(out, "\n== Alias contradictoires ==")
if #d.conflicting_aliases == 0 then
table.insert(out, "Aucun")
else
for _, c in ipairs(d.conflicting_aliases) do
table.insert(out, "* " .. c.alias .. " → " .. c.id1 .. " / " .. c.id2)
end
end

return table.concat(out, "\n")
end
end


------------------------------------------------------------
------------------------------------------------------------
-- 12. Génération d’une liste d’épisodes
-- 12. Génération d’une liste d’épisodes (films-safe)
------------------------------------------------------------
------------------------------------------------------------
function p.renderList(frame)
function p.renderList(frame)
Ligne 251 : Ligne 196 :


if ep then
if ep then
table.insert(out, "* " .. frame:preprocess(ep.title_fr))
table.insert(out, "* " .. frame:preprocess(ep.title_fr or ep.page_title_fr))
else
else
table.insert(out, "* (inconnu) " .. id)
table.insert(out, "* (inconnu) " .. id)
Ligne 266 : Ligne 211 :
if ep.series == serie and ep.season == saison then
if ep.series == serie and ep.season == saison then
table.insert(out, {
table.insert(out, {
sort = ep.episode,
sort = tonumber(ep.episode) or 0,
text = "* " .. frame:preprocess(ep.title_fr)
text = "* " .. frame:preprocess(ep.title_fr or ep.page_title_fr)
})
})
end
end
Ligne 288 : Ligne 233 :
for _, ep in pairs(Index.episodes) do
for _, ep in pairs(Index.episodes) do
if ep.series == serie then
if ep.series == serie then
local s = (tonumber(ep.season) or 0) * 100 + (tonumber(ep.episode) or 0)
table.insert(out, {
table.insert(out, {
sort = ep.season * 100 + ep.episode,
sort = s,
text = "* " .. frame:preprocess(ep.title_fr)
text = "* " .. frame:preprocess(ep.title_fr or ep.page_title_fr)
})
})
end
end

Version du 3 juin 2026 à 13:16

Documentation icon Documentation module[créer]
------------------------------------------------------------
-- Module:Episode (ULTRA OPTIMISÉ)
-- API publique pour accéder aux épisodes (toutes séries)
-- Backend : Module:Episode/MultiSeries
------------------------------------------------------------

local Index = require("Module:Episode/MultiSeries")
local normalize = require("Module:Episode/MultiSeries").normalize
local p = {}

------------------------------------------------------------
-- Récupère une entrée d’épisode depuis un argument
------------------------------------------------------------
local function getEntry(frame)
    local key = frame.args[1]
    if not key or key == "" then
        return nil
    end

    -- Normalisation identique à MultiSeries
    local norm = normalize(key)

    -- 1) Recherche par ID exact
    if Index.by_id[key] then
        return Index.by_id[key]
    end

    -- 2) Recherche par alias normalisé
    local list = Index.by_alias[norm]
    if list and list[1] then
        return list[1]
    end

    return nil
end

------------------------------------------------------------
-- Prétraitement du titre (parser)
------------------------------------------------------------
local function preprocessTitle(frame, ep)
    -- Pré-calculé dans MultiSeries si possible
    local raw = ep.title_fr or ep.page_title_fr or ep.id or ""
    return frame:preprocess(raw)
end

------------------------------------------------------------
-- Construction d’un lien d’épisode (sécurisé)
------------------------------------------------------------
local function buildEpisodeLink(frame, ep, labelOverride)
    local title = labelOverride or preprocessTitle(frame, ep)
    local page  = ep.page_title_fr or ep.id

    if not ep.namespace_fr or ep.namespace_fr == "" then
        return string.format("[[%s|%s]]", page, title)
    else
        return string.format("[[%s:%s|%s]]", ep.namespace_fr, page, title)
    end
end

------------------------------------------------------------
-- 1. Lien normal vers l’épisode
------------------------------------------------------------
function p.getEpisode(frame)
    local ep = getEntry(frame)
    if not ep then return "Épisode ou film non référencé" end
    return buildEpisodeLink(frame, ep)
end

------------------------------------------------------------
-- 2. Lien vers Crédits:
------------------------------------------------------------
function p.getCreditsLink(frame)
    local ep = getEntry(frame)
    if not ep then return "Épisode ou film non référencé" end

    local title = preprocessTitle(frame, ep)
    local page  = ep.page_title_fr or ep.id

    return string.format("[[Crédits:%s|%s]]", page, title)
end

------------------------------------------------------------
-- 3. Lien vers Retranscription:
------------------------------------------------------------
function p.getTranscriptLink(frame)
    local ep = getEntry(frame)
    if not ep then return "Épisode ou film non référencé" end

    local title = preprocessTitle(frame, ep)
    local page  = ep.page_title_fr or ep.id

    return string.format("[[Retranscription:%s|%s]]", page, title)
end

------------------------------------------------------------
-- 4. Lien vers Citations:
------------------------------------------------------------
function p.getQuotesLink(frame)
    local ep = getEntry(frame)
    if not ep then return "Épisode ou film non référencé" end

    local title = preprocessTitle(frame, ep)
    local page  = ep.page_title_fr or ep.id

    return string.format("[[Citations:%s|%s]]", page, title)
end

------------------------------------------------------------
-- 5. Lien vers Catégorie:Images de ...
------------------------------------------------------------
function p.getImagesLink(frame)
    local ep = getEntry(frame)
    if not ep then return "Épisode ou film non référencé" end

    local title = preprocessTitle(frame, ep)
    local page  = ep.page_title_fr or ep.id

    return string.format("[[:Catégorie:Images de %s|%s]]", page, title)
end

------------------------------------------------------------
-- 6. Récupère uniquement le titre de page (sans namespace)
------------------------------------------------------------
function p.getEpisodeLink(frame)
    local ep = getEntry(frame)
    if not ep then return "Épisode ou film non référencé" end
    return ep.page_title_fr or ep.id
end

------------------------------------------------------------
-- 7. Récupère le lien complet (namespace + titre)
------------------------------------------------------------
function p.getEpisodeFullLink(frame)
    local ep = getEntry(frame)
    if not ep then return "Épisode ou film non référencé" end

    local page = ep.page_title_fr or ep.id

    if not ep.namespace_fr or ep.namespace_fr == "" then
        return page
    else
        return string.format("%s:%s", ep.namespace_fr, page)
    end
end

------------------------------------------------------------
-- 8. Récupère uniquement le titre français (prétraité)
------------------------------------------------------------
function p.getEpisodeTitle(frame)
    local ep = getEntry(frame)
    if not ep then return "Épisode ou film non référencé" end
    return preprocessTitle(frame, ep)
end

------------------------------------------------------------
-- 9. Numéro d’épisode (2 chiffres)
------------------------------------------------------------
function p.getEpisodeNumber(frame)
    local ep = getEntry(frame)
    if not ep then return "Épisode ou film non référencé" end

    local n = tonumber(ep.episode)
    return n and string.format("%02d", n) or ""
end

------------------------------------------------------------
-- 10. Numéro de saison
------------------------------------------------------------
function p.getSeasonNumber(frame)
    local ep = getEntry(frame)
    if not ep then return "Épisode ou film non référencé" end

    return ep.season and tostring(ep.season) or ""
end

------------------------------------------------------------
-- 12. Génération d’une liste d’épisodes (films-safe)
------------------------------------------------------------
function p.renderList(frame)
    local serie  = frame.args["serie"]
    local saison = tonumber(frame.args["saison"])
    local liste  = frame.args["liste"]

    local out = {}

    ------------------------------------------------------------
    -- Mode 1 : liste personnalisée
    ------------------------------------------------------------
    if liste and liste ~= "" then
        for id in mw.text.gsplit(liste, ",") do
            id = mw.text.trim(id)

            local ep =
                Index.by_id[id]
                or (Index.by_alias[id] and Index.by_alias[id][1])

            if ep then
                table.insert(out, "* " .. frame:preprocess(ep.title_fr or ep.page_title_fr))
            else
                table.insert(out, "* (inconnu) " .. id)
            end
        end
        return table.concat(out, "\n")
    end

    ------------------------------------------------------------
    -- Mode 2 : série + saison
    ------------------------------------------------------------
    if serie and saison then
        for _, ep in pairs(Index.episodes) do
            if ep.series == serie and ep.season == saison then
                table.insert(out, {
                    sort = tonumber(ep.episode) or 0,
                    text = "* " .. frame:preprocess(ep.title_fr or ep.page_title_fr)
                })
            end
        end

        table.sort(out, function(a,b) return a.sort < b.sort end)

        local lines = {}
        for _, item in ipairs(out) do
            table.insert(lines, item.text)
        end

        return table.concat(lines, "\n")
    end

    ------------------------------------------------------------
    -- Mode 3 : série complète
    ------------------------------------------------------------
    if serie then
        for _, ep in pairs(Index.episodes) do
            if ep.series == serie then
                local s = (tonumber(ep.season) or 0) * 100 + (tonumber(ep.episode) or 0)
                table.insert(out, {
                    sort = s,
                    text = "* " .. frame:preprocess(ep.title_fr or ep.page_title_fr)
                })
            end
        end

        table.sort(out, function(a,b) return a.sort < b.sort end)

        local lines = {}
        for _, item in ipairs(out) do
            table.insert(lines, item.text)
        end

        return table.concat(lines, "\n")
    end

    return "Aucun paramètre valide fourni."
end

return p