Module:BuildingList

From Against the Storm Official Wiki

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

---
--- Generates a large table of buildings.
---
--- @module BuildingList
local BuildingList = {}



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



--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 NBSP = " "

--endregion



--region Private methods

---
--- Loops through the data to find matches to the provided category.
---
---@param category string the name of the category
local function loadBuildingList(category)

	local buildingList = {}

	for i = 1, WorkshopsData.getNumberOfWorkshopsInDatabase() do
		local buildingName = WorkshopsData.getWorkshopNameFromDatabase(i)
		if not category or category == WorkshopsData.getWorkshopCategory(buildingName) then
			table.insert(buildingList, buildingName)
		end
	end
	for i = 1, InstitutionsData.getNumberOfInstitutionsInDatabase() do
		local buildingName = InstitutionsData.getInstitutionNameFromDatabase(i)
		if not category or category == InstitutionsData.getInstitutionCategory(buildingName) then
			table.insert(buildingList, buildingName)
		end
	end
	for i = 1, FarmsData.getNumberOfFarmsInDatabase() do
		local buildingName = FarmsData.getFarmNameFromDatabase(i)
		if not category or category == FarmsData.getFarmCategory(buildingName) then
			table.insert(buildingList, buildingName)
		end
	end
	for i = 1, CampsData.getNumberOfCampsInDatabase() do
		local buildingName = CampsData.getCampNameFromDatabase(i)
		if not category or category == CampsData.getCampCategory(buildingName) then
			table.insert(buildingList, buildingName)
		end
	end

	return buildingList
end

--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 BuildingList.renderList(frame)

	-- Extract the template parameter, if any.
	local argCategory = frame.args.category

	local buildingList = loadBuildingList(argCategory)

	return buildingList
end

--endregion

return BuildingList