Module:SpeciesLink

From Against the Storm Official Wiki
Revision as of 03:50, 10 October 2024 by Aeredor (talk | contribs) (Allowing a display parameter for skipping the text part of the link)

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

--- @module SpeciesLink
local SpeciesLink = {}



--region Dependencies

local SpeciesData = require("Module:SpeciesData")

local VIEW_TEMPLATE = "Species_link/view"

--endregion



--region Private constants

local VALID_SIZES = {
    ["none"] = true,
    ["small"] = true,
    ["medium"] = true,
    ["large"] = true,
    ["huge"] = true,
}

--endregion



--region Private methods

local function validateSpeciesName(name)

    -- Try a quick match with the keys first.
    local speciesFound = SpeciesData.species[name]

    if speciesFound then
        return speciesFound
    else
        -- Look into the data to see if the name matches any of the names in the data.
        for _, species in pairs(SpeciesData.species) do
            if name == species[SpeciesData.NAME] then
                return species
            end
        end
    end

    error("You specified an invalid species name. Please see the template documentation for how to use the parameters.")
end

--endregion



--region Public methods

function SpeciesLink.main(frame)

    local name = frame.args.species or frame.args[1]
    local iconSize = frame.args.iconsize or frame.args[2]
    local skipText = frame.args.display

    -- Check that something at all was provided for the name before we can validate it.
    if not name or name == "" then
        error("You must specify the name of the species. Please see the template documentation for how to use the parameters.")
    end

    local validatedSpecies = validateSpeciesName(name)
    local speciesName = validatedSpecies[SpeciesData.NAME]
    local iconFilename = validatedSpecies[SpeciesData.ICON_FILENAME] .. ".png"

    -- Defer to the view to handle the iconSize. We don't need to validate it.

    -- The only valid term here is `notext`, which should be passed through; anything else we blank out.
    if skipText ~= "notext" then
        skipText = ""
    end

    local parameters = {
        ["name"] = speciesName,
        ["iconfilename"] = iconFilename,
        ["size"] = iconSize,
        [1] = skipText,
    }

    return frame:expandTemplate{
        title = VIEW_TEMPLATE,
        args = parameters,
    }
end

--endregion

return SpeciesLink