Module:Sandbox/LVLGive feedback
Jump to navigation
Jump to search
Documentation for this module may be created at Module:Sandbox/LVL/doc
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