require('strict')local get_args = require ('Module:Arguments').getArgs;local styles = require ('Module:WPMILHIST Infobox style'); -- infobox csslocal data = mw.loadData ('Module:WPSHIPS utilities/data');local namespace = mw.title.getCurrentTitle.namespace; -- used for categorization
----------------------------< E R R O R _ M A P _ T >--------------------------------------------------------
local error_map_t =
----------------------------< E R R O R _ M S G _ M A K E >--------------------------------------------------
assembles an error message from message text and category in
local function error_msg_make (msg_idx, template, detail, no_cat, link_template_name) local out = ; local category; table.insert (out, '
Error: '); --TODO: simplify? if template then if link_template_name then table.insert (out, table.concat); else table.insert (out, table.concat); -- TODO: get template names for synonymous parameter errors end end table.insert (out, string.format (error_map_t[msg_idx][1], detail)); -- build error message from base +namespace) and not no_cat then -- categorize in article space (and template space to take care of broken usages) table.insert (out, table.concat); end
return table.concat (out); -- make a big string and doneend
----------------------------< I S _ S E T >------------------------------------------------------------------
Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string.
local function is_set(var) return not (var
);end
--
local function sizeof_ship_type (frag, frag_len, nat_len) local ship_type; if 5 <= (frag_len - nat_len) then -- must have at least five fragments after nationality for four-word ship type ship_type = table.concat (frag, ' ', nat_len+1, nat_len+4); -- four-word ship type if data.ship_type_t[ship_type] then return 4; end end if 4 <= (frag_len - nat_len) then -- must have at least four fragments after nationality for three-word ship type ship_type = table.concat (frag, ' ', nat_len+1, nat_len+3); -- three-word ship type if data.ship_type_t[ship_type] then return 3; end end if 3 <= (frag_len - nat_len) then -- must have at least three fragments after nationality for two-word ship type ship_type = table.concat (frag, ' ', nat_len+1, nat_len+2); -- two-word ship type if data.ship_type_t[ship_type] then return 2; end end if 2 <= (frag_len - nat_len) then -- must have at least two fragments after nationality for one-word ship type if data.ship_type_t[frag[nat_len+1]] then -- one-word ship type return 1; end end return 0; -- no recognizable ship typeend
--
local function sizeof_nationality (frag, frag_len) local nat = ;
if not data.nationality_t [frag[1]] then -- if not a one-word nationality if 2 <= frag_len - 2 then -- must have at least two fragments after nationality for minimal ship type and name nat = table.concat (frag, ' ', 1, 2); if data.nationality_t [nat] then -- is it a two-word nationality? return 2; -- yes else return 0; -- no end end return 0; -- not one-word and not enough fragments for two-word end return 1; -- one-word nationalityend
--name= (required): a name is required; if missing or empty, this function returns an error message (may or may not be visible depending on where it is used) used in
to provide a value for and to provide a value for |infobox caption= Optional arguments to support
: |dab=none – displays ship name without parenthetical disambiguator; use when |infobox caption=nodab |sclass=2 – for ship classes only; displays class name without italics (parameter name is loosely similar to which does the same thing); use when |infobox caption=class |adj=off – for ship classes only; displays class name as a noun (no hyphen, no ship type); use when |infobox caption=class
Arguments are passed in a table.
to call this function locally: do_ship_name_format or args = ; do_ship_name_format (args)
The function returns the formatted name or, if unable to format the name, the original name and an unformatted error message.
local function do_ship_name_format (args) local name_sans_dab; -- the ship or class name without a trailing parenthetical dab local dab; -- the dab stripped from the name local fragments = ; -- a table of words that make up name_sans_dab local ship_type; -- a word or phrase that describes a ship local type_len; -- the number of words that describe a ship local nat_len; -- the number of words used to specify a ship's nationality local name = ; -- the reassembles and formatted ship name local error_msg = ; -- a repository for error messages if any
-- args.name = mw.text.decode (args.name); -- replace html entities in title with their characters; doesn't work for & and & in prefix args.name = args.name:gsub ("'", "\'"); -- replace html appostrophe with the character-- args.name = args.name:gsub ("&", "&");-- args.name = args.name:gsub ("&", "&");-- args.name = args.name:gsub ("&", "&");
if args.name:match ('.+%-class%s+%a+') then -- if a ship-class fragments = mw.text.split (args.name, '-class'); -- split at -class if '2'
args.adj then return fragments[1] .. ' class'; -- for infobox caption do noun form
nat_len = sizeof_nationality (fragments, #fragments); -- get the number of words in the ship's nationality if 0 < nat_len then -- if not zero we have a valid nationality type_len = sizeof_ship_type (fragments, #fragments, nat_len); -- get the number of words in the ship type if 0 < type_len then -- if not zero, ship type is valid; nationality and type not italics, the rest is name name = "" .. table.concat (fragments, ' ', nat_len + type_len + 1) .. ""; -- format name if 'none'
if is_set (name) then -- name will be set if we were able to format it if 'none'
args.dab then -- for |infobox caption=nodab return name; -- return the formatted name without the dab end return name .. dab; -- return the formatted name with the dab end -- last chance, is there a ship type in the dab? for key, _ in pairs (data.ship_type_t) do -- spin through the ship type list and see if there is a ship type (key) in the dab if dab:find ('%f[%a]' .. key .. '%f[^%a]') then -- avoid matches that are not whole word name = "" .. table.concat (fragments, ' ') .. ""; -- format the name if 'none'
args.dab then -- for |infobox caption=nodab return table.concat (fragments, ' '), error_msg; -- return the unformatted name without the dab, and an error message end end
return args.name, error_msg; -- return original un-formatted name with unformatted error message if anyend
--name= (required): a name is required; if missing or empty, this function returns an error message (may or may not be visible depending on where it is used) used in
to provide a value for and to provide a value for |infobox caption= Optional parameters to support
: |dab=none – displays ship name without parenthetical disambiguator; use when |infobox caption=nodab |sclass=2 – for ship classes only; displays class name without italics (parameter name is loosely similar to which does the same thing); use when |infobox caption=class |adj=off – for ship classes only; displays class name as a noun (no hyphen, no ship type); use when |infobox caption=classOther optional parameters: |showerrs=yes – marginally useful; can display error messages if the module invocation is not buried in a template Values from the above parameters are placed in a table and that table passed as an argument in the call to do_ship_name_format.
do_ship_name_format returns two strings: a name and an error message. If do_ship_name_format could format the name, it returns the formatted name and an empty string for the error message. If it could not format the name, do_ship_name_format returns the original name and an error message.
Formatting of the error message, in response to |showerrs=yes is the responsibility of the calling function.
local function ship_name_format(frame) local name = ; -- destination of the formatted ship name local error_msg = ; -- destination of any error message
if not is_set (frame.args.name) then -- if a ship name not provided if 'yes'
return name .. error_msg; -- return name and error messageend
--
local function hnsa (frame) local pframe = frame:getParent -- get arguments from calling template frame local ship_name = ; local error_msg = ; local article_title = mw.title.getCurrentTitle.text; -- fetch the article title if not is_set (pframe.args[1]) then return '
missing hsna page'; end local fmt_params = ;if is_set (pframe.args.showerrs) then -- if showerrs set in template, override showerrs in #invoke: fmt_params.showerrs = pframe.args.showerrs; -- template value else fmt_params.showerrs = frame.args.showerrs; -- invoke value end
if is_set (pframe.args[2]) then fmt_params.name = pframe.args[2]; else fmt_params.name = article_title; -- use article title end
ship_name, error_msg = do_ship_name_format (fmt_params); if is_set (error_msg) and is_set (pframe.args[2]) then -- if unable to format the name local escaped_name = pframe.args[2]:gsub("([%(%)%.%-])", "%%%1"); -- escape some of the Lua magic characters if pframe.args[2]
fmt_params.showerrs then error_msg = '
' .. error_msg .. ''; else error_msg = ; -- unset so it doesn't diplay end local output =return table.concat (output);end
----------------------------< N A V S O U R C E >------------------------------------------------------------
This version of the template was added as a test vehicle for do_ship_name_format.
local function navsource (frame) local pframe = frame:getParent -- get arguments from calling template frame local ship_name = ; local error_msg = ; local article_title = mw.title.getCurrentTitle.text; -- fetch the article title if not is_set (pframe.args[1]) then return '
missing navsource URLcode'; end local fmt_params = ;if is_set (pframe.args.showerrs) then -- if showerrs set in template, override showerrs in #invoke: fmt_params.showerrs = pframe.args.showerrs; -- template value else fmt_params.showerrs = frame.args.showerrs; -- invoke value end
if is_set (pframe.args[2]) then fmt_params.name = pframe.args[2]; else fmt_params.name = article_title; -- use article title end
ship_name, error_msg = do_ship_name_format (fmt_params); if is_set (error_msg) and is_set (pframe.args[2]) then -- if unable to format the name local escaped_name = pframe.args[2]:gsub("([%(%)%.%-])", "%%%1"); -- escape some of the Lua magic characters if pframe.args[2]
fmt_params.showerrs then error_msg = '
' .. error_msg .. ''; else error_msg = ; -- unset so it doesn't diplay end local output =return table.concat (output);end
----------------------------< _ S H I P >--------------------------------------------------------------------
This is a possible replacement for the template . It has better error detection and handling.
local function _ship (prefix, name, dab, control, unlinked_prefix, unlinked_whole, template, no_cat) local error_msg = ; local category = ; if not is_set (control) then control = ; -- if not provided, ensure that control is empty string for comparisons elseif control:find ('%-') then -- shortcut for |link=no when using a format control parameter ...|SSBN-659|-6}} same as ...|SSBN-659|6|link=no}} unlinked_whole = true; -- set the unlinked flag control = control:match ('%d'); -- strip out the hyphen end
-- dispose of error conditions straight away if not is_set (name) then -- this is the only required parameter error_msg = error_msg_make ('missing_name', template, , no_cat, true); elseif not is_set (dab) and ('1'
control or '5'
control or '6'
control then -- displaying only the prefix error_msg = error_msg_make ('invalid_control', template, control, no_cat, true); elseif is_set (control) then if ('number' ~= type (tonumber (control))) or (1 ~= control:len) or (1 > tonumber (control) or 6 < tonumber (control)) then -- control must be a single-digit number 1 through 6 error_msg = error_msg_make ('invalid_control', template, control, no_cat, true); end elseif not is_set (prefix) and unlinked_prefix then -- prefix required when |up=yes error_msg = error_msg_make ('missing_prefix', template, , no_cat, true); end
if is_set (error_msg) then return error_msg; end
local link_name; local link = ;
if is_set (prefix) then link = prefix .. ' ' .. name; -- begin assembling the article name (link) portion of the wikilink else link = name; end
if is_set (dab) then link = link .. ' (' .. dab .. ')'; -- wrap dab in parentheses end
local target_object = mw.title.new (link).redirectTarget; -- if points to a redirect if target_object then link = target_object.fullText; -- get the target title to avoid linking through the redirect end
name = "" .. name .. ""; -- name is always italicized so do it now
if '1'
control then dab = " \'\'" .. dab .. "\'\'"; -- for prefix with dab display HMS A1. italicize the dab else dab = ' (' .. dab .. ')'; -- except for dab-only, all others display with parentheses end end if not is_set (control) then -- when control not set: prefix, name, and dab if is_set (prefix) then link_name = prefix .. ' ' .. name .. dab; else link_name = name .. dab; end else -- when control is not 1 or none if '2'
control then -- name and dab link_name = name .. dab; elseif '5'
control then -- prefix and name link_name = prefix .. ' ' .. name; end end
if '5' ~= control and'6' ~= control and is_set (control) then unlinked_prefix = false; -- no prefix so don't try to unlink it end
if unlinked_whole then return link_name; -- no linking desired so done elseif unlinked_prefix and is_set (prefix) then -- when there is a prefix to unlink link_name = link_name:gsub ('^.- ', , 1); -- remove the prefix and nbsp return prefix .. ' ' .. link_name .. ''; -- add prefix and nbsp to front and done else return '' .. link_name .. ''; -- construct the wikilink and done endend
--ship|_template=}} Parameters in the module frame are: there are no module frame parameters Parameters in the template frame are: – prefix (HMS, USS, Japanese submarine, etc) – ship's name (required) – disambiguator (year, hull or pennant number, etc) – format control (1, 2, 3, 5, 6; 4 not allowed) |wl= – when set to 'no', rendering is not wikilinked |up= – when set to 'yes' prefix (if rendered) is not linked
local function ship (frame) -- this version not supported from the template yet local args_t = get_args (frame);
local prefix = args_t[1] or ; -- fetch positional parameters into named variables for readability local name = args_t[2] or ; -- stripped of leading and trailing whitespace local dab = args_t[3] or ; -- empty positional parameters are nil so convert nil to empty string local control = args_t[4]; local unlinked_prefix = 'yes'
args_t.wl; -- make boolean: true when |wl=no local no_cat = 'yes'
return _ship (prefix, name, dab, control, unlinked_prefix, unlinked_whole, 'Ship', no_cat);end
--ship_prefix_templates|prefix=
fix>|template=<template name>}} Parameters in the module frame are: |_prefix= – (required) _prefix (HMS, USS, Japanese submarine, etc) |_template= template name for error messages; optional when |prefix= same as template name Parameters in the template frame are: {{{1|}}} – ship's name (required) {{{2|}}} – disambiguator (year, hull or pennant number, etc) {{{3|}}} – format control (1, 2, 3, 5, 6; 4 not allowed) |wl= – when set to 'no', rendering is not wikilinked |up= – when set to 'yes' prefix (if rendered) is not linked
local function ship_prefix_templates (frame) -- this version not supported from the templates yet local args_t = get_args (frame);
local prefix = args_t.prefix or ; -- fetch positional parameters into named variables for readability local name = args_t[1] or ; -- stripped of leading and trailing whitespace local dab = args_t[2] or ; -- empty positional parameters are nil so convert nil to empty string local control = args_t[3]; local unlinked_prefix = 'yes'
args_t.wl; -- make boolean: true when |wl=no local no_cat = 'yes'
return _ship (prefix, name, dab, control, unlinked_prefix, unlinked_whole, args_t.template_name or prefix, no_cat);end
--
local function list_error (prefix, message, sep, param_val, showerrs) local err_msg = '%s
list error: %s (help)%s%s%s'; local category = ;if 0
showerrs then return string.format (err_msg, prefix, message, sep, param_val, category); -- put it all together else return param_val .. category; endend
--
The above renders without proper indents for items marked ** and ***.
If the list is not wrapped in
This code translates a bulleted list into an html unordered list:
There are rules: 1. The parameter value must begin with a splat but may have leading and trailing whitespace. 2. Each list item after the first must begin on a new line just as is required by normal bulleted lists. 3. When adding a sublevel, the number of splats may increase by one and never more. This is illegal: *item ***itemWhen any of these rules are violated, unbulleted_list returns the original text and adds the articleto Category:WPSHIPS:Infobox list errors. Error messaging in this function is somewhat sketchy so they aredisabled. After initial adoption, better error messaging could/should be implemented.
This function receives the content of one parameter:
local function _unbulleted_list (param) local showerrs = true; -- set to false to hide error messages local List_item_otag = '
', param, showerrs); -- return an error message with maintenance category elseif param:match ('.+\n%*') then -- if the parameter value has text followed by an unordered list return list_error (, 'mixed text and list', '
', param, showerrs); -- return an error message with maintenance category end return param; -- return the parameter as is end local item_table = mw.text.split (mw.text.trim (param), '\n'); -- trim white space from end then make a table of bulleted items by splitting on newlines if 1
splats then -- nil if there is an extra line between items return list_error ('*', 'list item missing markup', '\n', param, showerrs); -- return an error message with maintenance category elseif
splats = splats:len; -- change string of splats into a number indicating how many splats there are if splats
level + 1 then -- number of splats can only increase by one level = splats; -- record the new level table.insert (html_table, '
while 0 < level do table.insert (html_table, '
return table.concat (html_table, '\n'); -- return the list as a stringend
----------------------------< U N B U L L E T E D _ L I S T >------------------------------------------------
external entry point
local function unbulleted_list (frame) return _unbulleted_list (frame.args[1])end
--[=[-------------------------< _I N F O B O X _ S H I P _ F L A G >-------------------------------------------- Output of {{shipboxflag|USA}}: [[File:Flag of the United States.svg|100x35px|alt=|link=]] Image syntax:
This function standardizes the size of flag images in the infobox ship career header by simply overwriting the Sizeparameter value in the Image wikilink with |100x28px. This size leave a 1px gap between the top and bottom of the flag image andthe header edge. A similar left-side gap of 2px is supplied by
.
]=]
local function _infobox_ship_flag (image) if image:match ('|[%s%dx]+px%s*') then -- is there a size positional parameter? image = image:gsub('|[%s%dx]+px%s*', '%|100x28px'); -- overwrite it with |100x28px else return '
malformed flag image' end return image; -- return the modified imageend--[=[-------------------------< I N F O B O X _ S H I P _ F L A G >-------------------------------------------- external entry point ]=]
local function infobox_ship_flag (frame) if not is_set (frame.args[1]) then -- if |Ship flag= not set return ; -- return empty string end return _infobox_ship_flag (frame.args[1]); -- return the modified imageend
--[=[-------------------------< C I T E _ D A N F S _ T I T L E >---------------------------------------------- This function attempts to render a DANFS article title in more or less proper (per Wikipedia) format for the template {{cite danfs}}. DANFS titles typically take one of four forms: <ship name> <disambiguator> <hull number> <ship name> <hull number> <ship name> <disambiguator> <ship name> Here, we extract the various parts, italicize the ship name and reassemble for use by the cite danfs |title= parameter. To call this function: |title={{#invoke:WPSHIPS utilities|cite_danfs_title|{{{title}}}}} ]=]
local function cite_danfs_title (frame) local name; local disambiguator; local hullnum; if not is_set (frame.args[1]) then -- if |title= not set return ; -- return empty string end
name, disambiguator, hullnum = frame.args[1]:match ('(.-)([XVI]+)(%([^%)]+%))$'); if not (name and disambiguator and hullnum) then disambiguator = ; -- empty string for concatenation name, hullnum = frame.args[1]:match ('(.-)(%([^%)]+%))$'); if not (name and hullnum) then hullnum = ; -- empty string for concatenation name, disambiguator = frame.args[1]:match ('(.-)([XVI]+)$'); if not (name and disambiguator) then disambiguator = ; name = frame.args[1]; -- just a name or something we don't recognize end end end
return table.concat ; -- reassemble and doneend
----------------------------< S Y N O N Y M _ C H E C K >----------------------------------------------------
support function for infoboxen functions
there are a handful of infoboxen parameters that are synonymous pairs. This function is called to see if bothof the parameters in a synonymous pair have been assigned a value. When both have assigned values, each gets anerror message appended to it. Most of the synonymous pairs are UK Emglish v US English so the variable names
local function synonym_check (args_t, uk_param, us_param, error_flag) if args_t[uk_param] and args_t[us_param] then
args_t[uk_param] = args_t[uk_param] .. error_msg_make ('synonymous'); -- both are set so append error message with category args_t[us_param] = args_t[us_param] .. error_msg_make ('synonymous', nil, nil, true); -- but append error message without category return true; -- inform the calling function that it needs to emit maint category end return error_flag; -- no match so return unmodified
----------------------------< L I N E _ I T E M S >----------------------------------------------------------
support function for infoboxen functions
This function handles all infobox ship parameters that are 'line items' (label followed by value) because allof these sorts of parameters are rendered with exacty the same formatting.
params_t is a table of tables where the params_t keys are the template's parameter names. The params_tvalues are sequences where [1] is an index number that defines where in the rendering the label/value pair ispositioned and [2] is the label that will be rendered when the parameter has a value.
This indexing is used because params_t is not a sequence and because pairs does not necessarily return the'next' k/v pair.
This function spins through params_t and writes html for parameters that have assigned values into temp_taccording to the 'index' value in the associated sequance table. When parameters are missing or empty, thisfunction writes an empty string into the associated location in lines_t so that lines_t can be concatenatedinto a string value that is returned to the calling function.
args_t is the arguments table from the template frame.
local function line_items (args_t, params_t) local lines_t = ; -- a sequence table of rendered label/value html lines; one for each key in params_t
for k, v in pairs (params_t) do -- k is templat e parameter name; v is a sequence table with index and associated label local temp_t = -- initialize/reinitialize for next line item if not args_t[k] then -- if no assigned value then lines_t[v[1]] = ; -- set to empty string for concatenation else table.insert (temp_t, ' \n'); -- close that cell and this row end lines_t[v[1]] = table.concat (temp_t); -- concatenate and put the line item in the lines sequence table at the index position end'); -- open the line item row and cell table.insert (temp_t, v[2]); -- add parameter's label text table.insert (temp_t, ' '); -- close that cell and open the parameter value cell table.insert (temp_t, _unbulleted_list (args_t[k])); -- add the parameter's value; formatted as unordered list if appropriate table.insert (temp_t, '
return table.concat (lines_t); -- make a big string of line items and done
end
--infobox_ship_career}}
local function infobox_ship_career (frame) local args_t = get_args (frame); -- get a table of all parameters in the template call local html_out_t = ; -- html table text goes here local error_flag = false; -- controls emission of maint category when synonymous parameters are both set args_t['Hide header'] = args_t['Hide header'] and args_t['Hide header']:lower; -- set to lowercase if set error_flag = synonym_check (args_t, 'Ship stricken', 'Ship struck', error_flag); -- error if both synonymous parameters set error_flag = synonym_check (args_t, 'Ship honours', 'Ship honors', error_flag); if 'yes' ~= args_t['Hide header'] then -- |Hide header=yes then no header if not ('title'
if args_t['Ship country'] and args_t['Ship flag'] then table.insert (html_out_t, '
table.insert (html_out_t, line_items (args_t, data.infobox_career_params_t)); -- add all of the rest of the template's html
--mw.logObject (table.concat (html_out_t)); return table.concat (html_out_t); -- make a big string and doneend
--infobox_ship_characteristics}}
local function infobox_ship_characteristics (frame) local args_t = get_args (frame); -- get a table of all parameters in the template call local html_out_t = ; -- html table text goes here local error_flag = false; -- controls emission of maint category when synonymous parameters are both set args_t['Hide header'] = args_t['Hide header'] and args_t['Hide header']:lower; -- set to lowercase if set error_flag = synonym_check (args_t, 'Ship armour', 'Ship armor', error_flag); -- error if both synonymous parameters set error_flag = synonym_check (args_t, 'Ship draught', 'Ship draft', error_flag);
if 'yes' ~= args_t['Hide header'] then -- |Hide header=yes then no header table.insert (html_out_t, '
table.insert (html_out_t, line_items (args_t, data.infobox_characteristics_params_t)); -- add all of the rest of the template's html
--mw.logObject (table.concat (html_out_t)); return table.concat (html_out_t); -- make a big string and doneend
--infobox_ship_class_overview}}
local function infobox_ship_class_overview (frame) local args_t = get_args (frame); -- get a table of all parameters in the template call local html_out_t = ; -- html table text goes here args_t['Hide header'] = args_t['Hide header'] and args_t['Hide header']:lower; if 'yes' ~= args_t['Hide header'] then -- |Hide header=yes then no header table.insert (html_out_t, '
table.insert (html_out_t, line_items (args_t, data.infobox_class_overview_params_t)); -- add all of the rest of the template's html
--mw.logObject (table.concat (html_out_t)); return table.concat (html_out_t); -- make a big string and doneend
--filename=
local function is_plimsoll_filename (frame) local args_t = get_args (frame); -- get a table of all parameters in the invoke
local year, volume, scan; if args_t[1] then -- this to avoid script errors when args_t[1] missing year, volume, scan = args_t[1]:match ('(%d%d)(%l)(%d%d%d%d)%.[Pp][Dd][Ff]'); -- get the various parts end if not year then return nil end -- nil when no match so we're done year = tonumber (year); scan = tonumber (scan); if (30 > year) or (45 < year) then return nil end if not (('a'
volume)) then return nil end if (1 > scan) then return nil end
return true;end
--filename=
local function set_plimsoll_date (frame) local args_t = get_args (frame); -- get a table of all parameters in the invoke
if not args_t[1] then return nil; end
local year = args_t[1]:match ('(%d%d)%l%d%d%d%d'); -- get the intial year year = 1900 + tonumber (year); -- make it a four-digit year return string.format ('%d–%d', year, year + 1); -- and then add one for the second year in the rangeend
--subtitle=
local function set_plimsoll_subtitle (frame) local subtitle = get_args (frame)[1]; -- get the subtitle parameter if not subtitle then return nil; end if not data.subtitles_t[subtitle] then return ': ' .. subtitle; -- not predefined so return whatever |subtitle= holds with leading ': ' end return ': ' .. data.subtitles_t[subtitle]; -- return predefined subtitle with leading ': 'end
--filename=
local function set_plimsoll_url (frame) local args_t = get_args (frame); -- get a table of all parameters in the invoke
if args_t[1] then return string.format ('https://plimsoll.southampton.gov.uk/shipdata/pdfs/%s/%s', args_t[1]:match ('(%d%d)%l%d%d%d%d'), -- get the year path portion from
--sclass}}
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]; local no_cat = 'yes'
if not class_name then -- when omitted, abandon with error message return error_msg_make ('missing', template, 'class name', no_cat); end
if not ship_type then -- when omitted, abandon with error message return error_msg_make ('missing', template, 'ship type', no_cat); end
if format then if tonumber (format) then -- if if not format or (3template:gsub ('/sandbox', ) then -- strip '/sandbox' if present; 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
format) then -- when format is omitted, same as format #3 table.insert (out_t, '-class
'); -- 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 '); table.insert (out_t, ship_type); table.insert (out_t, ']]'); end if 2
format then -- noun form; no ship type table.insert (out_t, ' class]]'); end if 5
----------------------------< E X P O R T S >----------------------------------------------------------------
return cite_danfs_title, -- external entry points for templates and invokes hnsa = hnsa, infobox_ship_career = infobox_ship_career, infobox_ship_characteristics = infobox_ship_characteristics, infobox_ship_class_overview = infobox_ship_class_overview, infobox_ship_flag = infobox_ship_flag, is_plimsoll_filename = is_plimsoll_filename, navsource = navsource, sclass = sclass, set_plimsoll_subtitle = set_plimsoll_subtitle, set_plimsoll_date = set_plimsoll_date, set_plimsoll_url = set_plimsoll_url, ship = ship, -- experiment ship_prefix_templates = ship_prefix_templates, -- experiment ship_name_format = ship_name_format, unbulleted_list = unbulleted_list, _infobox_ship_flag = _infobox_ship_flag, -- external entry points from another module _ship_name_format = do_ship_name_format, _synonym_check = synonym_check, _unbulleted_list = _unbulleted_list, .