Module:Sandbox/LVL: Difference between revisions

From The Deadlock Wiki
Jump to navigation Jump to search
LVL (talk | contribs)
No edit summary
LVL (talk | contribs)
No edit summary
Line 1: Line 1:
local p = {}
local p = {}
local function toAnchor(s)
    return (s:gsub('%s+','_'))
end


-- Load icon data and language codes
-- Load icon data and language codes

Revision as of 15:54, 25 October 2025

Documentation for this module may be created at Module:Sandbox/LVL/doc

local p = {}

local function toAnchor(s)
    return (s:gsub('%s+','_'))
end

-- 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