Module:Citation/CS1/Utilities: Difference between revisions
sync from sandbox;
(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 | |||
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 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) and link ~= display then | |||
return table.concat ({'[[', link, '|', display, ']]'}); | |||
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 | ||
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 | ||
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; |