Module:ResourceLink: Difference between revisions

From Against the Storm Official Wiki
(Updated to use new GoodsData)
(now with error checking!)
 
(8 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 = 2
local INDEX_GOOD_ICON_FILENAME = 10


-- 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 .. "|" .. 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