Module:BuildingLink

--- --- This module renders the template. --- https://hoodedhorse.com/wiki/Against_the_Storm/Template:Building_link --- --- The template #invokes BuildingLink.renderLink(frame), below. --- --- The template requires an argument, the name of the building to link to. --- Optionally, the template accepts a second argument to render an icon next --- to the link. The building is passed to Module:WorkshopsData, 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 --- building, and wraps both in a link to the building's wiki page. If no icon --- size is specified, only the name of the building will be rendered by the --- template. --- --- The icons are sized consistently by using existing wiki templates, ---, , etc. The sizes of the icons are not stored or known by --- this module. --- --- @module BuildingLink local BuildingLink = {}

local WorkshopsData = require("Module:WorkshopsData") local InstitutionsData = require("Module:InstitutionsData") local FarmsData = require("Module:FarmsData") local CampsData = require("Module:CampsData") local CollectorsData = require("Module:CollectorsData")

--region Private constants

local DEFAULT_SIZE_SMALL = "small"

local ICON_SIZES = { [DEFAULT_SIZE_SMALL] = mw.getCurrentFrame:expandTemplate{ title = "ImgS" }, ["med"] = mw.getCurrentFrame:expandTemplate{ title = "ImgM" }, ["large"] = mw.getCurrentFrame:expandTemplate{ title = "ImgL" }, ["huge"] = mw.getCurrentFrame:expandTemplate{ title = "ImgH" } }

local SPACE = " "

--endregion

--region Public methods

--- --- Renders an icon and the name of a building linked to a wiki page --- corresponding to the provided building. --- --- Uses MediaWiki markup to display the name of a wiki page and an icon that --- has been uploaded to the wiki. Both must be known by the data model, --- or the template's behavior may be different than expected. --- --- @param frame table the template's calling context, with parameters --- @return string wiki markup function BuildingLink.renderLink(frame)

-- Extract the template parameters. local argBuildingName = frame.args.building local argIconSize = frame.args.iconsize

-- Validate that there's a name to use. if not argBuildingName or "" == argBuildingName then return "The Building Link template requires the a name of a building." end

-- Look up the icon from the data sources. This validates that the building -- name that was provided is spelled correctly and, if used, will link into -- a valid page. local iconFilename

local workshopIconFilename = WorkshopsData.getWorkshopIcon(argBuildingName) if workshopIconFilename then iconFilename = workshopIconFilename else local InstitutionIconFilename = InstitutionsData.getInstitutionIcon(argBuildingName) if InstitutionIconFilename then iconFilename = InstitutionIconFilename else local FarmIconFilename = FarmsData.getFarmIcon(argBuildingName) if FarmIconFilename then iconFilename = FarmIconFilename else local CampIconFilename = CampsData.getCampIcon(argBuildingName) if CampIconFilename then iconFilename = CampIconFilename else local CollectorIconFilename = CollectorsData.getCollectorIcon(argBuildingName) if CollectorIconFilename then iconFilename = CollectorIconFilename else return "No building found with provided name: " .. argBuildingName .. "."					end end end end end

-- Wiki link to the building's page just uses the in-game name. local linkPart = "" .. argBuildingName .. ""

-- If the specified size is small, skip the icon. if argIconSize == DEFAULT_SIZE_SMALL then return linkPart end

local size = ICON_SIZES[argIconSize]

-- If the specified size was invalid, skip the icon. if not size then return linkPart end

local iconPart = ""

-- combine the file part with the link part return iconPart .. SPACE .. linkPart end

--endregion

return BuildingLink