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 38 : Ligne 38 :
------------------------------------------------------------
------------------------------------------------------------
local function preprocessTitle(frame, ep)
local function preprocessTitle(frame, ep)
local raw =
local raw = ep.title_fr or ep.id or ""
local parsed = frame:preprocess(raw or "")
ep.page_title_fr
or ""
return parsed or raw

return frame:preprocess(raw)
end
end


Ligne 49 : Ligne 47 :
------------------------------------------------------------
------------------------------------------------------------
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 "")


-- Page cible (fallbacks sûrs)
-- Page ouverte = page_title_fr (toujours)
local page =
local page = ep.page_title_fr or ep.id
ep.page_title_fr


if not ep.namespace or ep.namespace == "" then
if not ep.namespace or ep.namespace == "" then
-- Films / téléfilms
-- Films / téléfilms
return string.format("[[%s|%s]]", page, title_fr)
return string.format("[[%s|%s]]", page, title)
else
else
-- Épisodes normaux
-- Épisodes normaux
return string.format("[[%s:%s|%s]]", ep.namespace, page, title_fr)
return string.format("[[%s:%s|%s]]", ep.namespace, page, title)
end
end
end
end
Ligne 80 : Ligne 79 :
function p.getCreditsLink(frame)
function p.getCreditsLink(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
local title = preprocessTitle(frame, ep)
local title = preprocessTitle(frame, ep)
return string.format("[[Crédits:%s|%s]]", ep.page_title_fr or ep.id, title_fr)
local page = ep.page_title_fr or ep.id

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


Ligne 92 : Ligne 92 :
function p.getTranscriptLink(frame)
function p.getTranscriptLink(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
local title = preprocessTitle(frame, ep)
local title = preprocessTitle(frame, ep)
return string.format("[[Retranscription:%s|%s]]", ep.page_title_fr or ep.id, title_fr)
local page = ep.page_title_fr or ep.id

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


Ligne 104 : Ligne 105 :
function p.getQuotesLink(frame)
function p.getQuotesLink(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
local title = preprocessTitle(frame, ep)
local title = preprocessTitle(frame, ep)
return string.format("[[Citations:%s|%s]]", ep.page_title_fr or ep.id, title_fr)
local page = ep.page_title_fr or ep.id

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


Ligne 116 : Ligne 118 :
function p.getImagesLink(frame)
function p.getImagesLink(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
local title = preprocessTitle(frame, ep)
local title = preprocessTitle(frame, ep)
return string.format("[[:Catégorie:Images de %s|%s]]", ep.page_title_fr or ep.id, title_fr)
local page = ep.page_title_fr or ep.id

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


Ligne 128 : Ligne 131 :
function p.getEpisodeLink(frame)
function p.getEpisodeLink(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é"
return ep.page_title_fr or ep.id
end
return ep.page_title_fr or ep.page_title_en or ep.id
end
end


Ligne 139 : Ligne 141 :
function p.getEpisodeFullLink(frame)
function p.getEpisodeFullLink(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


local page =
local page = ep.page_title_fr or ep.id
ep.page_title_fr
or ep.page_title_en
or ep.property
or ep.id


if not ep.namespace or ep.namespace == "" then
if not ep.namespace or ep.namespace == "" then
Ligne 161 : Ligne 157 :
function p.getEpisodeTitle(frame)
function p.getEpisodeTitle(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 preprocessTitle(frame, ep)
return preprocessTitle(frame, ep)
end
end
Ligne 172 : Ligne 167 :
function p.getEpisodeNumber(frame)
function p.getEpisodeNumber(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


if not ep.episode or ep.episode == "" then
if not ep.episode or ep.episode == "" then
Ligne 188 : Ligne 181 :
function p.getSeasonNumber(frame)
function p.getSeasonNumber(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


if not ep.season or ep.season == "" then
if not ep.season or ep.season == "" then
Ligne 204 : Ligne 195 :
function p.debugDuplicates(frame)
function p.debugDuplicates(frame)
local d = Index.duplicates
local d = Index.duplicates
if not d then
if not d then return "Aucun rapport de doublons disponible" end
return "Aucun rapport de doublons disponible"
end


local out = {}
local out = {}
Ligne 256 : Ligne 245 :
for id in mw.text.gsplit(liste, ",") do
for id in mw.text.gsplit(liste, ",") do
id = mw.text.trim(id)
id = mw.text.trim(id)

local ep =
local ep =
Index.by_id[id]
Index.by_id[id]

Version du 2 juin 2026 à 20:57

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

local Index = require("Module:Episode/MultiSeries")
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 simple pour les alias
    local norm = mw.ustring.lower(key)
    norm = norm:gsub("%s+", " ")

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

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

    return nil
end

------------------------------------------------------------
-- Prétraitement du titre (parser)
------------------------------------------------------------
local function preprocessTitle(frame, ep)
    local raw = ep.title_fr or ep.id or ""
    local parsed = frame:preprocess(raw or "")
    return parsed or raw
end

------------------------------------------------------------
-- Construction d’un lien d’épisode (sécurisé)
------------------------------------------------------------
local function buildEpisodeLink(frame, ep, labelOverride)
    -- Titre affiché = title_fr (toujours)
    local title = labelOverride or preprocessTitle(frame, ep)
    title = title or (ep.title_fr or ep.id or "")

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

    if not ep.namespace or ep.namespace == "" then
        -- Films / téléfilms
        return string.format("[[%s|%s]]", page, title)
    else
        -- Épisodes normaux
        return string.format("[[%s:%s|%s]]", ep.namespace, 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 or ep.namespace == "" then
        return page
    else
        return string.format("%s:%s", ep.namespace, 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

    if not ep.episode or ep.episode == "" then
        return ""
    end

    return string.format("%02d", tonumber(ep.episode))
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

    if not ep.season or ep.season == "" then
        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

------------------------------------------------------------
-- 12. Génération d’une liste d’épisodes
------------------------------------------------------------
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))
            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 = ep.episode,
                    text = "* " .. frame:preprocess(ep.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
                table.insert(out, {
                    sort = ep.season * 100 + ep.episode,
                    text = "* " .. frame:preprocess(ep.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