Module:BuildingLink: Difference between revisions
From Against the Storm Official Wiki
(refactored the parameter logic to be more robust.) Tag: Reverted |
(Updated to new data model!) |
||
(8 intermediate revisions by the same user not shown) | |||
Line 6: | Line 6: | ||
--region Dependencies | --region Dependencies | ||
local BuildingDataProxy = require("Module:BuildingDataProxy") | |||
local | |||
local VIEW_TEMPLATE = "Building_link/view" | local VIEW_TEMPLATE = "Building_link/view" | ||
Line 40: | Line 35: | ||
--region Private methods | --region Private methods | ||
---tryData retrieves the icon from the provided building interface. Based on the interface, if name is nil or there is no icon, this method will return nil | |||
--- | |||
---@param name string the display name of a building | |||
---@param buildingInterface table a data module require'd and passed in | |||
---@return string the filename of the icon, if any is found | |||
local function tryData(name, buildingInterface) | local function tryData(name, buildingInterface) | ||
Line 49: | Line 49: | ||
---validateBuildingName attempts to find in each of the data modules the name specified. If the name is not found, an error is thrown. If the name is found in one of the data modules, it will return the icon filename. So we return that as proof the building was found (and to use it, of course). | |||
--- | |||
---@param name string the display name of a building | |||
---@return string the filename of the icon for that building | |||
local function validateBuildingName(name) | local function validateBuildingName(name) | ||
local id = BuildingDataProxy.getID(name) | |||
if not id then | |||
local validatedIcon = | error("No building found with name: " .. name .. ". Please see the template documentation for how to use the parameters") | ||
end | |||
local validatedIcon = BuildingDataProxy.getIcon(id) | |||
if not validatedIcon then | if not validatedIcon then | ||
error("Could not validate building with name: " .. name .. ". Please see the template documentation for how to use the parameters") | |||
end | end | ||
return validatedIcon | return validatedIcon | ||
end | end | ||
Line 93: | Line 83: | ||
local iconSize = frame.args.size | local iconSize = frame.args.size | ||
local display = frame.args.display | local display = frame.args.display | ||
local | local needsPlural | ||
if not name or name == "" then | |||
error("You must specify a building. Please see the template documentation for how to use the parameters") | |||
end | |||
-- | -- Initialize the array of unnamed parameters, up to 3, so several may be nil. | ||
local | local parent = frame:getParent() | ||
if parent then | |||
-- | local parameterStack = { parent.args[1], parent.args[2], parent.args[3], } | ||
-- Then empty the stack and try to assign them as our variables. | |||
for _, nextParameter in ipairs(parameterStack) do | |||
if nextParameter and nextParameter ~= "" then | |||
-- Prioritize setting the name first. | |||
if not name or name == "" then | |||
name = nextParameter | |||
else | |||
-- These could happen in either order, because their valid values are non-overlapping | |||
if (not iconSize or iconSize == "") and VALID_SIZE[nextParameter] then | |||
iconSize = nextParameter | |||
else | |||
if not needsPlural and VALID_PLURAL[nextParameter] then | |||
needsPlural = nextParameter | |||
end | |||
end | |||
end | |||
end | end | ||
end | end | ||
end | end | ||
-- | -- Validate the name before we continue any further. | ||
validatedIcon = validateBuildingName(name) | validatedIcon = validateBuildingName(name) | ||
-- | -- Handle default icon size. | ||
if not iconSize or not VALID_SIZE[iconSize] then | if not iconSize or iconSize == "" or not VALID_SIZE[iconSize] then | ||
iconSize = "none" | iconSize = "none" | ||
end | end | ||
-- The only valid value for mustBePlural is "s," so then make on check to see if name ends in a way that we need to add "es" at the end instead of just "s". For names that end in "y", we swap out the last character for "ies" instead. (This will require one-time setup for redirect pages.) | -- The only valid value for mustBePlural is "s," so then make on check to see if name ends in a way that we need to add "es" at the end instead of just "s". For names that end in "y", we swap out the last character for "ies" instead. (This will require one-time setup for redirect pages.) | ||
if | if needsPlural == "s" or needsPlural == "es" then | ||
if string.match(name, "y$") then | if string.match(name,"y$") then | ||
name = string.sub(name, 1, -2) .. "ies" | name = string.sub(name,1,-2) .. "ies" | ||
needsPlural = nil -- unset now, since it's incorporated into the name itself | |||
else | else | ||
local needsSyllable = string.match(name, "[sxz]$") or string.match(name, "sh$") or string.match(name, "ch$") | local needsSyllable = string.match(name,"[sxz]$") or string.match(name,"sh$") or string.match(name,"ch$") | ||
needsPlural = needsSyllable and "es" or "s" | |||
end | end | ||
else | else | ||
needsPlural = nil | |||
end | end | ||
-- The args to pass to the view. | |||
viewParameters = { | viewParameters = { | ||
["name"] = name, | ["name"] = name, | ||
["plural"] = | ["plural"] = needsPlural, | ||
["iconfilename"] = validatedIcon, | ["iconfilename"] = validatedIcon, | ||
["iconsize"] = iconSize, | ["iconsize"] = iconSize, |
Latest revision as of 01:43, 30 October 2024
Documentation for this module may be created at Module:BuildingLink/doc
--- @module BuildingLink local BuildingLink = {} --region Dependencies local BuildingDataProxy = require("Module:BuildingDataProxy") local VIEW_TEMPLATE = "Building_link/view" --endregion --region Private constants local VALID_SIZE = { ["none"] = true, ["small"] = true, ["medium"] = true, ["large"] = true, ["huge"] = true, } local VALID_PLURAL = { ["s"] = true, ["es"] = true, } --endregion --region Private methods ---tryData retrieves the icon from the provided building interface. Based on the interface, if name is nil or there is no icon, this method will return nil --- ---@param name string the display name of a building ---@param buildingInterface table a data module require'd and passed in ---@return string the filename of the icon, if any is found local function tryData(name, buildingInterface) local buildingID = buildingInterface.getID(name) return buildingInterface.getIcon(buildingID) end ---validateBuildingName attempts to find in each of the data modules the name specified. If the name is not found, an error is thrown. If the name is found in one of the data modules, it will return the icon filename. So we return that as proof the building was found (and to use it, of course). --- ---@param name string the display name of a building ---@return string the filename of the icon for that building local function validateBuildingName(name) local id = BuildingDataProxy.getID(name) if not id then error("No building found with name: " .. name .. ". Please see the template documentation for how to use the parameters") end local validatedIcon = BuildingDataProxy.getIcon(id) if not validatedIcon then error("Could not validate building with name: " .. name .. ". Please see the template documentation for how to use the parameters") end return validatedIcon end --endregion --region Public methods ---main --- Extracts parameters, validates the building by getting its icon, and then sends the data to the view template for rendering. --- --- @param frame table the template's context, with arguments --- @return string wiki markup function BuildingLink.main(frame) local name = frame.args.name local iconSize = frame.args.size local display = frame.args.display local needsPlural if not name or name == "" then error("You must specify a building. Please see the template documentation for how to use the parameters") end -- Initialize the array of unnamed parameters, up to 3, so several may be nil. local parent = frame:getParent() if parent then local parameterStack = { parent.args[1], parent.args[2], parent.args[3], } -- Then empty the stack and try to assign them as our variables. for _, nextParameter in ipairs(parameterStack) do if nextParameter and nextParameter ~= "" then -- Prioritize setting the name first. if not name or name == "" then name = nextParameter else -- These could happen in either order, because their valid values are non-overlapping if (not iconSize or iconSize == "") and VALID_SIZE[nextParameter] then iconSize = nextParameter else if not needsPlural and VALID_PLURAL[nextParameter] then needsPlural = nextParameter end end end end end end -- Validate the name before we continue any further. validatedIcon = validateBuildingName(name) -- Handle default icon size. if not iconSize or iconSize == "" or not VALID_SIZE[iconSize] then iconSize = "none" end -- The only valid value for mustBePlural is "s," so then make on check to see if name ends in a way that we need to add "es" at the end instead of just "s". For names that end in "y", we swap out the last character for "ies" instead. (This will require one-time setup for redirect pages.) if needsPlural == "s" or needsPlural == "es" then if string.match(name,"y$") then name = string.sub(name,1,-2) .. "ies" needsPlural = nil -- unset now, since it's incorporated into the name itself else local needsSyllable = string.match(name,"[sxz]$") or string.match(name,"sh$") or string.match(name,"ch$") needsPlural = needsSyllable and "es" or "s" end else needsPlural = nil end -- The args to pass to the view. viewParameters = { ["name"] = name, ["plural"] = needsPlural, ["iconfilename"] = validatedIcon, ["iconsize"] = iconSize, ["display"] = display, } return frame:expandTemplate{ title = VIEW_TEMPLATE, args = viewParameters, } end --endregion return BuildingLink