|
Tags: Blanking Manual revert |
| Line 1: |
Line 1: |
| local p = {}
| |
|
| |
|
| local function toAnchor(s)
| |
| return (s:gsub('%s+','_'))
| |
| end
| |
|
| |
| -- Load icon data and language codes
| |
| local iconData = require("Module:Icon/data")
| |
| local nameToNum = {}
| |
| do
| |
| local raw = mw.title.getCurrentTitle():getContent() or ''
| |
| for num, name in raw:gmatch('<span class="abi%-num" data%-num="(%d)"></span>([^<]+)') do
| |
| nameToNum[name:gsub('^%s*',''):gsub('%s*$',''):lower()] = tonumber(num)
| |
| end
| |
| end
| |
| 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 num = nameToNum[displayName:lower()]
| |
| local frag = num and ("("..num..")_"..toAnchor(displayName))
| |
| or toAnchor(displayName)
| |
| local link
| |
| if baseLink ~= "" and not baseLink:find("#", 1, true) then
| |
| link = baseLink .. "#" .. frag
| |
| 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
| |