Module:ResourceLink: Difference between revisions

From Against the Storm Official Wiki
(changed indexing to align with updated to GoodsData)
(now with error checking!)
 
(6 intermediate revisions by the same user not shown)
Line 1: Line 1:
-------------------------------------------------------------------------------
--- @module ResourceLink
-- This module renders the {{Resource _link}} template.
-- https://hoodedhorse.com/wiki/Against_the_Storm/Template:Resource_link
--
-- This template #invokes ResourceLink.renderLink(frame), below.
--
-- The template requires an argument, the name of the resource to which to link.
-- Optionally, the template accepts a second argument to change the size of the
-- icon that accompanies the text hyperlink. The resource is passed to
-- Module:GoodsData, which is used to identify the wiki page to link to.
--
-- Using the data returned, this module creates an icon and the name of the
-- resource, and wraps both in a link to the resource's wiki page. If no icon
-- size is specified, the icon will default to a size appropriate for display
-- in-line with other text.
--
-- The icons are sized consistently by using existing wiki templates, {{ImgS}},
-- {{ImgM}}, etc. The sizes of icons are not stored or known by this module.
-- @module ResourceLink
local ResourceLink = {}
local ResourceLink = {}


---
 
-- Dependencies
--region Dependencies
--
 
local GoodsData = require("Module:GoodsData")
local GoodsData = require("Module:GoodsData")


local VIEW_TEMPLATE = "Resource_link/view"


--endregion


--region Private constants
local VALID_SIZE = {
["none"] = true,
["small"] = true,
["medium"] = true,
["large"] = true,
["huge"] = true,
}
--endregion
--region Private methods
---validateResourceName retrieves the icon from the data module.
---
---
-- Constants
---@param name string the display name of a resource
--
---@return string the filename of the icon
-- Indexes for the data returned from GoodsData.
local function validateResourceName(name)
local INDEX_GOOD_NAME = "displayName"
local INDEX_GOOD_ICON_FILENAME = "iconName"


-- Parameter options for icon size.
local goodID = GoodsData.getGoodID(name)
local SIZE_S = "small"
local validatedIcon = GoodsData.getIcon(goodID)
local SIZE_M = "med"
local SIZE_L = "large"
local SIZE_H = "huge"
-- Use size templates for consistency.
local TEMPLATE_IMGSMALL = "ImgS"
local TEMPLATE_IMGMED = "ImgM"
local TEMPLATE_IMGLARGE = "ImgL"
local TEMPLATE_IMGHUGE = "ImgH"


if not validatedIcon then
error("No resource found with name: " .. name .. ". Please see the template documentation for how to use the parameters")
end


return validatedIcon
end


--endregion
--region Public methods
---main is called from the template to create a link, with an icon, to the page for the specified goods.
---
---
-- Main rendering function
---@param frame table the Mediawiki template context
--
---@return string wikimarkup generated by the view template
-- Renders an icon the name of a resource linked to a wiki page corresponding
function ResourceLink.main(frame)
-- to the provided resource.
 
--
local name = frame.args.name
-- Uses MediaWiki markup to display the name of a wiki page and an icon that has
local iconSize = frame.args.size
-- been uploaded to the wiki. Both must be known by Module:GoodsData, or there
local display = frame.args.display
-- will be a display problem.
 
-- @param frame the template's calling context, with parameters
if not name or name == "" then
-- @return wiki markup
error("You must specify a resource. Please see the template documentation for how to use the parameters")
function ResourceLink.renderLink(frame)
-- Extract the template parameters.
local argResourceName = frame.args.resource
local argIconsize = frame.args.iconsize
-- Validate that there's a resource name to use
if not argResourceName or "" == argResourceName then
return "The Resource Link template a name of a resource."
end
end
 
-- Look up the resource from GoodsData
-- Validate the name.
local good = GoodsData.getAllDataForGood(argResourceName)
validatedIcon = validateResourceName(name)
 
if not good then
-- Handle default icon size.
return "Cannot find a resource with that name: " .. argResourceName .."."
if not iconSize or iconSize == "" or not VALID_SIZE[iconSize] then
iconSize = "small"
end
end
 
local goodName = good[INDEX_GOOD_NAME]
-- The args to pass to the view.
local goodIconFilename = good[INDEX_GOOD_ICON_FILENAME]
viewParameters = {
["name"] = name,
-- the wiki markup for the internal link to the resource's wiki page
["iconfilename"] = validatedIcon,
local linkPart = "[[" .. goodName .. "]]"
["iconsize"] = iconSize,
["display"] = display,
-- store the requested size for use in a moment
}
local size = ""
 
return frame:expandTemplate{
-- Expand the size template for the requested size.
title = VIEW_TEMPLATE,
if SIZE_M == argIconsize then
args = viewParameters,
size = frame:expandTemplate{title=TEMPLATE_IMGMED}
}
elseif SIZE_L == argIconsize then
size = frame:expandTemplate{title=TEMPLATE_IMGLARGE}
elseif SIZE_H == argIconsize then
size = frame:expandTemplate{title=TEMPLATE_IMGHUGE}
else
-- Default to small size if the argument wasn't valid.
size = frame:expandTemplate{title=TEMPLATE_IMGSMALL}
end
-- combine the size and filename to form the iconPart
local iconPart = "[[File:" .. goodIconFilename .. ".png|" .. size .. "|link=" .. goodName .. "|alt=" .. goodName .. "|" .. goodName .. "]]"
-- combine the file part with the link part
return iconPart .. " " .. linkPart
end
end


--endregion


-- return when required into another module
return ResourceLink
return ResourceLink

Latest revision as of 02:44, 19 October 2024

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

--- @module ResourceLink
local ResourceLink = {}


--region Dependencies

local GoodsData = require("Module:GoodsData")

local VIEW_TEMPLATE = "Resource_link/view"

--endregion



--region Private constants

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

--endregion



--region Private methods

---validateResourceName retrieves the icon from the data module.
---
---@param name string the display name of a resource
---@return string the filename of the icon
local function validateResourceName(name)

	local goodID = GoodsData.getGoodID(name)
	local validatedIcon = GoodsData.getIcon(goodID)

	if not validatedIcon then
		error("No resource found with name: " .. name .. ". Please see the template documentation for how to use the parameters")
	end

	return validatedIcon
end

--endregion



--region Public methods

---main is called from the template to create a link, with an icon, to the page for the specified goods.
---
---@param frame table the Mediawiki template context
---@return string wikimarkup generated by the view template
function ResourceLink.main(frame)

	local name = frame.args.name
	local iconSize = frame.args.size
	local display = frame.args.display

	if not name or name == "" then
		error("You must specify a resource. Please see the template documentation for how to use the parameters")
	end

	-- Validate the name.
	validatedIcon = validateResourceName(name)

	-- Handle default icon size.
	if not iconSize or iconSize == "" or not VALID_SIZE[iconSize] then
		iconSize = "small"
	end

	-- The args to pass to the view.
	viewParameters = {
		["name"] = name,
		["iconfilename"] = validatedIcon,
		["iconsize"] = iconSize,
		["display"] = display,
	}

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

--endregion

return ResourceLink