Editing Module:IconGive feedback
Jump to navigation
Jump to search
The edit can be undone.
Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.
| Latest revision | Your text | ||
| Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
local | -- Load icon data and language codes | ||
local | local iconData = require("Module:Icon/data") | ||
local lang_codes = mw.loadJsonData("Data:LangCodes.json") | |||
local | -- Per-page cache | ||
local cachedLangCode, cachedLangData | |||
-- Get icon data by name | |||
iconData[ | 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 | end | ||
-- Get cached or loaded language code and JSON data | |||
local function getLangData() | |||
if cachedLangData then | |||
return cachedLangCode, cachedLangData | |||
local function | |||
if | |||
return cachedLangCode | |||
end | end | ||
| Line 36: | Line 27: | ||
local langCode = (subpageLang and lang_codes[subpageLang]) and subpageLang or "en" | 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) | |||
local | if success and type(data) == "table" then | ||
langData = data | |||
end | |||
end | end | ||
end | end | ||
cachedLangCode = langCode | |||
cachedLangData = langData | |||
return langCode, langData | |||
end | end | ||
-- | -- Main render function | ||
function p.render(frame) | |||
local args = frame:getParent().args | |||
local name = args[1] or "" | |||
local customText = args.l1 or "" | |||
-- 1. Set Defaults from named arguments | |||
function p. | |||
local | |||
local | |||
local customText = args.l1 | |||
local size = args.size or "20px" | local size = args.size or "20px" | ||
local noLink = args["no-link"] == "true" | local noLink = args["no-link"] == "true" | ||
local iconOnly = args["icon-only"] == "true" | local iconOnly = args["icon-only"] == "true" | ||
-- 2. Scan unnamed parameters (2, 3, 4...) for flags and size | |||
-- This allows: {{HeroIcon|Name|icon-only|no-link}} or {{HeroIcon|Name|40px|icon-only}} | |||
for k, v in pairs(args) do | for k, v in pairs(args) do | ||
if type(k) == "number" and k > 1 then | if type(k) == "number" and k > 1 then | ||
local val = mw.text.trim(v) | local val = mw.text.trim(v) -- Clean up whitespace | ||
if val == "icon-only" then | if val == "icon-only" then | ||
iconOnly = true | iconOnly = true | ||
elseif val == "no-link" then | elseif val == "no-link" then | ||
noLink = true | noLink = true | ||
elseif val:match("^%d+px$") then | elseif val:match("^%d+px$") then | ||
-- If it looks like "20px" or "40px", set the size | |||
size = val | size = val | ||
end | end | ||
| Line 170: | Line 71: | ||
end | end | ||
local | -- 3. Proceed with standard logic... | ||
local iconData, err = getIconData(name) | |||
if not iconData then | |||
return "Error: " .. err | |||
end | |||
local displayName | local langCode, langData = getLangData() | ||
if customText then | |||
-- Determine display name with clear priority | |||
local displayName = "" | |||
if customText ~= "" then | |||
displayName = customText | displayName = customText | ||
elseif | elseif iconData.key and langData[iconData.key] then | ||
displayName = langData[iconData.key] | |||
displayName = | elseif iconData.name then | ||
displayName = iconData.name | |||
elseif iconOnly then | |||
displayName = "" | |||
else | else | ||
displayName = | displayName = name -- fallback to input name | ||
end | end | ||
local link = baseLink | -- Localize link if on a translated subpage | ||
local baseLink = iconData.link or "" | |||
local link = (langCode ~= "en" and baseLink ~= "") and (baseLink .. "/" .. langCode) or baseLink | |||
-- Style logic | |||
local class = iconData.class or "" | |||
local extra = (class:find("invert", 1, true) and " filter:invert(1);" or "") | |||
local style | local style | ||
if | if class:find("theme", 1, true) then | ||
style = 'class="module-icon-ability" style="position:relative; bottom:2px;"' | style = 'class="module-icon-ability" style="position:relative; bottom:2px;' .. extra .. '"' | ||
else | else | ||
style = ' | style = 'style="position:relative; bottom:2px;' .. extra .. '"' | ||
end | end | ||
-- 4. Generate icon HTML (with link if not disabled) | |||
local imageLink = noLink and "" or link | local imageLink = noLink and "" or link | ||
local | local iconHtml = string.format('<span %s>[[File:%s|%s|link=%s]]</span>', style, iconData.image, size, imageLink) | ||
if iconOnly or displayName == "" then | if iconOnly or displayName == "" then | ||
| Line 222: | Line 116: | ||
local textHtml = (noLink or link == "") and displayName or string.format('[[%s|%s]]', link, displayName) | local textHtml = (noLink or link == "") and displayName or string.format('[[%s|%s]]', link, displayName) | ||
return '<span style="white-space:nowrap;">' .. iconHtml .. " " .. textHtml .. '</span>' | |||
end | end | ||
return p | return p | ||