Module:USN fleet totals
Appearance
implements:
{{USN fleet totals}}
{{decommission}}
{{end of service}}
Usage
[edit]{{#invoke:USN fleet totals|USN_fleet_totals|{{{1|}}}}}
local data = mw.loadData ('Module:USN fleet totals/data'); -- get the detailed list of ship types and their counts, the grand total of active and reserve ships, and the total planned ships
local get_args = require ('Module:Arguments').getArgs;
--[[--------------------------< R O U N D >--------------------------------------------------------------------
rounds <count> to nearest multiple of 5.
]]
local function round (count)
if 0 == count % 5 then
return count; -- <count> is xx0, xx5 so return unmolested
elseif 2.5 > (count % 5) then
return count - (count % 5); -- <count> is xx1, xx2 so return xx0
else
return count + (5 - (count % 5)); -- <count> is xx3, xx4 so return xx5
end
end
--[[--------------------------< U S N _ F L E E T _ T O T A L S >----------------------------------------------
implements {{USN fleet totals}}
This function returns one of three values according to the text sting in {{{1}}} (frame.args[1]):
active – the 'grand total' (active and reserved fleets) rounded to the nearest multiple of 5 -- {{USN fleet totals|active}}
planned – the 'planned total' (ships under construction or on order) rounded to the nearest multiple of 5 -- {{USN fleet totals|planned}}
retire – number of ships to be decommissioned or taken out of service -- {{USN fleet totals|retire}}
retire-year – planned retirement year farthest in the future -- {{USN fleet totals|retire-year}}
<anything or nothing> – the long string of fleet totals created by Module:USN fleet totals -- {{USN fleet totals}}
]]
local function USN_fleet_totals (frame)
if 'active' == frame.args[1] then -- number of active and reseved fleet ships
return round (data.grand_total); -- round to nearest multiple of 5
elseif 'planned' == frame.args[1] then -- under construction and on-order ships
return round (data.planned_total); -- round to nearest multiple of 5
elseif 'retire' == frame.args[1] then -- ships to be decommissioned or taken out of service
return round (data.retirements_total); -- round to nearest multiple of 5
elseif 'retire-year' == frame.args[1] then
return data.retirements_year_max;
else -- {{{1}}} is anything else
return data.fleet_totals_str; -- return the detailed fleet totals
end
end
--[[--------------------------< _ D E C O M _ E O S _ C O M M O N >--------------------------------------------
common function to implement {{decommission}} and {{end of service}} templates
]]
local function _decom_eos_common (args_t, phrases_t, template_name)
local out_t = {};
if phrases_t[args_t[1]] then -- is keyword valid?
table.insert (out_t, phrases_t[args_t[1]]); -- yes, get the associated string
elseif args_t[1] then -- no, but not nil so emit appropriate error message
return '<span style="color:#d33"><kbd>{{[[Template:' .. template_name .. '|' .. template_name ..']]}}</kbd>: error: unknown keyword: ' .. args_t[1] .. '</span>';
else -- missing keyword so emit error message
return '<span style="color:#d33"><kbd>{{[[Template:' .. template_name .. '|' .. template_name ..']]}}</kbd>: error: missing keyword</span>'
end
if args_t[2] then -- did we get this optional parameter?
local year = mw.text.trim (args_t[2]):match ('^%d%d%d%d$'); -- attempt to get a four digit year
if year then -- did we find a 'year'? TODO: validate? must be this or a future year? never in the past?
table.insert (out_t, year); -- add the year to the output
else -- here when a four-digit 'year' not found
return '<span style="color:#d33"><kbd>{{[[Template:' .. template_name .. '|' .. template_name ..']]}}</kbd>: error: invalid year</span>';
end
end
return table.concat (out_t, ' '); -- assemble into a big string and done
end
--[[--------------------------< D E C O M M I S S I O N >------------------------------------------------------
implements {{decommission}}
Takes two positional parameters:
{{{1}}} – (required) one of two keywords that cause the template to return an appropriate phrase; phrases are
defined in ~/data. The keywords are 'scheduled' and 'proposed'
{{{2}}} – (optional) year when decommissioning is expected to occur
]]
local function decommission (frame)
local args_t = get_args (frame); -- get parameters from the template into a local table
return _decom_eos_common (args_t, data.decommission_t, 'decommission'); -- call common function to error check the inputs and return the rendered string
end
--[[--------------------------< E N D _ O F _ S E R V I C E >--------------------------------------------------
implements {{end of service}}
Takes two positional parameters:
{{{1}}} – (required) one of two keywords that cause the template to return an appropriate phrase; phrases are
defined in ~/data. The keywords are 'scheduled' and 'proposed'
{{{2}}} – (optional) year when end of service is expected to occur
]]
local function end_of_service (frame)
local args_t = get_args (frame); -- get parameters from the template into a local table
return _decom_eos_common (args_t, data.end_of_service_t, 'end of service'); -- call common function to error check the inputs and return the rendered string
end
--[[--------------------------< E X P O R T S >----------------------------------------------------------------
]]
return
{
USN_fleet_totals = USN_fleet_totals,
decommission = decommission,
end_of_service = end_of_service,
}