Module:TestModule: Difference between revisions
From Against the Storm Official Wiki
m Testing |
m Testing |
||
| Line 99: | Line 99: | ||
if parent then | if parent then | ||
local parameterStack = { parent.args[3], parent.args[2], parent.args[1], } | local parameterStack = { parent.args[3], parent.args[2], parent.args[1], } | ||
-- Then empty the stack and try to assign them as our variables. | |||
-- Then empty the stack and try to assign them as variables | |||
while #parameterStack > 0 do | while #parameterStack > 0 do | ||
-- Pop the next parameter from the stack | -- Pop the next parameter from the stack | ||
| Line 121: | Line 120: | ||
end | end | ||
end | end | ||
-- Validate the name before we continue any further. | |||
--validatedIcon = validateBuildingName(name) | |||
-- Handle default icon size. | -- Handle default icon size. | ||
| Line 126: | Line 128: | ||
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.) | ||
Revision as of 01:52, 18 October 2024
Documentation for this module may be created at Module:TestModule/doc
--- @module BuildingLink
local BuildingLink = {}
--region Dependencies
-- This module lazily loads dependencies, since they're expensive but only one is needed, we just don't know which in advance.
local WorkshopsData
local InstitutionsData
local FarmsData
local CampsData
local CollectorsData
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
local function tryData(name, buildingInterface)
local buildingID = buildingInterface.getID(name)
return buildingInterface.getIcon(buildingID)
end
local function validateBuildingName(name)
-- Lazy-load of external data, since it's expensive. Start with the most likely so that most pages load as fast as possible.
WorkshopsData = require("Module:WorkshopsData")
local validatedIcon = tryData(name, WorkshopsData)
if not validatedIcon then
InstitutionsData = require("Module:InstitutionsData")
validatedIcon = tryData(name, InstitutionsData)
if not validatedIcon then
FarmsData = require("Module:FarmsData")
validatedIcon = tryData(name, FarmsData)
if not validatedIcon then
CollectorsData = require("Module:CollectorsData")
validatedIcon = tryData(name, CollectorsData)
if not validatedIcon then
CampsData = require("Module:CampsData")
validatedIcon = tryData(name, CampsData)
if not validatedIcon then
error("No building found with name: " .. name .. ". Please see the template documentation for how to use the parameters")
end
end
end
end
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
-- Initialize the stack of unnamed parameters in reverse order, up to 3.
local parent = frame:getParent()
if parent then
local parameterStack = { parent.args[3], parent.args[2], parent.args[1], }
-- Then empty the stack and try to assign them as our variables.
while #parameterStack > 0 do
-- Pop the next parameter from the stack
local nextParameter = table.remove(parameterStack)
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
viewParameters = {
["name"] = name,
["plural"] = needsPlural,
["iconfilename"] = validatedIcon,
["iconsize"] = iconSize,
["display"] = display,
}
local frameargs = frame.args
framegetParentargs = frame:getParent().args
local ret = "frame.args = {<br>"
for k, v in pairs(frameargs) do
ret = ret .. "--[" .. k .. "] = " .. v .. ",<br>"
end
ret = ret .. "}<br>frame:getParent().args = {<br>"
for k, v in pairs(framegetParentargs) do
ret = ret .. "--[" .. k .. "] = " .. v .. ",<br>"
end
ret = ret .. "}"
ret = ret .. "<br>Now...<br>name = " .. name .. "<br>"
ret = ret .. "iconSize = " .. iconSize .. "<br>"
ret = ret .. "needsPlural = "
if not needsPlural then
ret = ret .. "nil"
else
ret = ret .. needsPlural
end
return ret
--return frame:expandTemplate{
-- title = VIEW_TEMPLATE,
-- args = viewParameters,
--}
end
--endregion
return BuildingLink


