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 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 | |||
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 | After futher 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 | link is provided, returns a wikilink in the form [[L]]; if neither are provided or link is omitted, returns an | ||
provided or link is omitted, returns an empty string. | empty string. | ||
]=] | ]=] | ||
local function make_wikilink (link, display) | local function make_wikilink (link, display) | ||
if | if is_set (link) then | ||
if is_set (display) then | |||
return table.concat ({'[[', link, '|', display, ']]'}); | |||
else | |||
return table.concat ({'[[', link, ']]'}); | |||
end | |||
else | else | ||
return | return ''; | ||
end | end | ||
end | end | ||
Line 121: | Line 123: | ||
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 139: | Line 141: | ||
end | end | ||
local message = substitute (error_state.message, arguments); | local message = substitute( error_state.message, arguments ); | ||
message = table.concat ( | message = table.concat ( | ||
Line 162: | Line 164: | ||
end | end | ||
message = table.concat ({prefix, message, suffix}); | message = table.concat ({ prefix, message, suffix }); | ||
if raw == true then | if raw == true then | ||
Line 199: | Line 201: | ||
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 211: | ||
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 230: | Line 232: | ||
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 252: | Line 254: | ||
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 267: | Line 269: | ||
]] | ]] | ||
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></span>" .. str; end | |||
if str:sub(-1,-1) == "'" then str = str .. "<span></span>"; end | |||
-- Remove newlines as they break italics. | |||
return str:gsub( '\n', ' ' ); | |||
end | |||
end | end | ||
Line 288: | Line 291: | ||
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 322: | Line 325: | ||
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 350: | Line 353: | ||
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 357: | Line 360: | ||
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 386: | Line 389: | ||
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 450: | Line 453: | ||
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; |