Editing Module:Citation/CS1/Utilities
The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then publish the changes below to finish undoing the edit.
Latest revision | Your text | ||
Line 1: | Line 1: | ||
require('Module:No globals'); | |||
--[[ | |||
History of changes since last sync: 2015-12-12 | |||
]] | |||
local u = {} | |||
local z = { | local z = { | ||
Line 8: | Line 15: | ||
}; | }; | ||
local cfg; | |||
local cfg; | |||
--[[--------------------------< I S _ S E T >------------------------------------------------------------------ | --[[--------------------------< 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. | Returns true if argument is set; false otherwise. Argument is 'set' when it exists (not nil) or when it is not an empty string. | ||
This function is global because it is called from both this module and from Date validation | |||
]] | ]] | ||
local function is_set( var ) | |||
local function is_set (var) | |||
return not (var == nil or var == ''); | return not (var == nil or var == ''); | ||
end | end | ||
Line 54: | Line 34: | ||
]] | ]] | ||
local function in_array (needle, haystack) | local function in_array( needle, haystack ) | ||
if needle == nil then | if needle == nil then | ||
return false; | return false; | ||
end | end | ||
for n, v in ipairs (haystack) do | for n,v in ipairs( haystack ) do | ||
if v == needle then | if v == needle then | ||
return n; | return n; | ||
Line 73: | Line 53: | ||
]] | ]] | ||
local function substitute (msg, args) | local function substitute( msg, args ) | ||
return args and mw.message.newRawMessage (msg, args):plain() or msg; | return args and mw.message.newRawMessage( msg, args ):plain() or msg; | ||
end | end | ||
Line 80: | Line 60: | ||
--[[--------------------------< E R R O R _ C O M M E N T >---------------------------------------------------- | --[[--------------------------< E R R O R _ C O M M E N T >---------------------------------------------------- | ||
Wraps error messages with | Wraps error messages with css markup according to the state of hidden. | ||
]] | ]] | ||
local function error_comment( content, hidden ) | |||
local function error_comment (content, hidden) | return substitute( hidden and cfg.presentation['hidden-error'] or cfg.presentation['visible-error'], content ); | ||
return substitute (hidden and cfg.presentation['hidden-error'] or cfg.presentation['visible-error'], content); | |||
end | end | ||
--[ | --[[--------------------------< S E T _ E R R O R >-------------------------------------------------------------- | ||
Sets an error condition and returns the appropriate error message. The actual placement of the error message in the output is | Sets an error condition and returns the appropriate error message. The actual placement of the error message in the output is | ||
the responsibility of the calling function. | the responsibility of the calling function. | ||
]] | ]] | ||
local function set_error( error_id, arguments, raw, prefix, suffix ) | |||
local error_state = cfg.error_conditions[ error_id ]; | |||
local function | |||
local error_state = cfg.error_conditions[error_id]; | |||
prefix = prefix or | prefix = prefix or ""; | ||
suffix = suffix or | suffix = suffix or ""; | ||
if error_state == nil then | if error_state == nil then | ||
error (cfg.messages['undefined_error'] | error( cfg.messages['undefined_error'] ); | ||
elseif is_set( error_state.category ) then | |||
elseif is_set (error_state.category) then | table.insert( z.error_categories, error_state.category ); | ||
end | end | ||
local message = substitute (error_state.message, arguments); | local message = substitute( error_state.message, arguments ); | ||
message = | message = message .. " ([[" .. cfg.messages['help page link'] .. | ||
"#" .. error_state.anchor .. "|" .. | |||
cfg.messages['help page label'] .. "]])"; | |||
z.error_ids[ error_id ] = true; | |||
if in_array( error_id, { 'bare_url_missing_title', 'trans_missing_title' } ) | |||
and z.error_ids['citation_missing_title'] then | |||
return '', false; | |||
z.error_ids[error_id] = true; | |||
if | |||
end | end | ||
message = table.concat ({prefix, message, suffix}); | message = table.concat({ prefix, message, suffix }); | ||
if raw == true then | if raw == true then | ||
return message, error_state.hidden; | return message, error_state.hidden; | ||
end | end | ||
return error_comment (message, error_state.hidden); | return error_comment( message, error_state.hidden ); | ||
end | end | ||
Line 181: | Line 117: | ||
alias – one of the list of possible aliases in the aliases lists from Module:Citation/CS1/Configuration | alias – one of the list of possible aliases in the aliases lists from Module:Citation/CS1/Configuration | ||
index – for enumerated parameters, identifies which one | index – for enumerated parameters, identifies which one | ||
enumerated – true/false flag used | enumerated – true/false flag used choose how enumerated aliases are examined | ||
value – value associated with an alias that has previously been selected; nil if not yet selected | value – value associated with an alias that has previously been selected; nil if not yet selected | ||
selected – the alias that has previously been selected; nil if not yet selected | selected – the alias that has previously been selected; nil if not yet selected | ||
Line 199: | Line 135: | ||
end | end | ||
if is_set (args[alias]) then -- alias is in the template's argument list | if is_set(args[alias]) then -- alias is in the template's argument list | ||
if value ~= nil and selected ~= alias then -- if we have already selected one of the aliases | if value ~= nil and selected ~= alias then -- if we have already selected one of the aliases | ||
local skip; | local skip; | ||
for _, v in ipairs (error_list) do -- spin through the error list to see if we've added this alias | for _, v in ipairs(error_list) do -- spin through the error list to see if we've added this alias | ||
if v == alias then | if v == alias then | ||
skip = true; | skip = true; | ||
Line 209: | Line 145: | ||
end | end | ||
if not skip then -- has not been added so | if not skip then -- has not been added so | ||
table.insert (error_list, alias); -- add error alias to the error list | table.insert( error_list, alias ); -- add error alias to the error list | ||
end | end | ||
else | else | ||
Line 227: | Line 163: | ||
]] | ]] | ||
local added_maint_cats = {} -- list of maintenance categories that have been added to z.maintenance_cats | |||
local function add_maint_cat (key, arguments) | local function add_maint_cat (key, arguments) | ||
if not added_maint_cats [key] then | if not added_maint_cats [key] then | ||
added_maint_cats [key] = true; -- note that we've added this category | added_maint_cats [key] = true; -- note that we've added this category | ||
table.insert (z.maintenance_cats, substitute (cfg.maint_cats | table.insert( z.maintenance_cats, substitute (cfg.maint_cats [key], arguments)); -- make name then add to table | ||
end | end | ||
end | end | ||
Line 267: | Line 182: | ||
]] | ]] | ||
local function safe_for_italics (str) | local function safe_for_italics( str ) | ||
if not is_set (str) then return str | if not is_set(str) then | ||
return str; | |||
else | |||
if str:sub(1,1) == "'" then str = "<span />" .. str; end | |||
if str:sub(-1,-1) == "'" then str = str .. "<span />"; end | |||
-- Remove newlines as they break italics. | |||
return str:gsub( '\n', ' ' ); | |||
end | |||
end | end | ||
Line 288: | Line 204: | ||
local function wrap_style (key, str) | local function wrap_style (key, str) | ||
if not is_set (str) then | if not is_set( str ) then | ||
return ""; | return ""; | ||
elseif in_array (key, {'italic-title', 'trans-italic-title'}) then | elseif in_array( key, { 'italic-title', 'trans-italic-title' } ) then | ||
str = safe_for_italics (str); | str = safe_for_italics( str ); | ||
end | end | ||
return substitute (cfg.presentation[key], {str}) | return substitute( cfg.presentation[key], {str} ); | ||
end | end | ||
Line 343: | Line 227: | ||
]] | ]] | ||
local function select_one (args, aliases_list, error_condition, index) | local function select_one( args, aliases_list, error_condition, index ) | ||
local value = nil; -- the value assigned to the selected parameter | local value = nil; -- the value assigned to the selected parameter | ||
local selected = ''; -- the name of the parameter we have chosen | local selected = ''; -- the name of the parameter we have chosen | ||
Line 350: | Line 234: | ||
if index ~= nil then index = tostring(index); end | if index ~= nil then index = tostring(index); end | ||
for _, alias in ipairs (aliases_list) do -- for each alias in the aliases list | for _, alias in ipairs( aliases_list ) do -- for each alias in the aliases list | ||
if alias:match ('#') then -- if this alias can be enumerated | if alias:match ('#') then -- if this alias can be enumerated | ||
if '1' == index then -- when index is 1 test for enumerated and non-enumerated aliases | if '1' == index then -- when index is 1 test for enumerated and non-enumerated aliases | ||
value, selected = is_alias_used (args, alias, index, false, value, selected, error_list); -- first test for non-enumerated alias | value, selected = is_alias_used (args, alias, index, false, value, selected, error_list); -- first test for non-enumerated alias | ||
end | end | ||
value, selected = is_alias_used (args, alias, index, true, value, selected, error_list); -- test for enumerated alias | value, selected = is_alias_used (args, alias, index, true, value, selected, error_list); -- test for enumerated alias | ||
else | else | ||
value, selected = is_alias_used (args, alias, index, false, value, selected, error_list); -- test for non-enumerated alias | value, selected = is_alias_used (args, alias, index, false, value, selected, error_list); --test for non-enumerated alias | ||
end | end | ||
end | end | ||
if #error_list > 0 and 'none' ~= error_condition then -- for cases where this code is used outside of extract_names() | if #error_list > 0 and 'none' ~= error_condition then -- for cases where this code is used outside of extract_names() | ||
for | local error_str = ""; | ||
for _, k in ipairs( error_list ) do | |||
if error_str ~= "" then error_str = error_str .. cfg.messages['parameter-separator'] end | |||
error_str = error_str .. wrap_style ('parameter', k); | |||
end | end | ||
if #error_list > 1 then | |||
table.insert (z.message_tail, { | error_str = error_str .. cfg.messages['parameter-final-separator']; | ||
else | |||
error_str = error_str .. cfg.messages['parameter-pair-separator']; | |||
end | |||
error_str = error_str .. wrap_style ('parameter', selected); | |||
table.insert( z.message_tail, { set_error( error_condition, {error_str}, true ) } ); | |||
end | end | ||
return value, selected; | return value, selected; | ||
end | end | ||
Line 475: | Line 272: | ||
local function set_selected_modules (cfg_table_ptr) | local function set_selected_modules (cfg_table_ptr) | ||
cfg = cfg_table_ptr; | cfg = cfg_table_ptr; | ||
end | end | ||
return { | return { -- return exported functions and tables | ||
is_set = is_set, | |||
in_array = in_array, | |||
substitute = substitute, | |||
error_comment = error_comment, | error_comment = error_comment, | ||
set_error = set_error, | |||
select_one = select_one, | select_one = select_one, | ||
add_maint_cat = add_maint_cat, | |||
wrap_style = wrap_style; | |||
safe_for_italics = safe_for_italics; | |||
set_selected_modules = set_selected_modules; | |||
z = z, | |||
z = z, | |||
} | } |