Module:Sandbox/LVL: Difference between revisionsGive feedback
Blanked the page Tags: Blanking Manual revert |
No edit summary |
||
| Line 1: | Line 1: | ||
local p = {} | |||
-- Load icon data and language codes | |||
local iconData = require("Module:Icon/data") | |||
local lang_codes = mw.loadJsonData("Data:LangCodes.json") | |||
-- Per-page cache | |||
local cachedLangCode, cachedLangData | |||
-- Get icon data by name | |||
local function getIconData(iconName) | |||
local entry = iconData[iconName:lower()] | |||
if entry then | |||
return entry, nil | |||
end | |||
return nil, string.format("[[:Category:Module:Icon ERROR|Icon not found]] ('%s'). [[Category:Module:Icon ERROR]]", iconName) | |||
end | |||
-- Get cached or loaded language code and JSON data | |||
local function getLangData() | |||
if cachedLangData then | |||
return cachedLangCode, cachedLangData | |||
end | |||
local title = mw.title.getCurrentTitle().fullText | |||
local subpageLang = title:match("/([^/]+)$") | |||
local langCode = (subpageLang and lang_codes[subpageLang]) and subpageLang or "en" | |||
local langData = {} | |||
if langCode ~= "en" then | |||
local success, data = pcall(function() | |||
return mw.loadJsonData("Data:Lang " .. langCode .. ".json") | |||
end) | |||
if success and type(data) == "table" then | |||
langData = data | |||
end | |||
end | |||
cachedLangCode = langCode | |||
cachedLangData = langData | |||
return langCode, langData | |||
end | |||
-- Main render function | |||
function p.render(frame) | |||
local args = frame:getParent().args | |||
local name = args[1] or "" | |||
local customText = args.l1 or "" | |||
local size = args.size or "20px" | |||
local noLink = args["no-link"] == "true" | |||
local iconOnly = args["icon-only"] == "true" | |||
local iconData, err = getIconData(name) | |||
if not iconData then | |||
return "Error: " .. err | |||
end | |||
local langCode, langData = getLangData() | |||
-- Determine display name with clear priority | |||
local displayName = "" | |||
if customText ~= "" then | |||
displayName = customText | |||
elseif iconData.key and langData[iconData.key] then | |||
displayName = langData[iconData.key] | |||
elseif iconData.name then | |||
displayName = iconData.name | |||
elseif iconOnly then | |||
displayName = "" | |||
else | |||
displayName = name -- fallback to input name | |||
end | |||
-- Localize link if on a translated subpage | |||
local baseLink = iconData.link or "" | |||
-- build hero-page fragment automatically | |||
local link | |||
if baseLink ~= "" and not baseLink:find("#", 1, true) then -- only hero pages, no manual # | |||
link = baseLink .. "#" .. toAnchor(displayName) | |||
else | |||
link = baseLink | |||
end | |||
-- still add language suffix if we are on a translated page | |||
if langCode ~= "en" and link ~= "" then | |||
link = link .. "/" .. langCode | |||
end | |||
-- Style logic | |||
local class = iconData.class or "" | |||
local extra = (class:find("invert", 1, true) and " filter:invert(1);" or "") | |||
local style | |||
if class:find("theme", 1, true) then | |||
style = 'class="module-icon-ability" style="position:relative; bottom:2px;' .. extra .. '"' | |||
else | |||
style = 'style="position:relative; bottom:2px;' .. extra .. '"' | |||
end | |||
local iconHtml = string.format('<span %s>[[File:%s|%s|link=]]</span>', style, iconData.image, size) | |||
if iconOnly or displayName == "" then | |||
return iconHtml | |||
end | |||
local textHtml = (noLink or link == "") and displayName or string.format('[[%s|%s]]', link, displayName) | |||
return '<span style="white-space:nowrap;">' .. iconHtml .. " " .. textHtml .. '</span>' | |||
end | |||
return p | |||