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 = {}


-- Single pre-indexed lookup, built by the bot at deploy time.
local iconData = mw.loadJsonData("Data:ResourceLookup.json")
local iconData = mw.loadJsonData("Data:Sandbox.json")
local lang_codes = mw.loadJsonData("Data:LangCodes.json")
local lang_codes = mw.loadJsonData("Data:LangCodes.json")


local cachedLangCode, cachedLangData
local cachedLangCode, cachedLangData


-- Items that link to disambiguation pages
local linkOverrides = {
local linkOverrides = {
     ["Bullet Lifesteal"] = "Bullet Lifesteal (item)",
     ["Bullet Lifesteal"] = "Bullet Lifesteal (item)",
     ["Spirit Lifesteal"] = "Spirit Lifesteal (item)"
     ["Spirit Lifesteal"] = "Spirit Lifesteal (item)"
}
local missingImageOverrides = {
    ["boho"] = "Module-Icon missing.png",
    ["druid"] = "Module-Icon missing.png",
    ["fortuna"] = "Module-Icon missing.png",
    ["graf"] = "Module-Icon missing.png",
    ["gunslinger"] = "Module-Icon missing.png",
    ["skyrunner"] = "Module-Icon missing.png",
    ["swan"] = "Module-Icon missing.png",
    ["thumper"] = "Module-Icon missing.png",
}
}


Line 50: Line 59:
     cachedLangData = langData
     cachedLangData = langData
     return langCode, langData
     return langCode, langData
end
-- Infer image path from name, with override support for missing images
local function getImage(iconInfo)
    local lowerName = iconInfo.name:lower()
    return missingImageOverrides[lowerName] or (iconInfo.name .. ".png")
end
-- Infer link from type and available fields
local function getLink(iconInfo)
    if iconInfo.type == "ability" then
        return iconInfo.hero_name or iconInfo.name
    end
    return linkOverrides[iconInfo.name] or iconInfo.name
end
end


Line 57: Line 80:
     local lowerName = name:lower()
     local lowerName = name:lower()


    -- Resolve aliases
     if aliases[lowerName] then
     if aliases[lowerName] then
         lowerName = aliases[lowerName]
         lowerName = aliases[lowerName]
     end
     end


    -- Direct O(1) lookup, no iteration
     local iconInfo = iconData[lowerName]
     local iconInfo = iconData[lowerName]


Line 69: Line 90:
     end
     end


    -- Argument parsing
     local customText = args.l1 or ""
     local customText = args.l1 or ""
     local size = args.size or "20px"
     local size = args.size or "20px"
Line 84: Line 104:
     end
     end


    -- Language handling
     local langCode, langData = getLangData()
     local langCode, langData = getLangData()


Line 96: Line 115:
     end
     end


    -- Link logic
     local baseLink = getLink(iconInfo)
     local baseLink = linkOverrides[iconInfo.name] or iconInfo.link or ""
     local link = baseLink
     local link = baseLink
     if langCode ~= "en" and baseLink ~= "" then
     if langCode ~= "en" and baseLink ~= "" then
Line 103: Line 121:
     end
     end


     -- Style logic
     -- Abilities get the module-icon-ability class for light/dark theme filter support
    -- 'ability' class triggers .module-icon-ability CSS which normalizes
    -- ability icons to black/white silhouette for light/dark theme support
     local style
     local style
     if iconInfo.class == "ability" then
     if iconInfo.type == "ability" then
         style = 'class="module-icon-ability" style="position:relative; bottom:2px;"'
         style = 'class="module-icon-ability" style="position:relative; bottom:2px;"'
     else
     else
Line 113: Line 129:
     end
     end


     -- Render
     local image = getImage(iconInfo)
     local imageLink = noLink and "" or link
     local imageLink = noLink and "" or link
     local iconHtml = string.format('<span %s>[[File:%s|%s|link=%s]]</span>', style, iconInfo.image, size, imageLink)
     local iconHtml = string.format('<span %s>[[File:%s|%s|link=%s]]</span>', style, image, size, imageLink)


     if iconOnly or displayName == "" then
     if iconOnly or displayName == "" then

Revision as of 00:06, 11 March 2026

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

local p = {}

local iconData = mw.loadJsonData("Data:ResourceLookup.json")
local lang_codes = mw.loadJsonData("Data:LangCodes.json")

local cachedLangCode, cachedLangData

local linkOverrides = {
    ["Bullet Lifesteal"] = "Bullet Lifesteal (item)",
    ["Spirit Lifesteal"] = "Spirit Lifesteal (item)"
}

local missingImageOverrides = {
    ["boho"] = "Module-Icon missing.png",
    ["druid"] = "Module-Icon missing.png",
    ["fortuna"] = "Module-Icon missing.png",
    ["graf"] = "Module-Icon missing.png",
    ["gunslinger"] = "Module-Icon missing.png",
    ["skyrunner"] = "Module-Icon missing.png",
    ["swan"] = "Module-Icon missing.png",
    ["thumper"] = "Module-Icon missing.png",
}

local aliases = {
    ["doorman"] = "the doorman",
    ["mo and krill"] = "mo & krill",
    ["mo"] = "mo & krill",
    ["krill"] = "mo & krill",
    ["curse"] = "cursed relic",
    ["debuff remover"] = "dispel magic",
    ["defend and fight!"] = "plot armor",
    ["conjure dragon"] = "bookwyrm",
    ["backstabber"] = "stalker",
    ["flying strike"] = "flying slash",
    ["tornado"] = "dust devil",
    ["kudzu bomb"] = "entangling thorns",
}

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

-- Infer image path from name, with override support for missing images
local function getImage(iconInfo)
    local lowerName = iconInfo.name:lower()
    return missingImageOverrides[lowerName] or (iconInfo.name .. ".png")
end

-- Infer link from type and available fields
local function getLink(iconInfo)
    if iconInfo.type == "ability" then
        return iconInfo.hero_name or iconInfo.name
    end
    return linkOverrides[iconInfo.name] or iconInfo.name
end

function p.render(frame)
    local args = frame:getParent().args
    local name = args[1] or ""
    local lowerName = name:lower()

    if aliases[lowerName] then
        lowerName = aliases[lowerName]
    end

    local iconInfo = iconData[lowerName]

    if not iconInfo then
        return string.format("[[:Category:Module:Icon ERROR|Icon not found]] ('%s'). [[Category:Module:Icon ERROR]]", name)
    end

    local customText = args.l1 or ""
    local size = args.size or "20px"
    local noLink = args["no-link"] == "true"
    local iconOnly = args["icon-only"] == "true"

    for k, v in pairs(args) do
        if type(k) == "number" and k > 1 then
            local val = mw.text.trim(v)
            if val == "icon-only" then iconOnly = true
            elseif val == "no-link" then noLink = true
            elseif val:match("^%d+px$") then size = val end
        end
    end

    local langCode, langData = getLangData()

    local displayName = customText
    if displayName == "" then
        if iconInfo.key and langData[iconInfo.key] then
            displayName = langData[iconInfo.key]
        else
            displayName = iconInfo.name
        end
    end

    local baseLink = getLink(iconInfo)
    local link = baseLink
    if langCode ~= "en" and baseLink ~= "" then
        link = baseLink .. "/" .. langCode
    end

    -- Abilities get the module-icon-ability class for light/dark theme filter support
    local style
    if iconInfo.type == "ability" then
        style = 'class="module-icon-ability" style="position:relative; bottom:2px;"'
    else
        style = 'style="position:relative; bottom:2px;"'
    end

    local image = getImage(iconInfo)
    local imageLink = noLink and "" or link
    local iconHtml = string.format('<span %s>[[File:%s|%s|link=%s]]</span>', style, image, size, imageLink)

    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