Module:Citation/CS1/Utilities: Difference between revisions
Jump to navigation
Jump to search
Content deleted Content added
No edit summary |
No edit summary |
||
Line 96: | Line 96: | ||
return error_comment( message, error_state.hidden ); |
return error_comment( message, error_state.hidden ); |
||
end |
end |
||
--[[-------------------------< I S _ A L I A S _ U S E D >----------------------------------------------------- |
|||
This function is used by select_one() to determine if one of a list of alias parameters is in the argument list |
|||
provided by the template. |
|||
Input: |
|||
args – pointer to the arguments table from calling template |
|||
alias – one of the list of possible aliases in the aliases lists from Module:Citation/CS1/Configuration |
|||
index – for enumerated parameters, identifies which one |
|||
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 |
|||
selected – the alias that has previously been selected; nil if not yet selected |
|||
error_list – list of aliases that are duplicates of the alias already selected |
|||
Returns: |
|||
value – value associated with alias we selected or that was previously selected or nil if an alias not yet selected |
|||
selected – the alias we selected or the alias that was previously selected or nil if an alias not yet selected |
|||
]] |
|||
local function is_alias_used (args, alias, index, enumerated, value, selected, error_list) |
|||
if enumerated then -- is this a test for an enumerated parameters? |
|||
alias = alias:gsub ('#', index); -- replace '#' with the value in index |
|||
else |
|||
alias = alias:gsub ('#', ''); -- remove '#' if it exists |
|||
end |
|||
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 |
|||
local skip; |
|||
for _, v in ipairs(error_list) do -- spin through the error list to see if we've added this alias |
|||
if v == alias then |
|||
skip = true; |
|||
break; -- has been added so stop looking |
|||
end |
|||
end |
|||
if not skip then -- has not been added so |
|||
table.insert( error_list, alias ); -- add error alias to the error list |
|||
end |
|||
else |
|||
value = args[alias]; -- not yet selected an alias, so select this one |
|||
selected = alias; |
|||
end |
|||
end |
|||
return value, selected; -- return newly selected alias, or previously selected alias |
|||
end |
|||
--[[--------------------------< S E L E C T _ O N E >---------------------------------------------------------- |
|||
Chooses one matching parameter from a list of parameters to consider. The list of parameters to consider is just |
|||
names. For parameters that may be enumerated, the position of the numerator in the parameter name is identified |
|||
by the '#' so |author-last1= and |author1-last= are represented as 'author-last#' and 'author#-last'. |
|||
Because enumerated parameter |<param>1= is an alias of |<param>= we must test for both possibilities. |
|||
Generates an error if more than one match is present. |
|||
]] |
|||
local function select_one( args, aliases_list, error_condition, index ) |
|||
local value = nil; -- the value assigned to the selected parameter |
|||
local selected = ''; -- the name of the parameter we have chosen |
|||
local error_list = {}; |
|||
if index ~= nil then index = tostring(index); end |
|||
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 '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 |
|||
end |
|||
value, selected = is_alias_used (args, alias, index, true, value, selected, error_list); -- test for enumerated alias |
|||
else |
|||
value, selected = is_alias_used (args, alias, index, false, value, selected, error_list); --test for non-enumerated alias |
|||
end |
|||
end |
|||
if #error_list > 0 and 'none' ~= error_condition then -- for cases where this code is used outside of extract_names() |
|||
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 |
|||
if #error_list > 1 then |
|||
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 |
|||
return value, selected; |
|||
end |
|||
return { -- return exported functions and tables |
return { -- return exported functions and tables |
||
Line 103: | Line 201: | ||
error_comment = error_comment, |
error_comment = error_comment, |
||
set_error = set_error, |
set_error = set_error, |
||
select_one = select_one, |
|||
z = z, |
z = z, |
||
} |
} |