Module:Citation/CS1/Utilities: Difference between revisions

    m>Trappist the monk
    No edit summary
    m>Trappist the monk
    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,
    }
    }