Sətir 13: |
Sətir 13: |
| | | |
| local cfg; -- table of tables imported from selected Module:Citation/CS1/Configuration | | local cfg; -- table of tables imported from selected Module:Citation/CS1/Configuration |
− |
| |
− |
| |
− | --[[--------------------------< 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 = 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.
| |
− |
| |
− | ]]
| |
− |
| |
− | local function has_accept_as_written (str, allow_empty)
| |
− | local count;
| |
− | if true == allow_empty then
| |
− | str, count = str:gsub ('^%(%((.*)%)%)$', '%1'); -- allows (()) to be an empty set
| |
− | else
| |
− | str, count = str:gsub ('^%(%((.+)%)%)$', '%1');
| |
− | end
| |
− | return str, 0 ~= count;
| |
− | end
| |
| | | |
| | | |
Sətir 80: |
Sətir 58: |
| --[[--------------------------< E R R O R _ C O M M E N T >---------------------------------------------------- | | --[[--------------------------< E R R O R _ C O M M E N T >---------------------------------------------------- |
| | | |
− | Wraps error messages with CSS markup according to the state of hidden. | + | Wraps error messages with css markup according to the state of hidden. |
| | | |
| ]] | | ]] |
Sətir 91: |
Sətir 69: |
| --[=[-------------------------< M A K E _ W I K I L I N K >---------------------------------------------------- | | --[=[-------------------------< M A K E _ W I K I L I N K >---------------------------------------------------- |
| | | |
− | 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 bot 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, returns a wikilink in the form [[L]]; if neither are provided or link is omitted, returns an |
| empty string. | | empty string. |
Sətir 110: |
Sətir 88: |
| | | |
| | | |
− | --[[--------------------------< S E T _ M E S S A G E >---------------------------------------------------------- | + | --[[--------------------------< S E T _ E R R O R >-------------------------------------------------------------- |
| | | |
| Sets an error condition and returns the appropriate error message. The actual placement of the error message in the output is | | Sets an error condition and returns the appropriate error message. The actual placement of the error message in the output is |
| the responsibility of the calling function. | | the responsibility of the calling function. |
− |
| |
− | TODO: change z.error_categories and z.maintenance_cats to have the form cat_name = true; to avoid dups without having to have an extra cat
| |
| | | |
| ]] | | ]] |
− | local added_maint_cats = {} -- list of maintenance categories that have been added to z.maintenance_cats; TODO: figure out how to delete this table
| |
| | | |
− | local function set_message (error_id, arguments, raw, prefix, suffix) | + | local function set_error( error_id, arguments, raw, prefix, suffix ) |
− | local error_state = cfg.error_conditions[error_id]; | + | local error_state = cfg.error_conditions[ error_id ]; |
| | | |
| prefix = prefix or ""; | | prefix = prefix or ""; |
Sətir 127: |
Sətir 102: |
| | | |
| 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'] ); -- because missing error handler in Module:Citation/CS1/Configuration |
− | | + | elseif is_set( error_state.category ) then |
− | elseif is_set (error_state.category) then | + | table.insert( z.error_categories, error_state.category ); |
− | if error_state.message then -- when error_state.message defined, this is an error message | |
− | table.insert( z.error_categories, error_state.category );
| |
− | else
| |
− | if not added_maint_cats[error_id] then
| |
− | added_maint_cats[error_id] = true; -- note that we've added this category
| |
− | table.insert (z.maintenance_cats, substitute (error_state.category, arguments)); -- make cat name then add to table
| |
− | end
| |
− | return; -- because no message, nothing more to do
| |
− | end
| |
| end | | end |
− | | + | |
| local message = substitute( error_state.message, arguments ); | | local message = substitute( error_state.message, arguments ); |
| | | |
Sətir 158: |
Sətir 124: |
| }); | | }); |
| | | |
− | z.error_ids[error_id] = true; | + | z.error_ids[ error_id ] = true; |
− | if z.error_ids['err_citation_missing_title'] and -- if missing-title error already noted | + | if in_array( error_id, { 'bare_url_missing_title', 'trans_missing_title' } ) |
− | in_array (error_id, {'err_bare_url_missing_title', 'err_trans_missing_title'}) then -- and this error is one of these
| + | and z.error_ids['citation_missing_title'] then |
− | return '', false; -- don't bother because one flavor of missing title is sufficient
| + | return '', false; |
| end | | end |
| | | |
− | message = table.concat ({ prefix, message, suffix }); | + | message = table.concat({ prefix, message, suffix }); |
− | | + | |
| if raw == true then | | if raw == true then |
| return message, error_state.hidden; | | return message, error_state.hidden; |
| end | | end |
− | | + | |
− | return error_comment (message, error_state.hidden); | + | return error_comment( message, error_state.hidden ); |
| end | | end |
| | | |
Sətir 183: |
Sətir 149: |
| alias – one of the list of possible aliases in the aliases lists from Module:Citation/CS1/Configuration | | alias – one of the list of possible aliases in the aliases lists from Module:Citation/CS1/Configuration |
| index – for enumerated parameters, identifies which one | | index – for enumerated parameters, identifies which one |
− | enumerated – true/false flag used to choose how enumerated aliases are examined | + | 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 | | 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 | | selected – the alias that has previously been selected; nil if not yet selected |
Sətir 229: |
Sətir 195: |
| ]] | | ]] |
| | | |
| + | local added_maint_cats = {} -- list of maintenance categories that have been added to z.maintenance_cats |
| local function add_maint_cat (key, arguments) | | local function add_maint_cat (key, arguments) |
| 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
| |
− |
| |
− |
| |
− | --[[--------------------------< A D D _ P R O P _ C A T >--------------------------------------------------------
| |
− |
| |
− | Adds a category to z.properties_cats using names from the configuration file with additional text if any.
| |
− |
| |
− | foreign_lang_source and foreign_lang_source_2 keys have a language code appended to them so that multiple languages
| |
− | may be categorized but multiples of the same language are not categorized.
| |
− |
| |
− | added_prop_cats is a table declared in page scope variables above
| |
− |
| |
− | ]]
| |
− |
| |
− | local added_prop_cats = {}; -- list of property categories that have been added to z.properties_cats
| |
− |
| |
− | local function add_prop_cat (key, arguments)
| |
− | if not added_prop_cats [key] then
| |
− | 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
| |
− | table.insert( z.properties_cats, substitute (cfg.prop_cats [key], arguments)); -- make name then add to table
| |
| end | | end |
| end | | end |
Sətir 298: |
Sətir 243: |
| | | |
| return substitute( cfg.presentation[key], {str} ); | | return substitute( cfg.presentation[key], {str} ); |
− | end
| |
− |
| |
− |
| |
− | --[[--------------------------< M A K E _ S E P _ L I S T >------------------------------------------------------------
| |
− |
| |
− | make a separated list of items using provided separators.
| |
− | <sep_list> - typically '<comma><space>'
| |
− | <sep_list_pair> - typically '<space>and<space>'
| |
− | <sep_list_end> - typically '<comma><space>and<space>' or '<comma><space>&<space>'
| |
− |
| |
− | defaults to cfg.presentation['sep_list'], cfg.presentation['sep_list_pair'], and cfg.presentation['sep_list_end']
| |
− | if <sep_list_end> is specified, <sep_list> and <sep_list_pair> must also be supplied
| |
− |
| |
− | ]]
| |
− |
| |
− | local function make_sep_list (count, list_seq, sep_list, sep_list_pair, sep_list_end)
| |
− | local list = '';
| |
− |
| |
− | if not sep_list then -- set the defaults
| |
− | sep_list = cfg.presentation['sep_list'];
| |
− | sep_list_pair = cfg.presentation['sep_list_pair'];
| |
− | sep_list_end = cfg.presentation['sep_list_end'];
| |
− | end
| |
− |
| |
− | if 2 >= count then
| |
− | 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
| |
− | 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
| |
− | end
| |
− |
| |
− | return list;
| |
| end | | end |
| | | |
Sətir 346: |
Sətir 259: |
| ]] | | ]] |
| | | |
− | local function select_one (args, aliases_list, error_condition, index) | + | local function select_one( args, aliases_list, error_condition, index ) |
| local value = nil; -- the value assigned to the selected parameter | | local value = nil; -- the value assigned to the selected parameter |
| local selected = ''; -- the name of the parameter we have chosen | | local selected = ''; -- the name of the parameter we have chosen |
Sətir 358: |
Sətir 271: |
| value, selected = is_alias_used (args, alias, index, false, value, selected, error_list); -- first test for non-enumerated alias | | value, selected = is_alias_used (args, alias, index, false, value, selected, error_list); -- first test for non-enumerated alias |
| end | | end |
− | 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 |
| | | |
| if #error_list > 0 and 'none' ~= error_condition then -- for cases where this code is used outside of extract_names() | | if #error_list > 0 and 'none' ~= error_condition then -- for cases where this code is used outside of extract_names() |
− | for i, v in ipairs (error_list) do | + | local error_str = ""; |
− | error_list[i] = wrap_style ('parameter', v); | + | 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 | | end |
− | table.insert (error_list, wrap_style ('parameter', selected)); | + | error_str = error_str .. wrap_style ('parameter', selected); |
− | table.insert (z.message_tail, {set_message (error_condition, {make_sep_list (#error_list, error_list)}, true)}); | + | table.insert( z.message_tail, { set_error( error_condition, {error_str}, true ) } ); |
| end | | end |
| | | |
Sətir 382: |
Sətir 302: |
| The str:gsub() returns either A|B froma [[A|B]] or B from [[B]] or B from B (no wikilink markup). | | The str:gsub() returns either A|B froma [[A|B]] or B from [[B]] or B from B (no wikilink markup). |
| | | |
− | In l(), l:gsub() removes the link and pipe (if they exist); the second :gsub() trims whitespace from the label | + | In l(), l:gsub() removes the link and pipe (if they exist); the second :gsub() trims white space from the label |
| if str was wrapped in wikilink markup. Presumably, this is because without wikimarkup in str, there is no match | | if str was wrapped in wikilink markup. Presumably, this is because without wikimarkup in str, there is no match |
| in the initial gsub, the replacement function l() doesn't get called. | | in the initial gsub, the replacement function l() doesn't get called. |
Sətir 397: |
Sətir 317: |
| --[=[-------------------------< I S _ W I K I L I N K >-------------------------------------------------------- | | --[=[-------------------------< I S _ W I K I L I N K >-------------------------------------------------------- |
| | | |
− | Determines if str is a wikilink, extracts, and returns the wikilink type, link text, and display text parts. | + | Determines if str is a wikilink, extracts, and returns the the wikilink type, link text, and display text parts. |
| If str is a complex wikilink ([[L|D]]): | | If str is a complex wikilink ([[L|D]]): |
| returns wl_type 2 and D and L from [[L|D]]; | | returns wl_type 2 and D and L from [[L|D]]; |
Sətir 405: |
Sətir 325: |
| returns wl_type 0, str as D, and L as empty string. | | returns wl_type 0, str as D, and L as empty string. |
| | | |
− | trims leading and trailing whitespace and pipes from L and D ([[L|]] and [[|D]] are accepted by MediaWiki and | + | trims leading and trailing white space and pipes from L and D ([[L|]] and [[|D]] are accepted by MediaWiki and |
| treated like [[D]]; while [[|D|]] is not accepted by MediaWiki, here, we accept it and return D without the pipes). | | treated like [[D]]; while [[|D|]] is not accepted by MediaWiki, here, we accept it and return D without the pipes). |
| | | |
Sətir 414: |
Sətir 334: |
| local wl_type = 2; -- assume that str is a complex wikilink [[L|D]] | | local wl_type = 2; -- assume that str is a complex wikilink [[L|D]] |
| | | |
− | if not str:match ('^%[%[[^%]]+%]%]$') then -- is str some sort of a wikilink (must have some sort of content)
| |
− | return 0, str, ''; -- not a wikilink; return wl_type as 0, str as D, and empty string as L
| |
− | end
| |
− |
| |
| L, D = str:match ('^%[%[([^|]+)|([^%]]+)%]%]$'); -- get L and D from [[L|D]] | | L, D = str:match ('^%[%[([^|]+)|([^%]]+)%]%]$'); -- get L and D from [[L|D]] |
| | | |
− | if not is_set (D) then -- if no separate display | + | if not is_set (D) then -- if no separate link |
− | D = str:match ('^%[%[([^%]]*)|*%]%]$'); -- get D from [[D]] or [[D|]] | + | D = str:match ('^%[%[([^%]]*)|*%]%]$'); -- get D from [[D]] |
| wl_type = 1; | | wl_type = 1; |
| + | end |
| + | |
| + | if not is_set (D) then -- no wikilink markup |
| + | D = str; -- return the string as D |
| + | wl_type = 0; -- but say that it is not a wikilink |
| end | | end |
| | | |
| D = mw.text.trim (D, '%s|'); -- trim white space and pipe characters | | D = mw.text.trim (D, '%s|'); -- trim white space and pipe characters |
| + | L = L and mw.text.trim (L, '%s|'); |
| + | |
| return wl_type, D, L or ''; | | return wl_type, D, L or ''; |
| end | | end |
Sətir 486: |
Sətir 409: |
| | | |
| return { | | return { |
− | add_maint_cat = add_maint_cat, -- exported functions | + | is_set = is_set, -- exported functions |
− | add_prop_cat = add_prop_cat, | + | in_array = in_array, |
| + | substitute = substitute, |
| error_comment = error_comment, | | error_comment = error_comment, |
− | has_accept_as_written = has_accept_as_written, | + | set_error = set_error, |
− | in_array = in_array, | + | select_one = select_one, |
− | is_set = is_set, | + | add_maint_cat = add_maint_cat, |
| + | wrap_style = wrap_style, |
| + | safe_for_italics = safe_for_italics, |
| + | remove_wiki_link = remove_wiki_link, |
| is_wikilink = is_wikilink, | | is_wikilink = is_wikilink, |
− | make_sep_list = make_sep_list,
| |
| make_wikilink = make_wikilink, | | make_wikilink = make_wikilink, |
− | remove_wiki_link = remove_wiki_link,
| |
− | safe_for_italics = safe_for_italics,
| |
− | select_one = select_one,
| |
− | set_message = set_message,
| |
| set_selected_modules = set_selected_modules, | | set_selected_modules = set_selected_modules, |
| strip_apostrophe_markup = strip_apostrophe_markup, | | strip_apostrophe_markup = strip_apostrophe_markup, |
− | substitute = substitute,
| |
− | wrap_style = wrap_style,
| |
− |
| |
| z = z, -- exported table | | z = z, -- exported table |
| } | | } |