Module:Citation/CS1/Utilities: Difference between revisions

    (sync from sandbox;)
    (sync from sandbox;)
    Line 17: Line 17:
    --[[--------------------------< H A S _ A C C E P T _ A S _ W R I T T E N >------------------------------------
    --[[--------------------------< H A S _ A C C E P T _ A S _ W R I T T E N >------------------------------------


    when <str> is wholly wrapped in accept-as-written markup, return <str> without markup and true; return <str> and false else
    When <str> is wholly wrapped in accept-as-written markup, return <str> without markup and true; return <str> and false else


    with allow_empty = false, <str> must have at least one character inside the markup
    with allow_empty = false, <str> must have at least one character inside the markup
    with allow_empty = true, <str> the markup frame can be empty like (()) to distinguish an empty template parameter from the specific condition "has no applicable value" in citation-context.
    with allow_empty = true, <str> the markup frame can be empty like (()) to distinguish an empty template parameter from the specific condition "has no applicable value" in citation-context.


    After futher evaluation the two cases might be merged at a later stage, but should be kept separated for now.
    After further evaluation the two cases might be merged at a later stage, but should be kept separated for now.


    ]]
    ]]
    Line 43: Line 43:
    ]]
    ]]


    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 54:
    ]]
    ]]


    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 73:
    ]]
    ]]


    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 84: Line 84:
    ]]
    ]]


    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


    Line 92: Line 92:


    Makes a wikilink; when both link and display text is provided, returns a wikilink in the form [[L|D]]; if only
    Makes a wikilink; when both link and display text is provided, returns a wikilink in the form [[L|D]]; if only
    link is provided, returns a wikilink in the form [[L]]; if neither are provided or link is omitted, returns an
    link is provided (or link and display are the same), returns a wikilink in the form [[L]]; if neither are
    empty string.
    provided or link is omitted, returns an empty string.


    ]=]
    ]=]


    local function make_wikilink (link, display)
    local function make_wikilink (link, display)
    if is_set (link) then
    if not is_set (link) then return '' end
    if is_set (display) then
     
    return table.concat ({'[[', link, '|', display, ']]'});
    if is_set (display) and link ~= display then
    else
    return table.concat ({'[[', link, '|', display, ']]'});
    return table.concat ({'[[', link, ']]'});
    end
    else
    else
    return '';
    return table.concat ({'[[', link, ']]'});
    end
    end
    end
    end
    Line 123: Line 121:
    local error_state = cfg.error_conditions[error_id];
    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_id ); -- because missing error handler in Module:Citation/CS1/Configuration
    error (cfg.messages['undefined_error'] .. ': ' .. error_id); -- because missing error handler in Module:Citation/CS1/Configuration


    elseif is_set (error_state.category) then
    elseif is_set (error_state.category) then
    if error_state.message then -- when error_state.message defined, this is an error message
    if error_state.message then -- when error_state.message defined, this is an error message
    table.insert( z.error_categories, error_state.category );
    table.insert (z.error_categories, error_state.category);
    else
    else
    if not added_maint_cats[error_id] then
    if not added_maint_cats[error_id] then
    Line 141: Line 139:
    end
    end


    local message = substitute( error_state.message, arguments );
    local message = substitute (error_state.message, arguments);


    message = table.concat (
    message = table.concat (
    Line 164: Line 162:
    end
    end
    message = table.concat ({ prefix, message, suffix });
    message = table.concat ({prefix, message, suffix});


    if raw == true then
    if raw == true then
    Line 201: Line 199:
    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 211: Line 209:
    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 232: Line 230:
    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 [key], arguments)); -- make name then add to table
    table.insert (z.maintenance_cats, substitute (cfg.maint_cats [key], arguments)); -- make name then add to table
    end
    end
    end
    end
    Line 254: Line 252:
    added_prop_cats [key] = true; -- note that we've added this category
    added_prop_cats [key] = true; -- note that we've added this category
    key = key:gsub ('(foreign_lang_source_?2?)%a%a%a?[%a%-]*', '%1'); -- strip lang code from keyname
    key = key:gsub ('(foreign_lang_source_?2?)%a%a%a?[%a%-]*', '%1'); -- strip lang code from keyname
    table.insert( z.properties_cats, substitute (cfg.prop_cats [key], arguments)); -- make name then add to table
    table.insert (z.properties_cats, substitute (cfg.prop_cats [key], arguments)); -- make name then add to table
    end
    end
    end
    end
    Line 269: Line 267:
    ]]
    ]]


    local function safe_for_italics( str )
    local function safe_for_italics (str)
    if not is_set(str) then
    if not is_set (str) then return str end
    return str;
     
    else
    if str:sub (1, 1) == "'" then str = "<span></span>" .. str; end
    if str:sub(1,1) == "'" then str = "<span></span>" .. str; end
    if str:sub (-1, -1) == "'" then str = str .. "<span></span>"; end
    if str:sub(-1,-1) == "'" then str = str .. "<span></span>"; end
    -- Remove newlines as they break italics.
    -- Remove newlines as they break italics.
    return str:gsub ('\n', ' ');
    return str:gsub( '\n', ' ' );
     
    end
    end
    end


    Line 291: Line 288:


    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 325: Line 322:
    list = table.concat (list_seq, sep_list_pair); -- insert separator between two items; returns list_seq[1] then only one item
    list = table.concat (list_seq, sep_list_pair); -- insert separator between two items; returns list_seq[1] then only one item
    elseif 2 < count then
    elseif 2 < count then
    list = table.concat (list_seq, sep_list, 1, count-1); -- concatenate all but last item with plain list separator
    list = table.concat (list_seq, sep_list, 1, count - 1); -- concatenate all but last item with plain list separator
    list = table.concat ({list, list_seq[count]}, sep_list_end); -- concatenate last item onto end of <list> with final separator
    list = table.concat ({list, list_seq[count]}, sep_list_end); -- concatenate last item onto end of <list> with final separator
    end
    end
    Line 353: Line 350:
    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
    Line 360: Line 357:
    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
    Line 389: Line 386:


    local function remove_wiki_link (str)
    local function remove_wiki_link (str)
    return (str:gsub( "%[%[([^%[%]]*)%]%]", function(l)
    return (str:gsub ("%[%[([^%[%]]*)%]%]", function(l)
    return l:gsub( "^[^|]*|(.*)$", "%1" ):gsub("^%s*(.-)%s*$", "%1");
    return l:gsub ("^[^|]*|(.*)$", "%1" ):gsub ("^%s*(.-)%s*$", "%1");
    end));
    end));
    end
    end
    Line 453: Line 450:
    local flag;
    local flag;
    while true do
    while true do
    if argument:find ( "'''''", 1, true ) then -- bold italic (5)
    if argument:find ("'''''", 1, true) then -- bold italic (5)
    argument, flag=argument:gsub("%'%'%'%'%'", ""); -- remove all instances of it
    argument, flag = argument:gsub ("%'%'%'%'%'", ""); -- remove all instances of it
    elseif argument:find ( "''''", 1, true ) then -- italic start and end without content (4)
    elseif argument:find ("''''", 1, true) then -- italic start and end without content (4)
    argument, flag=argument:gsub("%'%'%'%'", "");
    argument, flag=argument:gsub ("%'%'%'%'", "");
    elseif argument:find ( "'''", 1, true ) then -- bold (3)
    elseif argument:find ("'''", 1, true) then -- bold (3)
    argument, flag=argument:gsub("%'%'%'", "");
    argument, flag=argument:gsub ("%'%'%'", "");
    elseif argument:find ( "''", 1, true ) then -- italic (2)
    elseif argument:find ("''", 1, true) then -- italic (2)
    argument, flag=argument:gsub("%'%'", "");
    argument, flag = argument:gsub ("%'%'", "");
    else
    else
    break;
    break;