Module:Goodbox: Difference between revisions
From Against the Storm Official Wiki
m (replacing some empty styling with empty strings instead of nil) |
(Next version; css-based styling instead of inline, new layout methods with divs instead of using tables for layout) |
||
Line 16: | Line 16: | ||
local Infobox = require("Module:Infobox") | local Infobox = require("Module:Infobox") | ||
local GoodsData = require("Module:GoodsData") | local GoodsData = require("Module:GoodsData") | ||
local StyleUtils = require("Module:StyleUtils") | |||
Line 21: | Line 22: | ||
--region Private constants | --region Private constants | ||
local | local ARGS = { | ||
["name"] = "name", | |||
["purpose"] = "purpose", | |||
["species_preference"] = "species_preference", | |||
} | |||
--endregion | --endregion | ||
Line 32: | Line 33: | ||
--region Private methods | --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 | |||
--- | --- | ||
Line 39: | 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 | ---@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 51: | 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 = | local innerTable = Infobox.startNewInnerTable(wikiInfobox) | ||
-- | -- we'll reuse this to mark where separators are needed in the table | ||
local needsSeparator = false | |||
Infobox. | -- Start with the things from the parameters, if any | ||
Infobox.toTitleCase( | for paramTitle, paramValue in pairs(params or {}) do | ||
needsSeparator = Infobox.makeInnerRow(innerTable, paramValue, needsSeparator, | |||
Infobox.toTitleCase(paramTitle), paramValue) | |||
end | end | ||
needsSeparator = true | |||
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)) | |||
needsSeparator = Infobox.makeInnerRow(innerTable, goodBuyValue, needsSeparator, | |||
Infobox.TITLE_BUY_VALUE, Infobox.toTwoDecimalPlaces(goodBuyValue)) | |||
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 | |||
wikiInfobox | |||
end | end | ||
Line 130: | Line 132: | ||
-- 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 141: | Line 143: | ||
-- 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 | makeHeaderContent(wikiInfobox, goodName) | ||
makeInnerContent(wikiInfobox, goodName, | |||
{ [ARGS.purpose] = purpose, [ARGS.species_preference] = speciesPref }) | |||
return wikiInfobox | return wikiInfobox |
Revision as of 23:02, 22 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 needsSeparator = Infobox.makeInnerRow(innerTable, paramValue, needsSeparator, Infobox.toTitleCase(paramTitle), paramValue) end needsSeparator = true 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)) needsSeparator = Infobox.makeInnerRow(innerTable, goodBuyValue, needsSeparator, Infobox.TITLE_BUY_VALUE, Infobox.toTwoDecimalPlaces(goodBuyValue)) 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