Module:Goodbox

--- --- Module to create an infobox for displaying on a good's wiki page. --- --- Shows the facts from the data about the specified good in an easy-to-read --- table, with a large icon, information, categories, and the flavor text. --- --- This should be invoked from Template:Goodbox with the parameter of the --- good whose infobox should be shown. See the template documentation for --- more information about parameters and errors and to see examples. --- --- @module Goodbox local Goodbox = {}

local Infobox = require("Module:Infobox") local GoodsData = require("Module:GoodsData") local StyleUtils = require("Module:StyleUtils")

--region Private constants

local ARGS = { ["name"] = "name", ["purpose"] = "purpose", ["species_preference"] = "species_preference", }

--endregion

--region Private methods

--- --- Builds using the provided wikiInfobox a few header items. --- ---@param wikiInfobox table mw.html object into which we're building this ---@param goodName string the name of the good the infobox is about ---@return table the Mediawiki html object into which we've been adding things local function makeHeaderContent(wikiInfobox, goodName)

-- Grab the data we'll use to populate this. local goodDescription = GoodsData.getGoodDescription(goodName) local goodIconFilename = GoodsData.getGoodIcon(goodName)

-- Start the header area local header = Infobox.startNewHeader(wikiInfobox)

Infobox.makeTitle(header, goodName) Infobox.makeFlavorText(header, goodDescription) Infobox.makeTitleIcon(header, goodIconFilename)

return wikiInfobox end

--- --- Builds using the provided wikiInfobox a subtable to lay out headers and --- fields. --- ---@param wikiInfobox table mw.html object into which we're building this ---@param goodName string the name of the good the infobox is about ---@param params table of strings, the parameter provided to the template ---@return table the Mediawiki html object into which we've been adding things local function makeInnerContent(wikiInfobox, goodName, params)

-- Grab the data we'll use to populate this. local goodCategory = GoodsData.getGoodCategory(goodName) local goodIsEatable = GoodsData.isGoodEatable(goodName) local goodIsBurnable = GoodsData.isGoodBurnable(goodName) local goodBurnTime = GoodsData.getGoodBurnTime(goodName) local goodSellValue, goodBuyValue = GoodsData.getGoodValue(goodName) local goodID = GoodsData.getGoodID(goodName)

-- Start the inner table local innerTable = Infobox.startNewInnerTable(wikiInfobox)

-- we'll reuse this to mark where separators are needed in the table local needsSeparator = false

-- Start with the things from the parameters, if any for paramTitle, paramValue in pairs(params or {}) do		if paramTitle ~= nil and paramValue ~= nil then Infobox.makeInnerRow(innerTable, paramValue, false,					Infobox.toTitleCase(paramTitle), paramValue) -- Require a separator if there were any parameters. needsSeparator = true end end

needsSeparator = Infobox.makeInnerRow(innerTable, goodCategory, needsSeparator,			Infobox.TITLE_CATEGORY,			Infobox.makeCategoryIcon(goodCategory) .. StyleUtils.NBSP .. goodCategory) needsSeparator = Infobox.makeInnerRow(innerTable, goodIsEatable, needsSeparator,			Infobox.TITLE_EATABLE, goodIsEatable and "Yes" or "No") needsSeparator = Infobox.makeInnerRow(innerTable, goodIsBurnable, needsSeparator,			Infobox.TITLE_BURNABLE, goodIsBurnable and "Yes" or "No") needsSeparator = Infobox.makeInnerRow(innerTable, goodIsBurnable and goodBurnTime,			needsSeparator, Infobox.TITLE_BURN_TIME, goodBurnTime)

needsSeparator = true

needsSeparator = Infobox.makeInnerRow(innerTable, goodSellValue, needsSeparator,			Infobox.TITLE_SELL_VALUE, Infobox.toTwoDecimalPlaces(goodSellValue) .. StyleUtils.NBSP .. StyleUtils.AMBER) needsSeparator = Infobox.makeInnerRow(innerTable, goodBuyValue, needsSeparator,			Infobox.TITLE_BUY_VALUE, Infobox.toTwoDecimalPlaces(goodBuyValue) .. StyleUtils.NBSP .. StyleUtils.AMBER)

needsSeparator = true

needsSeparator = Infobox.makeInnerRow(innerTable, goodID, needsSeparator,			Infobox.TITLE_ID, StyleUtils.ITALIC .. goodID .. StyleUtils.ITALIC)

-- Close the inner table, and return it with the passed context Infobox.endInnerTable(wikiInfobox, innerTable)

return wikiInfobox end

--endregion

--region Public methods

--- --- Creates an html and wiki markup to display the data in an infobox. --- --- @param frame table from template's calling context --- @return string of html and wiki markup function Goodbox.renderGoodbox(frame)

-- Every good must have a name. local goodName = frame.args[ARGS.name] if not goodName or goodName == "" then return "You must specify the name of the good. See Template:Goodbox for examples." end

-- Use this method here to check to see whether the provided name is valid. if not GoodsData.getGoodID(goodName) then return "Goodbox can't find the specified good: " .. goodName .. "."	end

-- Additional template parameters, may or may not be present. local purpose = frame.args[ARGS.purpose] local speciesPref = frame.args[ARGS.species_preference]

local wikiInfobox = Infobox.startNewInfobox makeHeaderContent(wikiInfobox, goodName) makeInnerContent(wikiInfobox, goodName,			{ [ARGS.purpose] = purpose, [ARGS.species_preference] = speciesPref })

return wikiInfobox end

--endregion

return Goodbox