Module:UnitLinker: Difference between revisions
From Heroes of Might and Magic: Olden Era Official Wiki
No edit summary |
No edit summary |
||
| Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
-- Charge la table de correspondance en mémoire | -- Charge la table de correspondance en mémoire avec filtrage strict | ||
local function getUnitRegistry(lang) | local function getUnitRegistry(lang) | ||
local registry = {} | local registry = {} | ||
-- On | |||
-- On ajoute bien 'type = "unit"' pour garantir l'unicité du contexte | |||
local query = "type = 'unit' AND (language = 'en' OR language = '" .. lang .. "')" | local query = "type = 'unit' AND (language = 'en' OR language = '" .. lang .. "')" | ||
local results = mw.ext.cargo.query("Translation", "target_id, name", { where = query }) | |||
-- On récupère target_id et name | |||
local results = mw.ext.cargo.query("Translation", "target_id, name", { | |||
where = query, | |||
-- On définit un orderBy pour que les traductions écrasent éventuellement | |||
-- les entrées en double si nécessaire, bien que le type 'unit' devrait suffire | |||
orderBy = "language DESC" | |||
}) | |||
for _, row in ipairs(results) do | for _, row in ipairs(results) do | ||
-- | -- row.name est le nom détectable (ex: "Swordsman" ou "Épéiste") | ||
-- | -- row.target_id est la référence unique (ex: "Swordsman") | ||
registry[row.name] = row.target_id | if row.name and row.target_id then | ||
registry[row.name] = row.target_id | |||
end | |||
end | end | ||
return registry | return registry | ||
| Line 18: | Line 28: | ||
function p.link(frame) | function p.link(frame) | ||
local text = frame.args[1] or "" | local text = frame.args[1] or "" | ||
if not text or text == "" then return "" end | |||
local title = mw.title.getCurrentTitle().text | local title = mw.title.getCurrentTitle().text | ||
local lang = mw.ustring.match(title, "/([a-z_]+)$") or "en" | local lang = mw.ustring.match(title, "/([a-z_]+)$") or "en" | ||
local registry = getUnitRegistry(lang) | local registry = getUnitRegistry(lang) | ||
-- Trier par longueur pour | -- Trier par longueur décroissante pour traiter "Temple Swordsman" avant "Swordsman" | ||
local keys = {} | local keys = {} | ||
for k in pairs(registry) do table.insert(keys, k) end | for k in pairs(registry) do table.insert(keys, k) end | ||
table.sort(keys, function(a, b) return #a > #b end) | table.sort(keys, function(a, b) return #a > #b end) | ||
-- Remplacement | |||
for _, unitName in ipairs(keys) do | for _, unitName in ipairs(keys) do | ||
local engName = registry[unitName] | local engName = registry[unitName] | ||
-- | -- Construction du lien | ||
local target = (lang == "en") and engName or (engName .. "/" .. lang) | local target = (lang == "en") and engName or (engName .. "/" .. lang) | ||
local link = "[[" .. target .. "|" .. unitName .. "]]" | local link = "[[" .. target .. "|" .. unitName .. "]]" | ||
-- Pattern | -- Pattern pour éviter de casser des liens existants | ||
-- On cherche le nom de l'unité avec des frontières de mot | |||
-- | |||
local escapedName = mw.ustring.gsub(unitName, "([%(%)%.%%%+%-%*%?%[%^%$])", "%%%1") | local escapedName = mw.ustring.gsub(unitName, "([%(%)%.%%%+%-%*%?%[%^%$])", "%%%1") | ||
local pattern = "(%f[%a])" .. escapedName .. "(%f[%A])" | local pattern = "(%f[%a])" .. escapedName .. "(%f[%A])" | ||
text = mw.ustring.gsub(text, pattern, function(prefix, suffix) | text = mw.ustring.gsub(text, pattern, function(prefix, suffix) | ||
-- | -- Si le texte contient déjà [[ devant, on ne touche à rien | ||
if mw.ustring.find(text, "%[%[" .. escapedName) then return prefix .. unitName .. suffix end | if mw.ustring.find(text, "%[%[" .. escapedName) then return prefix .. unitName .. suffix end | ||
return prefix .. link .. suffix | return prefix .. link .. suffix | ||
Latest revision as of 15:44, 13 June 2026
Documentation for this module may be created at Module:UnitLinker/doc
local p = {}
-- Charge la table de correspondance en mémoire avec filtrage strict
local function getUnitRegistry(lang)
local registry = {}
-- On ajoute bien 'type = "unit"' pour garantir l'unicité du contexte
local query = "type = 'unit' AND (language = 'en' OR language = '" .. lang .. "')"
-- On récupère target_id et name
local results = mw.ext.cargo.query("Translation", "target_id, name", {
where = query,
-- On définit un orderBy pour que les traductions écrasent éventuellement
-- les entrées en double si nécessaire, bien que le type 'unit' devrait suffire
orderBy = "language DESC"
})
for _, row in ipairs(results) do
-- row.name est le nom détectable (ex: "Swordsman" ou "Épéiste")
-- row.target_id est la référence unique (ex: "Swordsman")
if row.name and row.target_id then
registry[row.name] = row.target_id
end
end
return registry
end
function p.link(frame)
local text = frame.args[1] or ""
if not text or text == "" then return "" end
local title = mw.title.getCurrentTitle().text
local lang = mw.ustring.match(title, "/([a-z_]+)$") or "en"
local registry = getUnitRegistry(lang)
-- Trier par longueur décroissante pour traiter "Temple Swordsman" avant "Swordsman"
local keys = {}
for k in pairs(registry) do table.insert(keys, k) end
table.sort(keys, function(a, b) return #a > #b end)
-- Remplacement
for _, unitName in ipairs(keys) do
local engName = registry[unitName]
-- Construction du lien
local target = (lang == "en") and engName or (engName .. "/" .. lang)
local link = "[[" .. target .. "|" .. unitName .. "]]"
-- Pattern pour éviter de casser des liens existants
-- On cherche le nom de l'unité avec des frontières de mot
local escapedName = mw.ustring.gsub(unitName, "([%(%)%.%%%+%-%*%?%[%^%$])", "%%%1")
local pattern = "(%f[%a])" .. escapedName .. "(%f[%A])"
text = mw.ustring.gsub(text, pattern, function(prefix, suffix)
-- Si le texte contient déjà [[ devant, on ne touche à rien
if mw.ustring.find(text, "%[%[" .. escapedName) then return prefix .. unitName .. suffix end
return prefix .. link .. suffix
end)
end
return text
end
return p


