From Wikipedia, the free encyclopedia


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.args1 then											-- number of active and reseved fleet ships

		return round (data.grand_total);										-- round to nearest multiple of 5

	elseif 'planned' == frame.args1 then										-- under construction and on-order ships

		return round (data.planned_total);										-- round to nearest multiple of 5

	elseif 'retire' == frame.args1 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.args1 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_targs_t1]] then												-- is keyword valid?

		table.insert (out_t, phrases_targs_t1]]);								-- yes, get the associated string

	elseif args_t1 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_t1 .. '</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_t2 then															-- did we get this optional parameter?

		local year = mw.text.trim (args_t2]):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,

	}