Module:Sandbox/trappist the monk/sclass

require ('strict') local get_args = require ('Module:Arguments').getArgs; local namespace = mw.title.getCurrentTitle.namespace;							-- used for categorization

----< E R R O R _ M A P _ T >

local error_map_t = {															-- [1] is error message; [2] is error category synonymous = {'has synonymous parameter', 'Category:Pages using infobox ship with synonymous parameters'}; missing = {'missing required parameter: %s', 'Category:WPSHIPS: sclass and sclass2 errors'}, format = {'invalid format code: %s. Should be 0–5, or blank', 'Category:WPSHIPS: sclass and sclass2 errors'}, }

--[[--< E R R O R _ M S G _ M A K E >--

assembles an error message from message text and category in . creates a help link to the category page; categorizes only main and template namespaces.

 disables categorization for those templates that support it; to disable categorization set  true

]]

local function error_msg_make (msg_idx, template, detail, no_cat) local out = {}; local category; table.insert (out, 'Error: ');	--TODO: simplify? if template then table.insert (out, table.concat ({' '}));				-- TODO: get template names for synonymous parameter errors end table.insert (out, string.format (error_map_t[msg_idx][1], detail));		-- build error message from base + table.insert (out, table.concat ({' (help)'}));	-- help text on category pages; TODO: help text on template pages also? table.insert (out, ' '); if (0 == namespace or 10 == namespace) and not no_cat then					-- categorize in article space (and template space to take care of broken usages) table.insert (out, table.concat ({, error_map_t[msg_idx][2], })); end

return table.concat (out);													-- make a big string and done end

--[[--< S C L A S S >--

implements undefined-class undefined and undefined-class undefined

]]

local function sclass (frame) local args_t = get_args (frame); local parent = frame:getParent; local template = parent:getTitle:gsub ('^Template:', ''):lower;			-- get the name of the template that called this module (includes namespace so strip that) local class_name = args_t[1];												-- names to make it easier to understand local ship_type = args_t[2]; local format = args_t[3]; local ship_type_dab = args_t[4]; local class_name_dab = args_t[5];

if not class_name then														-- when omitted, abandon with error message return error_msg_make ('missing', template, 'class name'); end

if not ship_type then														-- when omitted, abandon with error message return error_msg_make ('missing', template, 'ship type'); end

if format then if tonumber (format) then												-- if has a value that is a number format = tonumber (format);											-- make it a number for comparisons if 5 < format then													-- is outside of allowed range return error_msg_make ('format', template, format); end else																	-- could not be converted to a number return error_msg_make ('format', template, format); end end local out_t = {};															-- output goes here table.insert (out_t, '[[');													-- open the wikilink	table.insert (out_t, class_name);											-- build the wikilink to the class article	table.insert (out_t, '-class ');	table.insert (out_t, ship_type);											-- add ship type	if class_name_dab then														-- when class article is disambiguated		table.insert (out_t, ' (');												-- add the disambiguator		table.insert (out_t, class_name_dab);		table.insert (out_t, ')');	end	table.insert (out_t, '|');	if 'sclass' == template then												-- class named for a member of the class		table.insert (out_t, '\'\);											-- class name is italicized		table.insert (out_t, class_name);		table.insert (out_t, '\'\);	else		table.insert (out_t, class_name);										-- class name is a common attribute; plain text	end

if not format or (3 == format) then											-- when format is omitted, same as format #3 table.insert (out_t, '-class]] [[');									-- open ship-type wikilink if ship_type_dab then													-- when ship-type article is disambiguated table.insert (out_t, ship_type);									-- add ship type table.insert (out_t, ' (');											-- and the disambiguator			table.insert (out_t, ship_type_dab);			table.insert (out_t, ')|');											-- dab is not displayed so insert a pipe and end table.insert (out_t, ship_type);										-- add ship type table.insert (out_t, ']]');												-- close ship-type wikilink end

if 0 == format then															-- no separate ship-type wikilink table.insert (out_t, '-class]]'); end if 1 == format then															-- no separate ship-type wikilink table.insert (out_t, '-class '); table.insert (out_t, ship_type); table.insert (out_t, ']]'); end if 2 == format then															-- ship-type is not wikilinked table.insert (out_t, '-class]] '); table.insert (out_t, ship_type); end if 4 == format then															-- noun form; no ship type table.insert (out_t, ' class]]'); end if 5 == format then															-- class name only; no '-class' annotation table.insert (out_t, ']]'); end return table.concat (out_t); end

----< E X P O R T S >

return { sclass = sclass; }