| Line 1: |
Line 1: |
| − | require('Module:No globals'); | + | require('strict'); |
| | local getArgs = require ('Module:Arguments').getArgs; | | local getArgs = require ('Module:Arguments').getArgs; |
| | | | |
| Line 172: |
Line 172: |
| | 2char – list of ISO 639-1 codes and names sorted by code | | 2char – list of ISO 639-1 codes and names sorted by code |
| | 3char – list of ISO 639-2, -3 codes and names sorted by code | | 3char – list of ISO 639-2, -3 codes and names sorted by code |
| − | ietf – list of IETF language tags and names sorted by tag -- partial support for these by cs1|2 |language= parameter | + | ietf – list of IETF language tags and names sorted by tag |
| − | name – list of language names and codes sorted by name -- IETF tags omitted because not supported by cs1|2 |language= parameter | + | ietf2 – list of ISO 639-1 based IETF language tags and names sorted by tag |
| | + | ietf3 – list of list of ISO 639-2, -3 based IETF language tags and names sorted by tag |
| | + | name – list of language names and codes sorted by name |
| | all - list all language codes/tags and names sorted by code/tag | | all - list all language codes/tags and names sorted by code/tag |
| | | | |
| Line 189: |
Line 191: |
| | local code_2_list={}; | | local code_2_list={}; |
| | local ietf_list={}; | | local ietf_list={}; |
| | + | local ietf_list2={}; |
| | + | local ietf_list3={}; |
| | local name_list={}; | | local name_list={}; |
| | | | |
| − | if not ({['2char']=true, ['3char']=true, ['ietf']=true, ['name']=true, ['all']=true})[frame.args.list] then | + | if not ({['2char']=true, ['3char']=true, ['ietf']=true, ['ietf2']=true, ['ietf3']=true, ['name']=true, ['all']=true})[frame.args.list] then |
| − | return '<span style="font-size:100%" class="error">unknown list selector: ' .. frame.args.list .. '</span>'; | + | return '<span style="color:#d33">unknown list selector: ' .. frame.args.list .. '</span>'; |
| | end | | end |
| | | | |
| Line 202: |
Line 206: |
| | elseif 3 == code:len() then | | elseif 3 == code:len() then |
| | add_to_list (code_2_list, name_list, override, code, name); | | add_to_list (code_2_list, name_list, override, code, name); |
| − | else -- ietf codes only partically supported by cs1|2 |language= parameter | + | elseif code:match ('^%a%a%-.+') then -- ietf with 2-character language tag |
| − | add_to_list (ietf_list, name_list, override, code, name); | + | add_to_list (ietf_list, name_list, override, code, name); -- add to main ietf list for |list=ietf |
| | + | add_to_list (ietf_list2, name_list, override, code, name); -- add to ietf2 list |
| | + | elseif code:match ('^%a%a%a%-.+') then -- ietf with 3-character language tag |
| | + | add_to_list (ietf_list, name_list, override, code, name); -- add to main ietf list for |list=ietf |
| | + | add_to_list (ietf_list3, name_list, override, code, name); -- add to ietf3 list |
| | end | | end |
| | end | | end |
| Line 210: |
Line 218: |
| | local out = {}; | | local out = {}; |
| | | | |
| − | if '2char' == frame.args.list or 'all' == frame.args.list then | + | if '2char' == frame.args.list or 'all' == frame.args.list then -- iso 639-1 |
| | list_format (result, code_1_list); | | list_format (result, code_1_list); |
| − | elseif '3char' == frame.args.list then | + | elseif '3char' == frame.args.list then -- iso 639-2, 3 |
| | list_format (result, code_2_list); | | list_format (result, code_2_list); |
| − | elseif 'ietf' == frame.args.list then | + | elseif 'ietf' == frame.args.list then -- all ietf tags |
| | list_format (result, ietf_list); | | list_format (result, ietf_list); |
| | + | elseif 'ietf2' == frame.args.list then -- 2-character ietf tags |
| | + | list_format (result, ietf_list2); |
| | + | elseif 'ietf3' == frame.args.list then -- 3 character ietf tags |
| | + | list_format (result, ietf_list3); |
| | else --must be 'name' | | else --must be 'name' |
| | list_format (result, name_list); | | list_format (result, name_list); |
| Line 663: |
Line 675: |
| | local handlers = cfg.id_handlers; -- get id_handlers {} table from ~/Configuration | | local handlers = cfg.id_handlers; -- get id_handlers {} table from ~/Configuration |
| | | | |
| − | return args[1] and handlers[args[1]:upper()].id_limit or ('<span style="font-size:100%" class="error">No limit defined for identifier: ' .. (args[1] or '<unknown name>') .. '</span>'); | + | return args[1] and handlers[args[1]:upper()].id_limit or ('<span style="color:#d33">No limit defined for identifier: ' .. (args[1] or '<unknown name>') .. '</span>'); |
| | end | | end |
| | | | |
| Line 777: |
Line 789: |
| | end | | end |
| | else | | else |
| − | return '<span style=\"font-size:100%; font-style:normal;\" class=\"error\">error: unknown selector: ' .. select .. '</span>' | + | return '<span style="color:#d33; font-style:normal;">error: unknown selector: ' .. select .. '</span>' |
| | end | | end |
| | | | |
| Line 877: |
Line 889: |
| | with this: | | with this: |
| | {{#invoke:Cs1 documentation support|help_text_cats|err_bad_biorxiv}} | | {{#invoke:Cs1 documentation support|help_text_cats|err_bad_biorxiv}} |
| | + | where {{{1}}} is the error_conditions key from Module:Citation/CS1/Configuration |
| | | | |
| | add |pages=yes to append the number of pages in the category | | add |pages=yes to append the number of pages in the category |
| | + | |
| | ]=] | | ]=] |
| | | | |
| | local function help_text_cats (frame) | | local function help_text_cats (frame) |
| − | local args = getArgs (frame); | + | local args_t = getArgs (frame); |
| − | local error_conditions = mw.loadData ('Module:Citation/CS1/Configuration').error_conditions; | + | local error_conditions_t = cfg.error_conditions; -- get the table of error conditions |
| − | local out = {}; -- output goes here | + | local replacements_t = {}; -- table to hold replacement parameters for $1 etc placeholders in category names |
| − | | + | for k, v in pairs (args_t) do -- look for |$1=<replacement> parameters |
| − | if args[1] and error_conditions[args[1]] then -- must have error_condition key and it must exist | + | if 'string' == type (k) and k:match ('^$%d+$') then -- if found |
| − | table.insert (out, '{{#ifeq:{{FULLPAGENAME}}|Category:'); -- the beginning with category prefix | + | replacements_t[k] = v; -- save key and value |
| − | table.insert (out, error_conditions[args[1]].category); -- fetch the error category name (the reference that {{FULLPAGENAME}} must equate to)
| + | end |
| − | table.insert (out, '|Category:'); -- this category plain text when this invoke is on the category page | + | end |
| − | table.insert (out, error_conditions[args[1]].category); -- fetch the error category name
| + | |
| − | table.insert (out, '|'); -- the necessary pipe | + | if args_t[1] and error_conditions_t[args_t[1]] then -- must have error_condition key and it must exist |
| − | table.insert (out, cat_link_make (error_conditions[args[1]].category)); -- one the help page or elsewhere so link to the category | + | local error_cat = error_conditions_t[args_t[1]].category; -- get error category from cs1|2 configuration |
| − | table.insert (out, '}}'); -- and close the #ifeq
| + | if error_cat:match ('$%d') then -- look for placeholders in <error_cat> |
| − | if 'yes' == args.pages then
| + | error_cat = error_cat:gsub ('$%d', replacements_t) -- replace place holders with matching value from replacements_t |
| − | table.insert (out, ' ({{PAGESINCATEGORY:');
| + | end |
| − | table.insert (out, error_conditions[args[1]].category); -- fetch the error category name
| + | |
| − | table.insert (out, '}} pages)'); | + | local title_obj = mw.title.getCurrentTitle(); -- get a title object for the currently displayed page |
| | + | local name_space = title_obj.nsText; |
| | + | if ('Category' == name_space) and (error_cat == title_obj.text) then -- if this is the category page for the error message |
| | + | return table.concat ({'Category:', error_cat}); -- no link; just category name |
| | + | else -- here when currently displayed page is other than the error message category |
| | + | local pages = ''; -- default empty strin for concatenation |
| | + | if 'yes' == args_t.pages then -- if we should display category page count: TODO: do we need to keep this? |
| | + | pages = mw.site.stats.pagesInCategory (error_cat, 'all'); -- get category page count |
| | + | pages = table.concat ({' (', mw.language.getContentLanguage():formatNum (pages), ' page', (1 == pages) and ')' or 's)'}); -- make renderable text |
| | + | end |
| | + | return table.concat ({'[[:Category:', error_cat, ']]', pages}); -- link to category with or without page count |
| | end | | end |
| | else | | else |
| − | return '<span style="font-size:100%" class="error">unknown error_conditions key: ' .. (args[1] or 'key missing') .. '</span>'; | + | return '<span style="color:#d33">unknown error_conditions key: ' .. (args_t[1] or 'key missing') .. '</span>'; |
| | end | | end |
| − |
| |
| − | return frame:preprocess (table.concat (out)); -- make a big string, preprocess, and done
| |
| | end | | end |
| | | | |
| Line 915: |
Line 937: |
| | {{#invoke:Cs1 documentation support|help_text_error_messages|err_bad_issn|$1=_}} -> Check |issn= value | | {{#invoke:Cs1 documentation support|help_text_error_messages|err_bad_issn|$1=_}} -> Check |issn= value |
| | {{#invoke:Cs1 documentation support|help_text_error_messages|err_bad_issn|$1=e}} -> Check |eissn= value | | {{#invoke:Cs1 documentation support|help_text_error_messages|err_bad_issn|$1=e}} -> Check |eissn= value |
| | + | |
| | + | error message is rendered at 120% font size; to specify another font size use |size=; must include unit specifier (%, em, etc) |
| | + | |
| | ]] | | ]] |
| | | | |
| | local function help_text_error_messages (frame) | | local function help_text_error_messages (frame) |
| − | local args = getArgs (frame); | + | local args_t = getArgs (frame); |
| | local error_conditions = mw.loadData ('Module:Citation/CS1/Configuration').error_conditions; | | local error_conditions = mw.loadData ('Module:Citation/CS1/Configuration').error_conditions; |
| − | local span_o = '<span class="cs1-visible-error error citation-comment">';
| + | -- local span_o = '<span class="cs1-visible-error citation-comment">'; |
| | + | local span_o = '<span class="citation-comment" style="color:#d33; font-size:' .. ((args_t.size and args_t.size) or '120%') .. '">'; |
| | local span_c = '</span>'; | | local span_c = '</span>'; |
| | | | |
| Line 926: |
Line 952: |
| | local out = {}; -- output goes here | | local out = {}; -- output goes here |
| | | | |
| − | if args[1] and error_conditions[args[1]] then -- must have error_condition key and it must exist | + | if args_t[1] and error_conditions[args_t[1]] then -- must have error_condition key and it must exist |
| − | message = error_conditions[args[1]].message; | + | message = error_conditions[args_t[1]].message; |
| | local i=1; | | local i=1; |
| | local count; | | local count; |
| Line 933: |
Line 959: |
| | repeat | | repeat |
| | rep = '$'..i | | rep = '$'..i |
| − | args[rep] = args[rep] and args[rep]:gsub ('^%s*_%s*$', '') or nil; -- replace empty string marker with actual empty string | + | args_t[rep] = args_t[rep] and args_t[rep]:gsub ('^%s*_%s*$', '') or nil; -- replace empty string marker with actual empty string |
| − | message, count = message:gsub (rep, args[rep] or rep) | + | message, count = message:gsub (rep, args_t[rep] or rep) |
| | i = i + 1; | | i = i + 1; |
| | until (0 == count); | | until (0 == count); |
| Line 942: |
Line 968: |
| | table.insert (out, span_c); | | table.insert (out, span_c); |
| | else | | else |
| − | return '<span style="font-size:100%" class="error">unknown error_conditions key: ' .. (args[1] or 'key missing') .. '</span>'; | + | return '<span style="color:#d33">unknown error_conditions key: ' .. (args_t[1] or 'key missing') .. '</span>'; |
| | end | | end |
| | | | |
| | local out_str = table.concat (out); | | local out_str = table.concat (out); |
| − | out_str = frame:expandTemplate ({title='resize', args = {'120%', out_str} })
| + | return table.concat ({frame:extensionTag ('templatestyles', '', {src='Module:Citation/CS1/styles.css'}), out_str}); |
| − | return table.concat ({out_str, frame:extensionTag ('templatestyles', '', {src='Module:Citation/CS1/styles.css'})}); | |
| | end | | end |
| | | | |
| Line 972: |
Line 997: |
| | citebook = {'Template:Cite book/TemplateData'}, | | citebook = {'Template:Cite book/TemplateData'}, |
| | citeciteseerx = {'Template:Cite citeseerx/doc', 'citeseerx'}, -- no template data; preprint uses limited arguments | | citeciteseerx = {'Template:Cite citeseerx/doc', 'citeseerx'}, -- no template data; preprint uses limited arguments |
| − | citeconference = {'Template:Cite conference/doc'}, | + | citeconference = {'Template:Cite conference/doc', 'conference'}, -- unique arguments |
| | citeencyclopedia = {'Template:Cite encyclopedia/doc'}, | | citeencyclopedia = {'Template:Cite encyclopedia/doc'}, |
| | citeepisode = {'Template:Cite episode/doc', 'episode'}, -- unique arguments | | citeepisode = {'Template:Cite episode/doc', 'episode'}, -- unique arguments |
| Line 979: |
Line 1,004: |
| | citemagazine = {'Template:Cite magazine/doc'}, | | citemagazine = {'Template:Cite magazine/doc'}, |
| | citemailinglist = {'Template:Cite mailing list/doc', 'mailinglist'}, -- unique arguments -- no template data | | citemailinglist = {'Template:Cite mailing list/doc', 'mailinglist'}, -- unique arguments -- no template data |
| − | citemap = {'Template:Cite map/doc', 'map'}, -- unique arguments -- no template data | + | citemap = {'Template:Cite map/TemplateData', 'map'}, -- unique arguments |
| | citenews = {'Template:Cite news/doc'}, | | citenews = {'Template:Cite news/doc'}, |
| | citenewsgroup = {'Template:Cite newsgroup/doc', 'newsgroup'}, -- unique arguments | | citenewsgroup = {'Template:Cite newsgroup/doc', 'newsgroup'}, -- unique arguments |
| | citepodcast = {'Template:Cite podcast/doc'}, | | citepodcast = {'Template:Cite podcast/doc'}, |
| | citepressrelease = {'Template:Cite press release/doc'}, | | citepressrelease = {'Template:Cite press release/doc'}, |
| − | citereport = {'Template:Cite report/doc'}, | + | citereport = {'Template:Cite report/doc', 'report'}, -- unique arguments |
| | citeserial = {'Template:Cite serial/doc', 'serial'}, -- unique arguments -- no template data | | citeserial = {'Template:Cite serial/doc', 'serial'}, -- unique arguments -- no template data |
| | citesign = {'Template:Cite sign/doc'}, | | citesign = {'Template:Cite sign/doc'}, |
| − | citespeech = {'Template:Cite speech/doc'}, -- no template data | + | citespeech = {'Template:Cite speech/doc', 'speech'}, -- unique arguments -- no template data |
| | citessrn = {'Template:Cite ssrn/doc', 'ssrn'}, -- preprint arguments -- no template data | | citessrn = {'Template:Cite ssrn/doc', 'ssrn'}, -- preprint arguments -- no template data |
| | citetechreport = {'Template:Cite techreport/doc'}, | | citetechreport = {'Template:Cite techreport/doc'}, |
| − | citethesis = {'Template:Cite thesis/doc'}, | + | citethesis = {'Template:Cite thesis/doc', 'thesis'}, -- unique arguments |
| | citeweb = {'Template:Cite web/doc'}, | | citeweb = {'Template:Cite web/doc'}, |
| | citation = {'Template:Citation/doc'}, | | citation = {'Template:Citation/doc'}, |
| | } | | } |
| | + | |
| | + | |
| | + | --[[--------------------------< N O _ P A G E _ T E M P L A T E S _ T >---------------------------------------- |
| | + | |
| | + | |
| | + | ]] |
| | + | |
| | + | local no_page_templates_t = {}; |
| | | | |
| | | | |
| Line 1,073: |
Line 1,106: |
| | ]] | | ]] |
| | | | |
| − | local function validate_unique_param (param, key) | + | local function validate_unique_param (param, key, cfg_aliases_t) |
| | if true == whitelist.unique_arguments[key][param] or true == validate_basic_param (param) then | | if true == whitelist.unique_arguments[key][param] or true == validate_basic_param (param) then |
| | return true; | | return true; |
| Line 1,100: |
Line 1,133: |
| | | | |
| | local function param_error_msg (param) | | local function param_error_msg (param) |
| − | return '<code style="color: inherit; background: inherit; border: none; padding: inherit">|' .. param .. '=</code> not valid parameter'; | + | return '<code style="color: inherit; background: inherit; border: none; padding: inherit">|' .. param .. '=</code> is not a valid parameter'; |
| | end | | end |
| | | | |
| Line 1,110: |
Line 1,143: |
| | | | |
| | local function alias_error_msg (param, alias) | | local function alias_error_msg (param, alias) |
| − | return '<code style="color: inherit; background: inherit; border: none; padding: inherit">|' .. alias .. '=</code> not valid alias of: <code style="color: inherit; background: inherit; border: none; padding: inherit">|' .. param .. '=</code>'; | + | return '<code style="color: inherit; background: inherit; border: none; padding: inherit">|' .. alias .. '=</code> is not a valid alias of: <code style="color: inherit; background: inherit; border: none; padding: inherit">|' .. param .. '=</code>'; |
| | + | end |
| | + | |
| | + | |
| | + | --[[--------------------------< C F G _ A L I A S E S _ T _ M A K E >------------------------------------------ |
| | + | |
| | + | convert this from cfg.aliases{}: |
| | + | ['AccessDate'] = {'access-date', 'accessdate'} |
| | + | |
| | + | to this in out_t{} |
| | + | ['access-date'] = 'AccessDate', |
| | + | ['accessdate'] = 'AccessDate', |
| | + | |
| | + | to test if |accessdate= is an aliases of |access-date=: |
| | + | if out_t['access-date'] == out_t['accessdate'] |
| | + | ]] |
| | + | |
| | + | local function cfg_aliasts_t_make () |
| | + | local out_t = {}; |
| | + | for meta, params_t in pairs (cfg.aliases) do |
| | + | if 'table' == type (params_t) then -- metaparameters that are assigned string values do not have aliases |
| | + | for _, param in ipairs (params_t) do -- for each alias |
| | + | param = param:gsub ('#', ''); -- get rid of enumerators |
| | + | out_t[param] = meta; -- add it to the output table |
| | + | end |
| | + | end |
| | + | end |
| | + | --error (mw.dumpObject (out_t)) |
| | + | return out_t; |
| | end | | end |
| | | | |
| Line 1,122: |
Line 1,183: |
| | | | |
| | When called from a different page: | | When called from a different page: |
| − | {{#invoke:Sandbox/trappist the monk/template data|template_data_validate|<canonical template name>}} | + | {{#invoke:cs1 documentation support|template_data_validate|<canonical template name>}} |
| | where the <canonical template name> is the template's canonical name with or without namespace and or subpages | | where the <canonical template name> is the template's canonical name with or without namespace and or subpages |
| | | | |
| Line 1,131: |
Line 1,192: |
| | | | |
| | if not args_t[1] then | | if not args_t[1] then |
| − | return '<span style=\"font-size: 100%; font-style: normal;\" class=\"error\">Error: cs1|2 template name required</span>'; | + | return '<span style="color:#d33">Error: cs1|2 template name required</span>'; |
| | end | | end |
| | | | |
| | local template_idx = args_t[1]:lower():match ('cit[ae][^/]+'); -- args_t[1] has something | | local template_idx = args_t[1]:lower():match ('cit[ae][^/]+'); -- args_t[1] has something |
| | if not template_idx then -- but if not a cs1|2 template abandon with error message | | if not template_idx then -- but if not a cs1|2 template abandon with error message |
| − | return '<span style=\"font-size: 100%; font-style: normal;\" class=\"error\">Error: cs1|2 template name required</span>'; | + | return '<span style="color:#d33">Error: cs1|2 template name required</span>'; |
| | else | | else |
| | template_idx = template_idx:gsub (' ', ''); -- is what appears to be a cs1|2 template so strip spaces | | template_idx = template_idx:gsub (' ', ''); -- is what appears to be a cs1|2 template so strip spaces |
| | end | | end |
| | + | |
| | + | local cfg_aliases_t = cfg_aliasts_t_make (); |
| | + | |
| | | | |
| | local template_t = templates_t[template_idx]; | | local template_t = templates_t[template_idx]; |
| Line 1,160: |
Line 1,224: |
| | for _, alias in ipairs (param_t['aliases']) do | | for _, alias in ipairs (param_t['aliases']) do |
| | local alias_i = alias:gsub ('%d+', '#'); -- in case an enumerated parameter, convert the enumerator digits to a single '#' character | | local alias_i = alias:gsub ('%d+', '#'); -- in case an enumerated parameter, convert the enumerator digits to a single '#' character |
| − | if not validate_preprint_param (alias_i, template_t[2]) then
| + | if not validate_preprint_param (alias_i, template_t[2]) then -- is 'alias' a known parameter? |
| − | table.insert (out, alias_error_msg (param, alias)); | + | table.insert (out, alias_error_msg (param, alias)); -- may be known but is not supported |
| | + | elseif cfg_aliases_t[param_i:gsub ('#', '')] ~= cfg_aliases_t[alias_i:gsub ('#', '')] then -- is 'alias' known to be an alias of 'param'? |
| | + | table.insert (out, alias_error_msg (param, alias)); |
| | end | | end |
| | end | | end |
| Line 1,174: |
Line 1,240: |
| | for _, alias in ipairs (param_t['aliases']) do | | for _, alias in ipairs (param_t['aliases']) do |
| | local alias_i = alias:gsub ('%d+', '#'); -- in case an enumerated parameter, convert the enumerate digits to a single '#' character | | local alias_i = alias:gsub ('%d+', '#'); -- in case an enumerated parameter, convert the enumerate digits to a single '#' character |
| − | if not validate_unique_param (alias_i, template_t[2]) then
| + | if not validate_unique_param (alias_i, template_t[2]) then -- is 'alias' a known parameter? |
| | + | table.insert (out, alias_error_msg (param, alias)); |
| | + | elseif cfg_aliases_t[param_i:gsub ('#', '')] ~= cfg_aliases_t[alias_i:gsub ('#', '')] then -- is 'alias' known to be an alias of 'param'? |
| | table.insert (out, alias_error_msg (param, alias)); | | table.insert (out, alias_error_msg (param, alias)); |
| | end | | end |
| Line 1,203: |
Line 1,271: |
| | end | | end |
| | end | | end |
| | + | |
| | + | ---------- this emits errors when page/pages/at listed in templatedata of templates that don't support those parameters ---------- |
| | + | -- if json_t then |
| | + | -- if ({['citeavmedia']=true, ['citeepisode']=true, ['citemailinglist']=true, ['citenewsgroup']=true, ['citepodcast']=true, ['citeserial']=true, ['citesign']=true, ['citespeech']=true})[template_idx] then |
| | + | -- local insource_params_t = {}; -- build sequence of pagination params not supported by these templates |
| | + | -- for _, meta_param in ipairs ({'At', 'Page', 'Pages', 'QuotePage', 'QuotePages'}) do |
| | + | -- if 'table' == type (cfg.aliases[meta_param]) then |
| | + | -- for _, alias in ipairs (cfg.aliases[meta_param]) do -- metaparameter is a sequence |
| | + | -- table.insert (insource_params_t, alias); -- add the aliases from the metaparameter sequence to the table |
| | + | -- end |
| | + | -- else -- metaparameter is plain text |
| | + | -- table.insert (insource_params_t, cfg.aliases[meta_param]); -- add the alias to the table |
| | + | -- end |
| | + | -- end |
| | + | -- |
| | + | -- for _, param in ipairs (insource_params_t) do |
| | + | -- if json_t.params[param] then |
| | + | -- table.insert (out, param_error_msg (param)); -- error; this parameter not supported by this template |
| | + | -- end |
| | + | -- end |
| | + | -- end |
| | + | -- end |
| | + | ---------- end page/pages/at error detection ---------- |
| | | | |
| | if 0 ~= #out then | | if 0 ~= #out then |
| | table.sort (out); | | table.sort (out); |
| | out[1] = '*' .. out[1]; -- add a splat to the first error message | | out[1] = '*' .. out[1]; -- add a splat to the first error message |
| − | return table.concat ({'[[' .. template_doc .. ']] TemplateData has errors:<div style=\"font-size: 100%; font-style: normal;\" class=\"error\">\n', table.concat (out, '\n*'), '</div>'});
| + | |
| | + | -- return table.concat ({'[[' .. template_doc .. ']] TemplateData has errors:<div style="color:#d33; font-style: normal">\n', table.concat (out, '\n*'), '</div>'}); |
| | + | return table.concat ({ |
| | + | '[[Template:' .. args_t[1] .. ']] uses ', |
| | + | whitelist.preprint_arguments[template_t[2]] and 'preprint and limited parameter sets' or (whitelist.unique_arguments[template_t[2]] and 'unique and standard parameter sets' or 'standard parameter set'), |
| | + | '; TemplateData has errors:\n', |
| | + | '<div style="color:#d33; font-style: normal">\n', table.concat (out, '\n*'), '</div>' |
| | + | }); |
| | else | | else |
| | return; -- no errors detected; return nothing | | return; -- no errors detected; return nothing |
| | + | end |
| | + | end |
| | + | |
| | + | |
| | + | --[[--------------------------< E R R O R _ C A T _ P A G E _ T A L L Y >-------------------------------------- |
| | + | |
| | + | loop through Module:Citation/CS1/Configuration error_conditions {} fetching error category names. For each error |
| | + | category add the number of pages in the category to the tally. Render the number when done. |
| | + | |
| | + | {{#invoke:cs1 documentation support|error_cat_page_tally}} |
| | + | |
| | + | ]] |
| | + | |
| | + | local function error_cat_page_tally () |
| | + | local error_conditions_t = cfg.error_conditions; -- get the table of error conditions |
| | + | local tally = 0; |
| | + | local cat_t = {}; -- some error message share a category; save tallied cats here so we don't recount the already counted |
| | + | local i = 0; -- number of categories |
| | + | |
| | + | for k, v_t in pairs (error_conditions_t) do |
| | + | if k:match ('^err') then |
| | + | if not cat_t[v_t.category] then |
| | + | cat_t[v_t.category] = true; |
| | + | tally = tally + mw.site.stats.pagesInCategory (v_t.category, 'pages'); -- get category page count; ignore subcats and files |
| | + | i = i + 1; |
| | + | end |
| | + | end |
| | + | end |
| | + | |
| | + | return mw.language.getContentLanguage():formatNum (tally) |
| | + | end |
| | + | |
| | + | |
| | + | --[[--------------------------< M A I N T _ C A T _ P A G E _ T A L L Y >-------------------------------------- |
| | + | |
| | + | loop through Module:Citation/CS1/Configuration error_conditions {} fetching error category names. For each error |
| | + | category add the number of pages in the category to the tally. Render the number when done. |
| | + | |
| | + | {{#invoke:cs1 documentation support|maint_cat_page_tally}} |
| | + | |
| | + | Dynamic subcats of CS1 maint: DOI inactive not counted because these names come and go as time goes by. |
| | + | |
| | + | ]] |
| | + | |
| | + | local function maint_cat_page_tally () |
| | + | local error_conditions_t = cfg.error_conditions; -- get the table of error conditions |
| | + | local tally = 0; |
| | + | local cat_t = {}; -- some error message share a category; save tallied cats here so we don't recount the already counted |
| | + | local i = 0; -- number of categories |
| | + | |
| | + | for k, v_t in pairs (error_conditions_t) do |
| | + | if not k:match ('^err') then -- if not an error key its a maint key |
| | + | if not cat_t[v_t.category] then |
| | + | cat_t[v_t.category] = true; |
| | + | if 'maint_mult_names' == k or 'maint_numeric_names' == k then |
| | + | local special_case_translation_t = cfg.special_case_translation; |
| | + | for _, name in ipairs ({'AuthorList', 'ContributorList', 'EditorList', 'InterviewerList', 'TranslatorList'}) do |
| | + | local cat_name = v_t.category:gsub ('$1', special_case_translation_t[name]); -- replace $1 with translated list name |
| | + | tally = tally + mw.site.stats.pagesInCategory (cat_name, 'pages'); -- get category page count; ignore subcats and files |
| | + | i = i + 1; |
| | + | end |
| | + | else |
| | + | tally = tally + mw.site.stats.pagesInCategory (v_t.category, 'pages'); -- get category page count; ignore subcats and files |
| | + | i = i + 1; |
| | + | end |
| | + | end |
| | + | end |
| | + | end |
| | + | |
| | + | return mw.language.getContentLanguage():formatNum (tally) |
| | + | end |
| | + | |
| | + | |
| | + | --[[--------------------------< U N C A T E G O R I Z E D _ N A M E S P A C E _ L I S T E R >------------------ |
| | + | |
| | + | For use in the Help:CS1 error §Notes |
| | + | |
| | + | Get namespace names and identifiers from MediaWiki. Make a human readable list of namespace names and identifiers |
| | + | that cs1|2 does not categorize. |
| | + | |
| | + | {{#invoke:cs1 documentation support|uncategorized_namespace_lister}} |
| | + | |
| | + | For convenience, |
| | + | {{#invoke:cs1 documentation support|uncategorized_namespace_lister|all=<anything>}} |
| | + | |
| | + | returns a list of all namespace names and identifiers used on the current wiki. Any namespace with an |
| | + | identifier less than 1, currently Mainspace (0), Special (-1), and Media (-2), is excluded from the list. |
| | + | |
| | + | ]] |
| | + | |
| | + | local function uncategorized_namespace_lister (frame) |
| | + | --TEMP DEVELOPMENT 2022-07-09 -- delete at next module update |
| | + | local cfg = mw.loadData ('Module:Citation/CS1/Configuration/sandbox'); -- load the SANDBOX configuration module |
| | + | --END TEMP DEVELOPMENT |
| | + | local list_t = {}; |
| | + | local function compare (a, b) -- local function to sort namespaces numerically by the identifiers |
| | + | local a_num = tonumber (a:match ('%d+')); -- get identifiers and convert to numbers |
| | + | local b_num = tonumber (b:match ('%d+')); |
| | + | return a_num < b_num; -- do the comparison |
| | + | end |
| | + | |
| | + | for i, _ in pairs (mw.site.namespaces) do -- for each namespace in the table |
| | + | if '' == frame.args.all or not frame.args.all then -- when |all= not set, make a list of uncategorized namespaces |
| | + | if cfg.uncategorized_namespaces[i] then -- if the identifier is listed in our uncategorized namespace list |
| | + | table.insert (list_t, table.concat ({mw.site.namespaces[i].name, ' (', i, ')'})) -- add name and identifier to our local list |
| | + | end |
| | + | elseif 0 < i then -- |all=<anything>: all namespace names and identifiers; ignore identifiers less than 1 |
| | + | table.insert (list_t, table.concat ({'*', mw.site.namespaces[i].name, ' (', i, ')'})) -- add name and identifier as an unordered list item |
| | + | end |
| | + | end |
| | + | |
| | + | table.sort (list_t, compare); -- ascending numerical sort by identifier |
| | + | |
| | + | if not frame.args.all then -- when |all= not set, format list of uncategorized namespaces and identifiers |
| | + | list_t[#list_t] = 'and ' .. list_t[#list_t]; -- add 'and ' to the last name/identifier pair |
| | + | return table.concat (list_t, ', '); -- make a big string and done |
| | + | else -- make list of all namespaces and identifiers |
| | + | return table.concat (list_t, '\n'); -- make a big string and done |
| | end | | end |
| | end | | end |
| Line 1,223: |
Line 1,439: |
| | canonical_name_get = canonical_name_get, | | canonical_name_get = canonical_name_get, |
| | cat_lister = cat_lister, | | cat_lister = cat_lister, |
| | + | error_cat_page_tally = error_cat_page_tally, |
| | header_make = header_make, | | header_make = header_make, |
| | help_text_cats = help_text_cats, | | help_text_cats = help_text_cats, |
| Line 1,230: |
Line 1,447: |
| | is_limited_param_template = is_limited_param_template, | | is_limited_param_template = is_limited_param_template, |
| | lang_lister = lang_lister, | | lang_lister = lang_lister, |
| | + | maint_cat_page_tally = maint_cat_page_tally, |
| | script_lang_lister = script_lang_lister, | | script_lang_lister = script_lang_lister, |
| | template_data_validate = template_data_validate, | | template_data_validate = template_data_validate, |
| | + | uncategorized_namespace_lister = uncategorized_namespace_lister, |
| | }; | | }; |