Module:Goodbox: Difference between revisions
From Against the Storm Official Wiki
m (made private methods actually private. reordered methods) |
m (fixing wrong italics. keeping single quotes) |
||
(12 intermediate revisions by the same user not shown) | |||
Line 14: | Line 14: | ||
local Infobox = require("Module:Infobox") | |||
local GoodsData = require("Module:GoodsData") | local GoodsData = require("Module:GoodsData") | ||
local StyleUtils = require("Module:StyleUtils") | |||
Line 20: | Line 22: | ||
--region Private constants | --region Private constants | ||
local ARGS = { | |||
["name"] = "name", | |||
["purpose"] = "purpose", | |||
["species_preference"] = "species_preference", | |||
local | |||
[" | |||
[" | |||
[" | |||
} | } | ||
Line 75: | Line 35: | ||
--- | --- | ||
--- | --- Builds using the provided wikiInfobox a few header items. | ||
--- | --- | ||
---@param | ---@param wikiInfobox table mw.html object into which we're building this | ||
---@return | ---@param goodName string the name of the good the infobox is about | ||
local function | ---@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 | |||
return | |||
end | end | ||
Line 111: | Line 64: | ||
---@param wikiInfobox table mw.html object into which we're building this | ---@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 goodName string the name of the good the infobox is about | ||
---@param | ---@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 | local function makeInnerContent(wikiInfobox, goodName, params) | ||
-- Grab the data we'll use to populate this. | -- Grab the data we'll use to populate this. | ||
local goodCategory = GoodsData.getGoodCategory(goodName) | local goodCategory = GoodsData.getGoodCategory(goodName) | ||
local goodIsEatable = GoodsData.isGoodEatable(goodName) | local goodIsEatable = GoodsData.isGoodEatable(goodName) | ||
Line 122: | Line 74: | ||
local goodBurnTime = GoodsData.getGoodBurnTime(goodName) | local goodBurnTime = GoodsData.getGoodBurnTime(goodName) | ||
local goodSellValue, goodBuyValue = GoodsData.getGoodValue(goodName) | local goodSellValue, goodBuyValue = GoodsData.getGoodValue(goodName) | ||
local goodID = GoodsData.getGoodID(goodName) | |||
-- Start the inner table | -- Start the inner table | ||
local innerTable = wikiInfobox | 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 | -- Start with the things from the parameters, if any | ||
if | 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 | end | ||
needsSeparator = Infobox.makeInnerRow(innerTable, goodCategory, needsSeparator, | |||
Infobox.TITLE_CATEGORY, | |||
Infobox.makeCategoryIcon(goodCategory, true) .. 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, "'" .. goodID .. "'") | |||
-- Close the inner table, and return it with the passed context | |||
Infobox.endInnerTable(wikiInfobox, innerTable) | |||
return wikiInfobox | |||
end | end | ||
Line 206: | Line 131: | ||
--- @param frame table from template's calling context | --- @param frame table from template's calling context | ||
--- @return string of html and wiki markup | --- @return string of html and wiki markup | ||
function Goodbox. | function Goodbox.renderGoodbox(frame) | ||
-- Every good must have a name. | -- Every good must have a name. | ||
local goodName = frame.args[ | local goodName = frame.args[ARGS.name] | ||
if not goodName or goodName == "" then | if not goodName or goodName == "" then | ||
return "You must specify the name of the good. See [[Template:Goodbox]] for examples." | return "You must specify the name of the good. See [[Template:Goodbox]] for examples." | ||
Line 216: | Line 141: | ||
-- Use this method here to check to see whether the provided name is valid. | -- Use this method here to check to see whether the provided name is valid. | ||
if not GoodsData.getGoodID(goodName) then | if not GoodsData.getGoodID(goodName) then | ||
return " | return "Goodbox can't find the specified good: " .. goodName .. "." | ||
end | end | ||
-- Additional template parameters, may or may not be present | -- Additional template parameters, may or may not be present. | ||
local purpose = frame.args[ | local purpose = frame.args[ARGS.purpose] | ||
local speciesPref = frame.args[ | local speciesPref = frame.args[ARGS.species_preference] | ||
local wikiInfobox = Infobox.startNewInfobox() | |||
local wikiInfobox = | makeHeaderContent(wikiInfobox, goodName) | ||
makeInnerContent(wikiInfobox, goodName, | |||
{ [ARGS.purpose] = purpose, [ARGS.species_preference] = speciesPref }) | |||
return wikiInfobox | return wikiInfobox |
Latest revision as of 18:19, 24 December 2023
Documentation for this module may be created at Module:Goodbox/doc
--- --- 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, true) .. 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, "'" .. goodID .. "'") -- 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