Module:SpriteFinder

From Against the Storm Official Wiki
Revision as of 02:07, 6 May 2024 by Aeredor (talk | contribs) (no title case for the word "of")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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

---
--- Replaces sprite XML tags in descriptions with small icons.
---
---@module SpriteFinder
SpriteFinder = {}

--region Dependencies

local GoodsData = require("Module:GoodsData")

--endregion



--region Private constants

local ARG_ID = "id"

local BLANK_RETURN = "?"

local ICON_SIZE = mw.getCurrentFrame():expandTemplate{ title="ImgS" }

local TEMPLATE_GRADE_ICON = {
    ["grade1"] = "1Star",
    ["grade2"] = "2Star",
    ["grade3"] = "3Star"
}

--endregion


--region Private methods

local function toTitleCase(lowercaseString)

    return lowercaseString:gsub("(%a)([%w_']*)", function(first, rest)
        -- Skip the word "of" in packs of goods
        if first == "o" and rest == "f" then
            return first .. rest
        end
        return first:upper() .. rest:lower()
    end)
end

--endregion



--region public methods

function SpriteFinder.main(frame)

    local id = frame.args[ARG_ID]
    if not id or "" == id then
        return BLANK_RETURN
    end

    -- Filter out the stars first.
    if TEMPLATE_GRADE_ICON[id] then
        return frame:expandTemplate{ title = TEMPLATE_GRADE_ICON[id] }
    -- The rest are IDs for goods.
    else
        id = toTitleCase(id)
        local goodName = GoodsData.getGoodNameByID(id)
        if not goodName or "" == goodName then
            return BLANK_RETURN
        end
        local goodIcon = GoodsData.getGoodIconByID(id)
        if not goodIcon or "" == goodIcon then
            return BLANK_RETURN
        end

        return "[[File:" .. goodIcon .. "|" .. ICON_SIZE .. "|alt=" .. goodName .. "|link=" .. goodName .. "]]"
    end
end

--endregion

return SpriteFinder