Module:Citation/CS1/Configuration: Difference between revisions

m
(hide deprecated parameters error messages and hide missing periodical error messages;)
m (73 revisions imported from templatewiki:Module:Citation/CS1/Configuration)
Line 1: Line 1:
local citation_config = {};


--[[--------------------------< U N C A T E G O R I Z E D _ N A M E S P A C E S >------------------------------
--[[--------------------------< U N C A T E G O R I Z E D _ N A M E S P A C E S >------------------------------
Line 9: Line 11:
local uncategorized_namespaces = { 'User', 'Talk', 'User_talk', 'Wikipedia_talk', 'File_talk', 'Template_talk', 'Help_talk', 'Category_talk', 'Portal_talk', 'Book_talk', 'Draft_talk', 'Education_Program_talk', 'Module_talk', 'MediaWiki_talk' };
local uncategorized_namespaces = { 'User', 'Talk', 'User_talk', 'Wikipedia_talk', 'File_talk', 'Template_talk', 'Help_talk', 'Category_talk', 'Portal_talk', 'Book_talk', 'Draft_talk', 'Education_Program_talk', 'Module_talk', 'MediaWiki_talk' };


local uncategorized_subpages = {'/[Ss]andbox', '/[Tt]estcases'}; -- list of Lua patterns found in page names of pages we should not categorize
local uncategorized_subpages = {'/[Ss]andbox', '/[Tt]estcases'}; -- list of Lua patterns found in page names of pages we should not categorize
 


--[[--------------------------< M E S S A G E S >--------------------------------------------------------------
--[[--------------------------< M E S S A G E S >--------------------------------------------------------------
Line 23: Line 24:


local messages = {
local messages = {
['agency'] = '$1 $2', -- $1 is sepc, $2 is agency
['archived-dead'] = 'Archived from $1 on $2',
['archived-dead'] = 'Archived from $1 on $2',
['archived-live'] = '$1 from the original on $2',
['archived-not-dead'] = '$1 from the original on $2',
['archived-missing'] = 'Archived from the original$1 on $2',
['archived-missing'] = 'Archived from the original$1 on $2',
['archived'] = 'Archived',
['archived'] = 'Archived',
Line 42: Line 42:
['newsgroup'] = '[[Usenet newsgroup|Newsgroup]]:&nbsp;$1',
['newsgroup'] = '[[Usenet newsgroup|Newsgroup]]:&nbsp;$1',
['original'] = 'the original',
['original'] = 'the original',
['origyear'] = ' [$1]',
['published'] = ' (published $1)',
['published'] = ' (published $1)',
['retrieved'] = 'Retrieved $1',
['retrieved'] = 'Retrieved $1',
Line 48: Line 47:
['section'] = '§ $1',
['section'] = '§ $1',
['sections'] = '§§ $1',
['sections'] = '§§ $1',
['series'] = '$1 $2', -- $1 is sepc, $2 is series
['series'] = 'Series $1',
['seriesnum'] = 'Series $1',
['translated'] = 'Translated by $1',
['translated'] = 'Translated by $1',
['type'] = ' ($1)', -- for titletype
['type'] = ' ($1)', -- for titletype
Line 97: Line 95:
['unknown_argument_map'] = 'Argument map not defined for this variable',
['unknown_argument_map'] = 'Argument map not defined for this variable',
['bare_url_no_origin'] = 'Bare url found but origin indicator is nil or empty',
['bare_url_no_origin'] = 'Bare url found but origin indicator is nil or empty',
}
--[=[-------------------------< E T _ A L _ P A T T E R N S >--------------------------------------------------
This table provides Lua patterns for the phrase "et al" and variants in name text
(author, editor, etc.). The main module uses these to identify and emit the 'etal' message.
TODO: detect wikilinked et al.:  [[et al]].
]=]
local et_al_patterns = {
"[;,]? *[\"']*%f[%a][Ee][Tt]%.? *[Aa][Ll][%.\"']*$", -- variations on the 'et al' theme
"[;,]? *[\"']*%f[%a][Ee][Tt]%.? *[Aa][Ll][Ii][Aa][%.\"']*$", -- variations on the 'et alia' theme
"[;,]? *%f[%a]and [Oo]thers", -- and alternate to et al.
}
--[[--------------------------< E D I T O R _ M A R K U P _ P A T T E R N S >----------------------------------
This table provides Lua patterns for the phrase "ed" and variants in name text
(author, editor, etc.). The main module uses these to identify and emit the
'extra_text_names' message. (It is not the only series of patterns for this message.)
]]
local editor_markup_patterns = { -- these patterns match annotations at end of name
'%f[%(%[][%(%[]%s*[Ee][Dd][Ss]?%.?%s*[%)%]]?$', -- (ed) or (eds): leading '(', case insensitive 'ed', optional 's', '.' and/or ')'
'[,%.%s]%f[e]eds?%.?$', -- ed or eds: without '('or ')'; case sensitive (ED could be initials Ed could be name)
'%f[%(%[][%(%[]%s*[Ee][Dd][Ii][Tt][Oo][Rr][Ss]?%.?%s*[%)%]]?$', -- (editor) or (editors): leading '(', case insensitive, optional '.' and/or ')'
'[,%.%s]%f[Ee][Ee][Dd][Ii][Tt][Oo][Rr][Ss]?%.?$', -- editor or editors: without '('or ')'; case insensitive
-- these patterns match annotations at beginning of name
'^eds?[%.,;]', -- ed. or eds.: lower case only, optional 's', requires '.'
'^[%(%[]%s*[Ee][Dd][Ss]?%.?%s*[%)%]]', -- (ed) or (eds): also sqare brackets, case insensitive, optional 's', '.'
'^[%(%[]?%s*[Ee][Dd][Ii][Tt][Oo][Rr][Ss]?%A', -- (editor or (editors: also sq brackets, case insensitive, optional brackets, 's'
'^[%(%[]?%s*[Ee][Dd][Ii][Tt][Ee][Dd]%A', -- (edited: also sq brackets, case insensitive, optional brackets
}
}


Line 151: Line 112:
['hidden-error'] = '<span class="cs1-hidden-error error citation-comment">$1</span>',
['hidden-error'] = '<span class="cs1-hidden-error error citation-comment">$1</span>',
['visible-error'] = '<span class="cs1-visible-error error citation-comment">$1</span>',
['visible-error'] = '<span class="cs1-visible-error error citation-comment">$1</span>',
['hidden-maint'] = '<span class="cs1-maint citation-comment">$1</span>',
 
['accessdate'] = '<span class="reference-accessdate">$1$2</span>', -- to allow editors to hide accessdate using personal css
['accessdate'] = '<span class="reference-accessdate">$1$2</span>', -- to allow editors to hide accessdate using personal css


Line 170: Line 130:
['limited'] = {class='cs1-lock-limited', title='Free access subject to limited trial, subscription normally required'},
['limited'] = {class='cs1-lock-limited', title='Free access subject to limited trial, subscription normally required'},
['subscription'] = {class='cs1-lock-subscription', title='Paid subscription required'},
['subscription'] = {class='cs1-lock-subscription', title='Paid subscription required'},
['interwiki-icon'] = '<span class="$1" title="$2">$3</span>',
['class-wikisource'] = 'cs1-ws-icon',


['italic-title'] = "''$1''",
['italic-title'] = "''$1''",
Line 226: Line 183:
['ASINTLD'] = {'ASIN-TLD', 'asin-tld'},
['ASINTLD'] = {'ASIN-TLD', 'asin-tld'},
['At'] = 'at',
['At'] = 'at',
['Authors'] = {'authors', 'people', 'credits'},
['Authors'] = {'authors', 'people', 'host', 'credits'},
['BookTitle'] = {'book-title', 'booktitle'},
['BookTitle'] = {'book-title', 'booktitle'},
['Cartography'] = 'cartography',
['Cartography'] = 'cartography',
Line 240: Line 197:
['Contribution'] = 'contribution', -- introduction, foreword, afterword, etc; required when |contributor= set
['Contribution'] = 'contribution', -- introduction, foreword, afterword, etc; required when |contributor= set
['Date'] = 'date',
['Date'] = 'date',
['DeadURL'] = {'dead-url', 'deadurl'},
['Degree'] = 'degree',
['Degree'] = 'degree',
['DF'] = 'df',
['DF'] = 'df',
['DisplayAuthors'] = {'display-authors', 'displayauthors'},
['DisplayAuthors'] = {'display-authors', 'displayauthors'},
['DisplayContributors'] = 'display-contributors',
['DisplayEditors'] = {'display-editors', 'displayeditors'},
['DisplayEditors'] = {'display-editors', 'displayeditors'},
['DisplayInterviewers'] = 'display-interviewers',
['DisplayTranslators'] = 'display-translators',
['Docket'] = 'docket',
['Docket'] = 'docket',
['DoiBroken'] = {'doi-broken', 'doi-broken-date', 'doi-inactive-date'},
['DoiBroken'] = {'doi-broken', 'doi-broken-date', 'doi-inactive-date'},
Line 259: Line 214:
['Inset'] = 'inset',
['Inset'] = 'inset',
['Issue'] = {'issue', 'number'},
['Issue'] = {'issue', 'number'},
['Interviewers'] = 'interviewers',
['Language'] = {'language', 'lang'},
['Language'] = {'language', 'lang'},
['LastAuthorAmp'] = {'last-author-amp', 'lastauthoramp'},
['LastAuthorAmp'] = {'last-author-amp', 'lastauthoramp'},
Line 269: Line 225:
['MapFormat'] = 'map-format', -- cite map only
['MapFormat'] = 'map-format', -- cite map only
['MapURL'] = {'mapurl', 'map-url'}, -- cite map only
['MapURL'] = {'mapurl', 'map-url'}, -- cite map only
['MapUrlAccess'] = 'map-url-access', -- cite map only
['MessageID'] = 'message-id',
['MessageID'] = 'message-id',
['Minutes'] = 'minutes',
['Minutes'] = 'minutes',
Line 283: Line 238:
['Page'] = {'p', 'page'},
['Page'] = {'p', 'page'},
['Pages'] = {'pp', 'pages'},
['Pages'] = {'pp', 'pages'},
['Periodical'] = {'journal', 'magazine', 'newspaper', 'periodical', 'website', 'work',
['Periodical'] = {'journal', 'newspaper', 'magazine', 'work',
'encyclopedia', 'encyclopaedia', 'dictionary', 'mailinglist'}, -- these masquerade as periodicals but aren't TODO: find a better way to handle these?
'website', 'periodical', 'encyclopedia', 'encyclopaedia', 'dictionary', 'mailinglist'},
['Place'] = {'place', 'location'},
['Place'] = {'place', 'location'},
['PostScript'] = 'postscript',
['PostScript'] = 'postscript',
['PublicationDate'] = {'publicationdate', 'publication-date'},
['PublicationDate'] = {'publicationdate', 'publication-date'},
['PublicationPlace'] = {'publication-place', 'publicationplace'},
['PublicationPlace'] = {'publication-place', 'publicationplace'},
['PublisherName'] = {'publisher', 'institution', 'newsgroup'},
['PublisherName'] = {'publisher', 'distributor', 'institution', 'newsgroup'},
['Quote'] = {'quote', 'quotation'},
['Quote'] = {'quote', 'quotation'},
['Ref'] = 'ref',
['Ref'] = 'ref',
['RegistrationRequired'] = 'registration',
['RegistrationRequired'] = 'registration',
['Scale'] = 'scale',
['Scale'] = 'scale',
['ScriptChapter'] = {'script-chapter', 'script-contribution', 'script-entry', 'script-article', 'script-section'},
['ScriptChapter'] = 'script-chapter',
['ScriptPeriodical'] = {'script-journal', 'script-magazine', 'script-newspaper', 'script-periodical', 'script-website', 'script-work'},
['ScriptTitle'] = 'script-title',
['ScriptTitle'] = 'script-title',
['Section'] = 'section',
['Section'] = 'section',
Line 314: Line 268:
['TitleNote'] = 'department',
['TitleNote'] = 'department',
['TitleType'] = {'type', 'medium'},
['TitleType'] = {'type', 'medium'},
['TransChapter'] = {'trans-article', 'trans-chapter', 'trans-contribution', 'trans-entry', 'trans-section'},
['TransChapter'] = 'trans-chapter',
['TransMap'] = 'trans-map', -- cite map only
['Transcript'] = 'transcript',
['Transcript'] = 'transcript',
['TranscriptFormat'] = 'transcript-format',
['TranscriptFormat'] = 'transcript-format',
['TranscriptURL'] = {'transcript-url', 'transcripturl'},
['TranscriptURL'] = {'transcript-url', 'transcripturl'},
['TransMap'] = 'trans-map', -- cite map only
['TransPeriodical'] = {'trans-journal', 'trans-magazine', 'trans-newspaper', 'trans-periodical', 'trans-website', 'trans-work'},
['TransTitle'] = 'trans-title',
['TransTitle'] = 'trans-title',
['URL'] = {'url', 'URL'},
['URL'] = {'url', 'URL'},
['UrlAccess'] = {'url-access'},
['UrlAccess'] = {'url-access'},
['UrlStatus'] = {'url-status', 'dead-url', 'deadurl'}, -- TODO: remove 'dead-url', 'deadurl'
['Vauthors'] = 'vauthors',
['Vauthors'] = 'vauthors',
['Veditors'] = 'veditors',
['Veditors'] = 'veditors',
Line 331: Line 283:


['AuthorList-First'] = {"first#", "given#", "author-first#", "author#-first"},
['AuthorList-First'] = {"first#", "given#", "author-first#", "author#-first"},
['AuthorList-Last'] = {"last#", "author#", "surname#", "author-last#", "author#-last", "subject#", 'host#'},
['AuthorList-Last'] = {"last#", "author#", "surname#", "author-last#", "author#-last", "subject#"},
['AuthorList-Link'] = {"authorlink#", "author-link#", "author#-link", "subjectlink#", "author#link", "subject-link#", "subject#-link", "subject#link"},
['AuthorList-Link'] = {"authorlink#", "author-link#", "author#-link", "subjectlink#", "author#link", "subject-link#", "subject#-link", "subject#link"},
['AuthorList-Mask'] = {"author-mask#", "authormask#", "author#mask", "author#-mask"},
['AuthorList-Mask'] = {"author-mask#", "authormask#", "author#mask", "author#-mask"},
Line 355: Line 307:
['TranslatorList-Mask'] = {'translator-mask#', 'translator#-mask'},
['TranslatorList-Mask'] = {'translator-mask#', 'translator#-mask'},
}
}
--[[--------------------------< P U N C T _ S K I P >----------------------------------------------------------
builds a table of parameter names that the extraneous terminal punctuation check should not check.
]]
local punct_skip = {};
local meta_params = { -- table of aliases[] keys (meta parameters); each key has a table of parameter names for a value
'BookTitle', 'Chapter', 'ScriptChapter', 'ScriptTitle', 'Title', 'TransChapter', 'Transcript', 'TransMap', 'TransTitle', -- title-holding parameters
'PostScript', 'Quote', -- miscellaneous
'ArchiveURL', 'ChapterURL', 'ConferenceURL', 'LayURL', 'MapURL', 'TranscriptURL', 'URL', -- url-holding parameters
}
for _, meta_param in ipairs (meta_params) do -- for each meta parameter key
local params = aliases[meta_param]; -- get the parameter or the table of parameters associated with the meta parameter name
if 'string' == type (params) then
punct_skip[params] = 1; -- just a single parameter
else
for _, param in ipairs (params) do -- get the parameter name
punct_skip[param] = 1; -- add the parameter name to the skip table
end
end
end




Line 392: Line 318:


local special_case_translation = {
local special_case_translation = {
['AuthorList'] = 'authors list', -- these for multiple names maint categories
['AuthorList'] = "authors list", -- these for multiple names maint categories
['ContributorList'] = 'contributors list',
['ContributorList'] = "contributors list",
['EditorList'] = 'editors list',
['EditorList'] = "editors list",
['InterviewerList'] = 'interviewers list',
['InterviewerList'] = "interviewers list",
['TranslatorList'] = 'translators list',
['TranslatorList'] = "translators list",
['authors'] = 'authors', -- used in get_display_names()
['authors'] = "authors", -- used in get_display_authors_editors()
['contributors'] = 'contributors',
['editors'] = "editors",
['editors'] = 'editors',
['interviewers'] = 'interviewers',
['translators'] = 'translators',


['archived_copy'] = '^archived?%s+copy$', -- lua pattern to match pseudo title used by Internet Archive bot and others as place holder for unknown |title= value
['archived_copy'] = '^archived?%s+copy$', -- lua pattern to match pseudo title used by Internet Archive bot and others as place holder for unknown |title= value
Line 417: Line 340:


local defaults = {
local defaults = {
['UrlStatus'] = 'dead',
['DeadURL'] = 'yes',
}
}


Line 441: Line 364:
local date_names = {
local date_names = {
['en'] = { -- English
['en'] = { -- English
['long'] = {['January']=1, ['February']=2, ['March']=3, ['April']=4, ['May']=5, ['June']=6, ['July']=7, ['August']=8, ['September']=9, ['October']=10, ['November']=11, ['December']=12},
['long'] = {['January']=1, ['February']=2, ['March']=3, ['April']=4, ['May']=5, ['June']=6, ['July']=7, ['August']=8, ['September']=9, ['October']=10, ['November']=11, ['December']=12};
['short'] = {['Jan']=1, ['Feb']=2, ['Mar']=3, ['Apr']=4, ['May']=5, ['Jun']=6, ['Jul']=7, ['Aug']=8, ['Sep']=9, ['Oct']=10, ['Nov']=11, ['Dec']=12},
['short'] = {['Jan']=1, ['Feb']=2, ['Mar']=3, ['Apr']=4, ['May']=5, ['Jun']=6, ['Jul']=7, ['Aug']=8, ['Sep']=9, ['Oct']=10, ['Nov']=11, ['Dec']=12};
['season'] = {['Winter']=24, ['Spring']=21, ['Summer']=22, ['Fall']=23, ['Autumn']=23},
['season'] = {['Winter']=24, ['Spring']=21, ['Summer']=22, ['Fall']=23, ['Autumn']=23};
['named'] = {['Christmas']=99},
['named'] = {['Christmas']=99};
},
},
['local'] = { -- replace these English date names with the local language equivalents
['local'] = { -- replace these English date names with the local language equivalents
['long'] = {['January']=1, ['February']=2, ['March']=3, ['April']=4, ['May']=5, ['June']=6, ['July']=7, ['August']=8, ['September']=9, ['October']=10, ['November']=11, ['December']=12},
['long'] = {['January']=1, ['February']=2, ['March']=3, ['April']=4, ['May']=5, ['June']=6, ['July']=7, ['August']=8, ['September']=9, ['October']=10, ['November']=11, ['December']=12};
['short'] = {['Jan']=1, ['Feb']=2, ['Mar']=3, ['Apr']=4, ['May']=5, ['Jun']=6, ['Jul']=7, ['Aug']=8, ['Sep']=9, ['Oct']=10, ['Nov']=11, ['Dec']=12},
['short'] = {['Jan']=1, ['Feb']=2, ['Mar']=3, ['Apr']=4, ['May']=5, ['Jun']=6, ['Jul']=7, ['Aug']=8, ['Sep']=9, ['Oct']=10, ['Nov']=11, ['Dec']=12};
['season'] = {['Winter']=24, ['Spring']=21, ['Summer']=22, ['Fall']=23, ['Autumn']=23},
['season'] = {['Winter']=24, ['Spring']=21, ['Summer']=22, ['Fall']=23, ['Autumn']=23};
['named'] = {['Christmas']=99},
['named'] = {['Christmas']=99};
},
},
['inv_local_l'] = {}, -- used in date reformatting; copy of date_names['local'].long where k/v are inverted: [1]='<local name>' etc
['local_digits'] = {['0'] = '0', ['1'] = '1', ['2'] = '2', ['3'] = '3', ['4'] = '4', ['5'] = '5', ['6'] = '6', ['7'] = '7', ['8'] = '8', ['9'] = '9'}; -- used to convert local language digits to Western 0-9
['inv_local_s'] = {}, -- used in date reformatting; copy of date_names['local'].short where k/v are inverted: [1]='<local name>' etc
['xlate_digits'] = {};
['local_digits'] = {['0'] = '0', ['1'] = '1', ['2'] = '2', ['3'] = '3', ['4'] = '4', ['5'] = '5', ['6'] = '6', ['7'] = '7', ['8'] = '8', ['9'] = '9'}, -- used to convert local language digits to Western 0-9
['xlate_digits'] = {},
}
}


for name, i in pairs (date_names['local'].long) do -- this table is ['name'] = i
for ld, ed in pairs (date_names.local_digits) do -- make a digit translation table for simple date translation from en to local language using local_digits table
date_names['inv_local_l'][i] = name; -- invert to get [i] = 'name' for conversions from ymd
date_names.xlate_digits [ed] = ld; -- en digit becomes index with local digit as the value
end
 
for name, i in pairs (date_names['local'].short) do -- this table is ['name'] = i
date_names['inv_local_s'][i] = name; -- invert to get [i] = 'name' for conversions from ymd
end
 
for ld, ed in pairs (date_names.local_digits) do -- make a digit translation table for simple date translation from en to local language using local_digits table
date_names.xlate_digits [ed] = ld; -- en digit becomes index with local digit as the value
end
 
local df_template_patterns = { -- table of redirects to {{Use dmy dates}} and {{Use mdy dates}}
'{{ *[Uu]se (dmy) dates *[|}]', -- 915k -- sorted by approximate transclusion count
'{{ *[Uu]se *(mdy) *dates *[|}]', -- 161k
'{{ *[Uu]se (DMY) dates *[|}]', -- 2929
'{{ *[Uu]se *(dmy) *[|}]', -- 250 + 34
'{{ *([Dd]my) *[|}]', -- 272
'{{ *[Uu]se (MDY) dates *[|}]', -- 173
'{{ *[Uu]se *(mdy) *[|}]', -- 59 + 12
'{{ *([Mm]dy) *[|}]', -- 9
'{{ *[Uu]se (MDY) *[|}]', -- 3
'{{ *([Dd]MY) *[|}]', -- 2
'{{ *([Mm]DY) *[|}]', -- 0
-- '{{ *[Uu]se(mdy) *[|}]',
-- '{{ *[Uu]se(mdy)dates *[|}]',
-- '{{ *[Uu]se(dmy) *[|}]',
}
 
local function get_date_format ()
local content = mw.title.getCurrentTitle():getContent() or ''; -- get the content of the article or ''; new pages edited w/ve do not have 'content' until saved; ve does not preview; phab:T221625
for _, pattern in ipairs (df_template_patterns) do -- loop through the patterns looking for {{Use dmy dates}} or {{Use mdy dates}} or any of their redirects
local start, _, match = content:find(pattern); -- match is the three letters indicating desired date format
if match then
content = content:match ('%b{}', start); -- get the whole template
if content:match ('| *cs1%-dates *= *[lsy][sy]?') then -- look for |cs1-dates=publication date length access-/archive-date length
return match:lower() .. '-' .. content:match ('| *cs1%-dates *= *([lsy][sy]?)');
else
return match:lower() .. '-all'; -- no |cs1-dates= k/v pair; return value appropriate for use in |df=
end
end
end
end
end
local global_df = get_date_format ();




Line 526: Line 405:
local keywords = {
local keywords = {
['yes_true_y'] = {'yes', 'true', 'y'}, -- ignore-isbn-error, last-author-amp, no-tracking, nopp, registration, subscription
['yes_true_y'] = {'yes', 'true', 'y'}, -- ignore-isbn-error, last-author-amp, no-tracking, nopp, registration, subscription
-- ['deadurl'] = {'yes', 'true', 'y', 'no', 'unfit', 'usurped', 'unfit no archive', 'usurped no archive'}, -- hidden 2016-04-10; see Help_talk:Citation_Style_1#Recycled_urls
['deadurl'] = {'yes', 'true', 'y', 'no', 'unfit', 'usurped', 'bot: unknown'},
['deadurl'] = {'yes', 'true', 'y', 'no', 'unfit', 'usurped', 'bot: unknown'},
['mode'] = {'cs1', 'cs2'},
['mode'] = {'cs1', 'cs2', 'mla'},
['name-list-format'] = {'vanc'},
['name-list-format'] = {'vanc'},
['contribution'] = {'afterword', 'foreword', 'introduction', 'preface'}, -- generic contribution titles that are rendered unquoted in the 'chapter' position
['contribution'] = {'afterword', 'foreword', 'introduction', 'preface'}, -- generic contribution titles that are rendered unquoted in the 'chapter' position
['date-format'] = {'dmy', 'dmy-all', 'mdy', 'mdy-all', 'ymd', 'ymd-all'},
['date-format'] = {'dmy', 'dmy-all', 'mdy', 'mdy-all', 'ymd', 'ymd-all'},
-- ['date-format'] = {'dmy', 'dmy-all', 'mdy', 'mdy-all', 'ymd', 'ymd-all', 'yMd', 'yMd-all'}, -- not supported at en.wiki
['url-access'] = {'subscription', 'limited', 'registration'},   -- access level of a URL (subscription required, limited access, free registration required), free to read by default
['url-access'] = {'subscription', 'limited', 'registration'}, -- access level of a URL (subscription required, limited access, registration required); free to read by default
    ['id-access'] = {'free'},                                         -- access level of an identifier (free to read), subscription required (or no full text) by default
['url-status'] = {'dead', 'live', 'unfit', 'usurped', 'bot: unknown'}, -- replacement for |dead-url=
['id-access'] = {'free'}, -- access level of an identifier (free to read); not free-to-read  by default
}
}


Line 557: Line 435:
table data in an arbitrary order.  Here, we want to process the table from top to bottom because the entries at
table data in an arbitrary order.  Here, we want to process the table from top to bottom because the entries at
the top of the table are also found in the ranges specified by the entries at the bottom of the table.
the top of the table are also found in the ranges specified by the entries at the bottom of the table.
This list contains patterns for templates like {{'}} which isn't an error but transcludes characters that are
invisible.  These kinds of patterns must be recognized by the functions that use this list.


Also here is a pattern that recognizes stripmarkers that begin and end with the delete characters.  The nowiki
Also here is a pattern that recognizes stripmarkers that begin and end with the delete characters.  The nowiki
Line 615: Line 496:


local script_lang_codes = {
local script_lang_codes = {
'am', 'ar', 'be', 'bg', 'bn', 'bs', 'dv', 'el', 'fa', 'gu', -- ISO 639-1 codes only for |script-title= and |script-chapter=
'am', 'ar', 'be', 'bg', 'bn', 'bs', 'dv', 'el', 'fa', -- ISO 639-1 codes only for |script-title= and |script-chapter=
'he', 'hi', 'hy', 'ja', 'ka', 'kk', 'km', 'kn', 'ko', 'ku',
'gu', 'he', 'hy', 'ja', 'ka', 'kn', 'ko', 'ku',
'mk', 'ml', 'mn', 'mr', 'my', 'ne', 'ps', 'ru', 'sd', 'si',
'mk', 'ml', 'mn', 'mr', 'my', 'ps', 'ru', 'sd',
'sr', 'ta', 'tg', 'th', 'ug', 'uk', 'ur', 'uz', 'yi', 'zh'
'sr', 'tg', 'th', 'uk', 'ug', 'ur', 'yi', 'zh'
};
};


Line 628: Line 509:
]]
]]


local lang_code_remap = { -- used for |language= and |script-title= / |script-chapter=
local lang_code_remap = { -- used for |language= and |script-title= / |script-chapter=
['als'] = 'Tosk Albanian', -- MediaWiki returns Alemannisch
['bh'] = 'Bihari', -- MediaWiki uses 'bh' as a subdomain name for Bhojpuri wWikipedia: bh.wikipedia.org
['bh'] = 'Bihari', -- MediaWiki uses 'bh' as a subdomain name for Bhojpuri wWikipedia: bh.wikipedia.org
['bn'] = 'Bengali', -- MediaWiki returns Bangla
['bn'] = 'Bengali', -- MediaWiki returns Bangla
['cnr'] = 'Montenegrin', -- 'new' 639 code that MediaWiki does not yet understand
['ca-valencia'] = 'Valencian', -- IETF variant of Catalan
}
['crh'] = 'Crimean Tatar', -- synonymous with Crimean Turkish (return value from {{#language:crh|en}})
}
 
local lang_name_remap = { -- used for |language=
['alemannisch'] = {'Swiss German', 'gsw'}, -- not an ISO or IANA language name; MediaWiki uses 'als' as a subdomain name for Alemannic Wikipedia: als.wikipedia.org
['bangla'] = {'Bengali', 'bn'}, -- MediaWiki returns Bangla (the endonym) but we want Bengali (the exonym); here we remap
['bengali'] = {'Bengali', 'bn'}, -- MediaWiki doesn't use exonym so here we provide correct language name and 639-1 code
['bihari'] = {'Bihari', 'bh'}, -- MediaWiki replaces 'Bihari' with 'Bhojpuri' so 'Bihari' cannot be found
['bhojpuri'] = {'Bhojpuri', 'bho'}, -- MediaWiki uses 'bh' as a subdomain name for Bhojpuri Wikipedia: bh.wikipedia.org
['crimean tatar'] = {'Crimean Tatar', 'crh'}, -- MediaWiki uses 'crh' as a subdomain name for Crimean Tatar Wikipedia: crh.wikipedia.org
['tosk albanian'] = {'Tosk Albanian', 'als'}, -- MediaWiki replaces 'Tosk Albanian' with 'Alemannisch' so 'Tosk Albanian' cannot be found
['valencian'] = {'Valencian', 'ca'}, -- variant of Catalan; categorizes as Catalan
}


local lang_name_remap = { -- used for |language=
['bangla'] = {'Bengali', 'bn'}, -- MediaWiki returns Bangla (the endonym) but we want Bengali (the exonym); here we remap
['bengali'] = {'Bengali', 'bn'}, -- MediaWiki doesn't use exonym so here we provide correct language name and 639-1 code
['bihari'] = {'Bihari', 'bh'}, -- MediaWiki replaces 'Bihari' with 'Bhojpuri' so 'Bihari' cannot be found
['bhojpuri'] = {'Bhojpuri', 'bho'}, -- MediaWiki uses 'bh' as a subdomain name for Bhojpuri wWikipedia: bh.wikipedia.org
['montenegrin'] = {'Montenegrin', 'cnr'}, -- 'new' 639 code that MediaWiki does not yet understand
}


--[[--------------------------< M A I N T E N A N C E _ C A T E G O R I E S >----------------------------------
--[[--------------------------< M A I N T E N A N C E _ C A T E G O R I E S >----------------------------------
Line 656: Line 531:
local maint_cats = {
local maint_cats = {
['ASIN'] = 'CS1 maint: ASIN uses ISBN',
['ASIN'] = 'CS1 maint: ASIN uses ISBN',
['archived_copy'] = 'CS1 maint: archived copy as title',
['archived_copy'] = 'CS1 maint: Archived copy as title',
['authors'] = 'CS1 maint: uses authors parameter',
['authors'] = 'CS1 maint: Uses authors parameter',
['bot:_unknown'] = 'CS1 maint: BOT: original-url status unknown',
['bot:_unknown'] = 'CS1 maint: BOT: original-url status unknown',
['date_format'] = 'CS1 maint: date format',
['date_format'] = 'CS1 maint: Date format',
['date_year'] = 'CS1 maint: date and year',
['date_year'] = 'CS1 maint: Date and year',
['disp_name'] = 'CS1 maint: display-$1', -- $1 is authors, contributors, editors, interviewers, translators; gets value from special_case_translation table
['disp_auth_ed'] = 'CS1 maint: display-$1', -- $1 is authors or editors; gets value from special_case_translation table
['editors'] = 'CS1 maint: uses editors parameter',
['editors'] = 'CS1 maint: Uses editors parameter',
['embargo'] = 'CS1 maint: PMC embargo expired',
['embargo'] = 'CS1 maint: PMC embargo expired',
['extra_punct'] = 'CS1 maint: extra punctuation',
['english'] = 'CS1 maint: English language specified',
['extra_text'] = 'CS1 maint: extra text',
['etal'] = 'CS1 maint: Explicit use of et al.',
['extra_text_names'] = 'CS1 maint: extra text: $1', -- $1 is <name>s list; gets value from special_case_translation table
['extra_text'] = 'CS1 maint: Extra text',
['ignore_isbn_err'] = 'CS1 maint: ignored ISBN errors',
['extra_text_names'] = 'CS1 maint: Extra text: $1', -- $1 is <name>s list; gets value from special_case_translation table
['mult_names'] = 'CS1 maint: multiple names: $1', -- $1 is <name>s list; gets value from special_case_translation table
['ignore_isbn_err'] = 'CS1 maint: Ignored ISBN errors',
['others'] = 'CS1 maint: others',
['interviewers'] = 'CS1 maint: Uses interviewers parameter',
['missing_pipe'] = 'CS1 maint: Missing pipe',
['mult_names'] = 'CS1 maint: Multiple names: $1', -- $1 is <name>s list; gets value from special_case_translation table
['pmc_format'] = 'CS1 maint: PMC format',
['pmc_format'] = 'CS1 maint: PMC format',
['unfit'] = 'CS1 maint: unfit url',
['unfit'] = 'CS1 maint: Unfit url',
['unknown_lang'] = 'CS1 maint: unrecognized language',
['unknown_lang'] = 'CS1 maint: Unrecognized language',
['untitled'] = 'CS1 maint: untitled periodical',
['untitled'] = 'CS1 maint: Untitled periodical',
['zbl'] = 'CS1 maint: ZBL',
}
}


Line 686: Line 562:
local prop_cats = {
local prop_cats = {
['foreign_lang_source'] = 'CS1 $1-language sources ($2)', -- |language= categories; $1 is language name, $2 is ISO639-1 code
['foreign_lang_source'] = 'CS1 $1-language sources ($2)', -- |language= categories; $1 is language name, $2 is ISO639-1 code
['foreign_lang_source_2'] = 'CS1 foreign language sources (ISO 639-2)|$1', -- |language= category; a cat for ISO639-2 languages; $1 is the ISO 639-2 code used as a sort key
['foreign_lang_source_2'] = 'CS1 foreign language sources (ISO 639-2)|$1', -- |language= category; a cat for ISO639-2 languages; $1 is the ISO 639-2 code
['script'] = 'CS1 uses foreign language script', -- when language specified by |script-title=xx: doesn't have its own category
['script'] = 'CS1 uses foreign language script', -- when language specified by |script-title=xx: doesn't have its own category
['script_with_name'] = 'CS1 uses $1-language script ($2)', -- |script-title=xx: has matching category; $1 is language name, $2 is ISO639-1 code
['script_with_name'] = 'CS1 uses $1-language script ($2)', -- |script-title=xx: has matching category; $1 is language name, $2 is ISO639-1 code
['jul_greg_uncertainty'] = 'CS1: Julian–Gregorian uncertainty', -- probably temporary cat to identify scope of template with dates 1 October 1582 – 1 January 1926
['jul_greg_uncertainty'] = 'CS1: Julian–Gregorian uncertainty', -- probably temporary cat to identify scope of template with dates 1 October 1582 – 1 January 1926
['long_vol'] = 'CS1: long volume value', -- probably temporary cat to identify scope of |volume= values longer than 4 charachters
}
}


Line 729: Line 604:
anchor = 'accessdate_missing_url',
anchor = 'accessdate_missing_url',
category = 'Pages using citations with accessdate and no URL',
category = 'Pages using citations with accessdate and no URL',
hidden = false
},
apostrophe_markup = {
message = 'Italic or bold markup not allowed in: <code class="cs1-code">&#124;$1=</code>',
anchor = 'apostrophe_markup',
category = 'CS1 errors: markup',
hidden = false
hidden = false
  },
  },
Line 963: Line 832:
anchor = 'deprecated_params',
anchor = 'deprecated_params',
category = 'CS1 errors: deprecated parameters',
category = 'CS1 errors: deprecated parameters',
hidden = true
},
doibroken_missing_doi = {
message = '<code class="cs1-code">&#124;$1=</code> requires <code class="cs1-code">&#124;doi=</code>',
anchor = 'doibroken_missing_doi',
category = 'CS1 errors: DOI',
hidden = false
hidden = false
},
},
Line 975: Line 838:
anchor = 'empty_citation',
anchor = 'empty_citation',
category = 'Pages with empty citations',
category = 'Pages with empty citations',
hidden = false
},
etal = {
message = 'Explicit use of et al. in: <code class="cs1-code">&#124;$1=</code>',
anchor = 'explicit_et_al',
category = 'CS1 errors: explicit use of et al.',
hidden = false
hidden = false
},
},
first_missing_last = {
first_missing_last = {
message = '<code class="cs1-code">&#124;$1=</code> missing <code class="cs1-code">&#124;$2=</code>', -- $1 is first alias, $2 is matching last alias
message = '<code class="cs1-code">&#124;first$2=</code> missing <code class="cs1-code">&#124;last$2=</code> in $1',
anchor = 'first_missing_last',
anchor = 'first_missing_last',
category = 'CS1 errors: missing name', -- author, contributor, editor, interviewer, translator
category = 'CS1 errors: missing author or editor',
hidden = false
hidden = false
},
},
Line 1,008: Line 865:
},
},
missing_name = {
missing_name = {
message = 'Missing <code class="cs1-code">&#124;$1$2=</code>', -- $1 is modified NameList; $2 is enumerator
message = 'Missing <code class="cs1-code">&#124;last$2=</code> in $1',
anchor = 'missing_name',
anchor = 'missing_name',
category = 'CS1 errors: missing name', -- author, contributor, editor, interviewer, translator
category = 'CS1 errors: missing author or editor',
hidden = false
},
missing_periodical = {
message = 'Cite $1 requires <code class="cs1-code">&#124;$2=</code>', -- $1 is cs1 template name; $2 is canonical periodical parameter name for cite $1
anchor = 'missing_periodical',
category = 'CS1 errors: missing periodical',
hidden = true
},
missing_pipe = {
message = 'Missing pipe in: <code class="cs1-code">&#124;$1=</code>',
anchor = 'missing_pipe',
category = 'CS1 errors: missing pipe',
hidden = false
hidden = false
},
},
Line 1,053: Line 898:
anchor = 'redundant_parameters',
anchor = 'redundant_parameters',
category = 'Pages with citations having redundant parameters',
category = 'Pages with citations having redundant parameters',
hidden = false
},
script_parameter = {
message = 'Invalid <code class="cs1-code">&#124;$1=</code>: $2',
anchor = 'script_parameter',
category = 'CS1 errors: script parameters',
hidden = false
hidden = false
},
},
Line 1,143: Line 982:
label = 'Bibcode',
label = 'Bibcode',
mode = 'manual',
mode = 'manual',
prefix = 'https://ui.adsabs.harvard.edu/abs/',
prefix = 'http://adsabs.harvard.edu/abs/',
encode = false,
encode = false,
COinS = 'info:bibcode',
COinS = 'info:bibcode',
Line 1,392: Line 1,231:




--[[--------------------------< E X P O R T E D  T A B L E S >------------------------------------------------
--[[--------------------------< E X P O R T S >----------------------------------------------------------------
]]
]]


Line 1,401: Line 1,240:
date_names = date_names,
date_names = date_names,
error_conditions = error_conditions,
error_conditions = error_conditions,
editor_markup_patterns = editor_markup_patterns,
et_al_patterns = et_al_patterns,
global_df = global_df,
id_handlers = id_handlers,
id_handlers = id_handlers,
keywords = keywords,
keywords = keywords,
Line 1,413: Line 1,249:
presentation = presentation,
presentation = presentation,
prop_cats = prop_cats,
prop_cats = prop_cats,
punct_skip = punct_skip,
script_lang_codes = script_lang_codes,
script_lang_codes = script_lang_codes,
lang_code_remap = lang_code_remap,
lang_code_remap = lang_code_remap,