Module:PerkLink

From Against the Storm Official Wiki
Revision as of 23:48, 28 March 2024 by Aeredor (talk | contribs) (Added more error checking to return useful errors instead of Lua module errors)

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

local PerkLink = {}



--region Dependencies

local PerksData = require("Module:PerksData")
local StyleUtils = require("Module:StyleUtils")

--endregion




--region Private member variables

-- just in case the icon isn't found but the ID and name are good
local REPLACEMENT_FILENAME = "Question_mark.png"

--endregion



--region Private methods

local function resolveIconSize(iconSizeRequested)

	-- default for perk links is small
	local size = StyleUtils.IMG_S()

	if iconSizeRequested == "med" then
		size = StyleUtils.IMG_M()
	else
		if iconSizeRequested == "large" then
			size = StyleUtils.IMG_L()
		else
			if iconSizeRequested == "huge" then
				size = StyleUtils.IMG_H()
			end
		end
	end

	return size
end



local function makeIconPart(perkID, pageName, iconSize)

	if not iconSize or iconSize == "" or iconSize == "none" then
		return ""
	end

	local filename = PerksData.getIconByID(perkID) or REPLACEMENT_FILENAME
	local size = resolveIconSize(iconSize)

	return string.format("[[File:%s|%s|link=%s|alt=%s|%s]]", filename, size, pageName, pageName, pageName)
end



local function renderWithID(perkID, iconSize)

	local pageName = PerksData.getNameByID(perkID)

	if not pageName then
		return "No perk found with that id: " .. perkID .. "."
	end

	local iconPart = makeIconPart(perkID, pageName, iconSize)

	local pagePart = "[[" .. pageName .. "]]"

	return iconPart .. " " .. pagePart
end



local function renderWithName(name, iconSize)

	local listOfIDs = PerksData.getAllPerkIDsByName(name)
	if #listOfIDs < 1 then
		return "No perk found with that name: " .. name .. "."
	end
	local perkID = listOfIDs[1]

	return renderWithID(perkID, iconSize)
end

--endregion



--region Public methods

--- Main rendering method invoked from the template.
---
---@param frame table the MediaWiki calling context
---@return string wiki markup with the results
function PerkLink.renderLink(frame)

	-- Extract the template parameters.
	local perkID = frame.args.id
	local name = frame.args.name
	local iconSize = frame.args.iconsize

	if perkID and perkID ~= "" then
		return renderWithID(perkID, iconSize)
	else
		if name and name ~= "" then
			return renderWithName(name, iconSize)
		else
			return "The Perk_link template requires the ID or name of a perk."
		end
	end

end

--endregion

return PerkLink