Module:Citation/CS1/Configuration: Difference between revisions
Jump to navigation
Jump to search
m 1 revision imported |
>Trappist the monk No edit summary |
||
(13 intermediate revisions by 5 users not shown) | |||
Line 1: | Line 1: | ||
local lang_obj = mw.language.getContentLanguage(); -- make a language object for the local language; used here for languages and dates | |||
--[[--------------------------< S E T T I N G S >-------------------------------------------------------------- | |||
boolean settings used to control various things. these setting located here to make them easy to find | |||
]] | |||
-- these settings local to this module only | |||
local local_digits_from_mediawiki = false; -- for i18n; when true, module fills date_names['local_digits'] from MediaWiki; manual fill required else; always false at en.wiki | |||
local local_date_names_from_mediawiki = false; -- for i18n; when true, module fills date_names['local']['long'] and date_names['local']['short'] from MediaWiki; | |||
-- manual translation required else; ; always false at en.wiki | |||
-- these settings exported to other modules | |||
local use_identifier_redirects = true; -- when true use redirect name for identifier label links; always true at en.wiki | |||
local local_lang_cat_enable = false; -- when true categorizes pages where |language=<local wiki's language>; always false at en.wiki | |||
local date_name_auto_xlate_enable = false; -- when true translates English month-names to the local-wiki's language month names; always false at en.wiki | |||
local date_digit_auto_xlate_enable = false; -- when true translates Western date digit to the local-wiki's language digits (date_names['local_digits']); always false at en.wiki | |||
local enable_sort_keys = true; -- when true module adds namespace sort keys to error and maintenance category links | |||
--[[--------------------------< 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 >------------------------------ | ||
List of namespaces that | List of namespaces identifiers for namespaces that will not be included in citation error categories. | ||
Same as setting notracking = true by default. | |||
For wikis that have a current version of Module:cs1 documentation support, this #invoke will return an unordered | |||
list of namespace names and their associated identifiers: | |||
{{#invoke:cs1 documentation support|uncategorized_namespace_lister|all=<anything>}} | |||
]] | ]] | ||
local | local uncategorized_namespaces_t = {[2]=true}; -- init with user namespace id | ||
for k, _ in pairs (mw.site.talkNamespaces) do -- add all talk namespace ids | |||
uncategorized_namespaces_t[k] = true; | |||
end | |||
local uncategorized_subpages = {'/[Ss]andbox', '/[Tt]estcases', '/[^/]*[Ll]og', '/[Aa]rchive'}; -- list of Lua patterns found in page names of pages we should not categorize | |||
--[[ | |||
at en.wiki Greek characters are used as sort keys for certain items in a category so that those items are | |||
placed at the end of a category page. See Wikipedia:Categorization#Sort_keys. That works well for en.wiki | |||
because English is written using the Latn script. This may not work well for other languages. At en.wiki it | |||
is desireable to place content from certain namespaces at the end of a category listing so the module adds sort | |||
keys to error and maintenance category links when rendering a cs1|2 template on a page in that namespace. | |||
i18n: if this does not work well for your language, set <enable_sort_keys> to false. | |||
]] | |||
local name_space_sort_keys = { -- sort keys to be used with these namespaces: | |||
[4] = 'ω', -- wikipedia; omega | |||
[10] = 'τ', -- template; tau | |||
[118] = 'Δ', -- draft; delta | |||
['other'] = 'ο', -- all other non-talk namespaces except main (article); omicron | |||
} | |||
--[[--------------------------< M E S S A G E S >-------------------------------------------------------------- | --[[--------------------------< M E S S A G E S >-------------------------------------------------------------- | ||
Line 26: | Line 69: | ||
['archived-dead'] = 'Archived from $1 on $2', | ['archived-dead'] = 'Archived from $1 on $2', | ||
['archived-live'] = '$1 from the original on $2', | ['archived-live'] = '$1 from the original on $2', | ||
['archived-unfit'] = 'Archived from the original on ', | ['archived-unfit'] = 'Archived from the original on ', | ||
['archived'] = 'Archived', | ['archived'] = 'Archived', | ||
Line 33: | Line 75: | ||
['editor'] = 'ed.', | ['editor'] = 'ed.', | ||
['editors'] = 'eds.', | ['editors'] = 'eds.', | ||
['edition'] = '($1 ed.)', | ['edition'] = '($1 ed.)', | ||
['episode'] = 'Episode $1', | ['episode'] = 'Episode $1', | ||
['et al'] = 'et al.', | ['et al'] = 'et al.', | ||
['in'] = 'In', -- edited works | ['in'] = 'In', -- edited works | ||
['inactive'] = 'inactive', | ['inactive'] = 'inactive', | ||
['inset'] = '$1 inset', | ['inset'] = '$1 inset', | ||
['interview'] = 'Interviewed by $1', | ['interview'] = 'Interviewed by $1', | ||
[' | ['mismatch'] = '<code class="cs1-code">|$1=</code> / <code class="cs1-code">|$2=</code> mismatch', -- $1 is year param name; $2 is date param name | ||
['newsgroup'] = '[[Usenet newsgroup|Newsgroup]]: $1', | ['newsgroup'] = '[[Usenet newsgroup|Newsgroup]]: $1', | ||
['notitle'] = 'No title', -- for |title=(()) and (in the future) |title=none | |||
['original'] = 'the original', | ['original'] = 'the original', | ||
[' | ['origdate'] = ' [$1]', | ||
['published'] = ' (published $1)', | ['published'] = ' (published $1)', | ||
['retrieved'] = 'Retrieved $1', | ['retrieved'] = 'Retrieved $1', | ||
['season'] = 'Season $1', | ['season'] = 'Season $1', | ||
['section'] = '§ $1', | ['section'] = '§ $1', | ||
['sections'] = '§§ $1', | ['sections'] = '§§ $1', | ||
['series'] = '$1 $2', -- $1 is sepc, $2 is series | ['series'] = '$1 $2', -- $1 is sepc, $2 is series | ||
['seriesnum'] = 'Series $1', | ['seriesnum'] = 'Series $1', | ||
Line 56: | Line 99: | ||
['vol'] = '$1 Vol. $2', -- $1 is sepc; bold journal style volume is in presentation{} | ['vol'] = '$1 Vol. $2', -- $1 is sepc; bold journal style volume is in presentation{} | ||
['vol-no'] = '$1 Vol. $2 no. $3', | ['vol-no'] = '$1 Vol. $2, no. $3', -- sepc, volume, issue (alternatively insert $1 after $2, but then we'd also have to change capitalization) | ||
['issue'] = '$1 No. $2', -- $1 is sepc | ['issue'] = '$1 No. $2', -- $1 is sepc | ||
['art'] = '$1 Art. $2', -- $1 is sepc; for {{cite conference}} only | |||
['vol-art'] = '$1 Vol. $2, art. $3', -- sepc, volume, article-number; for {{cite conference}} only | |||
['j-vol'] = '$1 $2', -- sepc, volume; bold journal volume is in presentation{} | ['j-vol'] = '$1 $2', -- sepc, volume; bold journal volume is in presentation{} | ||
['j-issue'] = ' ($1)', | ['j-issue'] = ' ($1)', | ||
['j-article-num'] = ' $1', -- TODO: any punctuation here? static text? | |||
['nopp'] = '$1 $2'; -- page(s) without prefix; $1 is sepc | ['nopp'] = '$1 $2'; -- page(s) without prefix; $1 is sepc | ||
Line 77: | Line 124: | ||
['event'] = 'Event occurs at', | ['event'] = 'Event occurs at', | ||
['minutes'] = 'minutes in', | ['minutes'] = 'minutes in', | ||
-- Determines the location of the help page | -- Determines the location of the help page | ||
Line 86: | Line 129: | ||
['help page label'] = 'help', | ['help page label'] = 'help', | ||
-- categories | |||
['cat wikilink'] = '[[Category:$1]]', -- $1 is the category name | |||
['cat wikilink sk'] = '[[Category:$1|$2]]', -- $1 is the category name; $2 is namespace sort key | |||
[':cat wikilink'] = '[[:Category:$1|link]]', -- category name as maintenance message wikilink; $1 is the category name | |||
-- Internal errors (should only occur if configuration is bad) | -- Internal errors (should only occur if configuration is bad) | ||
['undefined_error'] = 'Called with an undefined error condition', | ['undefined_error'] = 'Called with an undefined error condition', | ||
[' | ['unknown_ID_key'] = 'Unrecognized ID key: ', -- an ID key in id_handlers not found in ~/Identifiers func_map{} | ||
[' | ['unknown_ID_access'] = 'Unrecognized ID access keyword: ', -- an ID access keyword in id_handlers not found in keywords_lists['id-access']{} | ||
['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 | ['bare_url_no_origin'] = 'Bare URL found but origin indicator is nil or empty', | ||
['warning_msg_e'] = '<span style="color:#d33">One or more <code style="color: inherit; background: inherit; border: none; padding: inherit;">{{$1}}</code> templates have errors</span>; messages may be hidden ([[Help:CS1_errors#Controlling_error_message_display|help]]).'; -- $1 is template link | |||
['warning_msg_m'] = '<span style="color:#3a3">One or more <code style="color: inherit; background: inherit; border: none; padding: inherit;">{{$1}}</code> templates have maintenance messages</span>; messages may be hidden ([[Help:CS1_errors#Controlling_error_message_display|help]]).'; -- $1 is template link | |||
} | } | ||
--[[--------------------------< C I T A T I O N _ C L A S S _ M A P >------------------------------------------ | |||
this table maps the value assigned to |CitationClass= in the cs1|2 templates to the canonical template name when | |||
the value assigned to |CitationClass= is different from the canonical template name. |CitationClass= values are | |||
used as class attributes in the <cite> tag that encloses the citation so these names may not contain spaces while | |||
the canonical template name may. These names are used in warning_msg_e and warning_msg_m to create links to the | |||
template's documentation when an article is displayed in preview mode. | |||
Most cs1|2 template |CitationClass= values at en.wiki match their canonical template names so are not listed here. | |||
]] | |||
local citation_class_map_t = { -- TODO: if kept, these and all other config.CitationClass 'names' require some sort of i18n | |||
['arxiv'] = 'arXiv', | |||
['audio-visual'] = 'AV media', | |||
['AV-media-notes'] = 'AV media notes', | |||
['biorxiv'] = 'bioRxiv', | |||
['citeseerx'] = 'CiteSeerX', | |||
['encyclopaedia'] = 'encyclopedia', | |||
['mailinglist'] = 'mailing list', | |||
['medrxiv'] = 'medRxiv', | |||
['pressrelease'] = 'press release', | |||
['ssrn'] = 'SSRN', | |||
['techreport'] = 'tech report', | |||
} | |||
Line 103: | Line 181: | ||
local et_al_patterns = { | local et_al_patterns = { | ||
"[;,]? *[\"']*%f[%a][Ee][Tt]%.? *[Aa][Ll][%.\"']*$", -- variations on the 'et al' theme | "[;,]? *[\"']*%f[%a][Ee][Tt]%.? *[Aa][Ll][%.;,\"']*$", -- variations on the 'et al' theme | ||
"[;,]? *[\"']*%f[%a][Ee][Tt]%.? *[Aa][Ll][Ii][ | "[;,]? *[\"']*%f[%a][Ee][Tt]%.? *[Aa][Ll][Ii][AaIi][Ee]?[%.;,\"']*$", -- variations on the 'et alia', 'et alii' and 'et aliae' themes (false positive 'et aliie' unlikely to match) | ||
"[;,]? *%f[%a]and [Oo]thers", -- | "[;,]? *%f[%a]and [Oo]thers", -- an alternative to et al. | ||
"%[%[ *[Ee][Tt]%.? *[Aa][Ll]%.? *%]%]", -- a wikilinked form | "%[%[ *[Ee][Tt]%.? *[Aa][Ll]%.? *%]%]", -- a wikilinked form | ||
"%(%( *[Ee][Tt]%.? *[Aa][Ll]%.? *%)%)", -- a double-bracketed form (to counter partial removal of ((...)) syntax) | |||
"[%(%[] *[Ee][Tt]%.? *[Aa][Ll]%.? *[%)%]]", -- a bracketed form | "[%(%[] *[Ee][Tt]%.? *[Aa][Ll]%.? *[%)%]]", -- a bracketed form | ||
} | } | ||
--[[--------------------------< E | --[[--------------------------< P R E S E N T A T I O N >------------------------ | ||
Fixed presentation markup. Originally part of citation_config.messages it has | |||
been moved into its own, more semantically correct place. | |||
Fixed presentation markup. Originally part of citation_config.messages it has been moved into its own, more semantically | |||
correct place. | |||
]] | ]] | ||
Line 144: | Line 199: | ||
local presentation = | local presentation = | ||
{ | { | ||
-- .citation-comment class is specified at Help:CS1_errors#Controlling_error_message_display | -- .citation-comment class is specified at Help:CS1_errors#Controlling_error_message_display | ||
['hidden-error'] = '<span class="cs1-hidden- | ['hidden-error'] = '<span class="cs1-hidden-error citation-comment">$1</span>', | ||
['visible-error'] = '<span class="cs1-visible- | ['visible-error'] = '<span class="cs1-visible-error citation-comment">$1</span>', | ||
['hidden-maint'] = '<span class="cs1-maint 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 | ['accessdate'] = '<span class="reference-accessdate">$1$2</span>', -- to allow editors to hide accessdate using personal CSS | ||
['bdi'] = '<bdi$1>$2</bdi>', -- bidirectional isolation used with |script-title= and the like | ['bdi'] = '<bdi$1>$2</bdi>', -- bidirectional isolation used with |script-title= and the like | ||
['cite'] = '<cite class="$1">$2</cite>'; -- |ref= not set so no id="..." attribute | ['cite'] = '<cite class="$1">$2</cite>'; -- for use when citation does not have a namelist and |ref= not set so no id="..." attribute | ||
['cite-id'] = '<cite id="$1" class="$2">$3</cite>'; -- for use when |ref= is set | ['cite-id'] = '<cite id="$1" class="$2">$3</cite>'; -- for use when when |ref= is set or when citation has a namelist | ||
['format'] = ' <span class="cs1-format">($1)</span>', -- for |format=, |chapter-format=, etc. | |||
['interwiki'] = ' <span class="cs1-format">[in $1]</span>', -- for interwiki-language-linked author, editor, etc | |||
['interproj'] = ' <span class="cs1-format">[at $1]</span>', -- for interwiki-project-linked author, editor, etc (:d: and :s: supported; :w: ignored) | |||
-- various access levels, for |access=, |doi-access=, |arxiv=, ... | |||
-- narrow no-break space   may work better than nowrap CSS. Or not? Browser support? | |||
['ext-link-access-signal'] = '<span class="$1" title="$2">$3</span>', -- external link with appropriate lock icon | ['ext-link-access-signal'] = '<span class="$1" title="$2">$3</span>', -- external link with appropriate lock icon | ||
['free'] = {class=' | ['free'] = {class='id-lock-free', title='Freely accessible'}, -- classes defined in Module:Citation/CS1/styles.css | ||
['registration'] = {class=' | ['registration'] = {class='id-lock-registration', title='Free registration required'}, | ||
['limited'] = {class=' | ['limited'] = {class='id-lock-limited', title='Free access subject to limited trial, subscription normally required'}, | ||
['subscription'] = {class=' | ['subscription'] = {class='id-lock-subscription', title='Paid subscription required'}, | ||
['interwiki-icon'] = '<span class="$1" title="$2">$3</span>', | ['interwiki-icon'] = '<span class="$1" title="$2">$3</span>', | ||
Line 174: | Line 229: | ||
['italic-title'] = "''$1''", | ['italic-title'] = "''$1''", | ||
['kern-left'] = '<span class="cs1-kern-left"> | ['kern-left'] = '<span class="cs1-kern-left"></span>$1', -- spacing to use when title contains leading single or double quote mark | ||
['kern-right'] = '$1<span class="cs1-kern-right"> | ['kern-right'] = '$1<span class="cs1-kern-right"></span>', -- spacing to use when title contains trailing single or double quote mark | ||
['nowrap1'] = '<span class="nowrap">$1</span>', -- for nowrapping an item: <span ...>yyyy-mm-dd</span> | ['nowrap1'] = '<span class="nowrap">$1</span>', -- for nowrapping an item: <span ...>yyyy-mm-dd</span> | ||
Line 189: | Line 238: | ||
['parameter'] = '<code class="cs1-code">|$1=</code>', | ['parameter'] = '<code class="cs1-code">|$1=</code>', | ||
['ps_cs1'] = '.'; -- | ['ps_cs1'] = '.'; -- CS1 style postscript (terminal) character | ||
['ps_cs2'] = ''; -- | ['ps_cs2'] = ''; -- CS2 style postscript (terminal) character (empty string) | ||
['quoted-text'] = '<q>$1</q>', -- for wrapping |quote= content | ['quoted-text'] = '<q>$1</q>', -- for wrapping |quote= content | ||
['quoted-title'] = '"$1"', | ['quoted-title'] = '"$1"', | ||
['sep_cs1'] = '.', -- | ['sep_cs1'] = '.', -- CS1 element separator | ||
['sep_cs2'] = ',', -- | ['sep_cs2'] = ',', -- CS2 separator | ||
['sep_nl'] = ';', -- | ['sep_nl'] = ';', -- CS1|2 style name-list separator between names is a semicolon | ||
['sep_name'] = ', ', -- | ['sep_nl_and'] = ' and ', -- used as last nl sep when |name-list-style=and and list has 2 items | ||
['sep_nl_end'] = '; and ', -- used as last nl sep when |name-list-style=and and list has 3+ names | |||
['sep_name'] = ', ', -- CS1|2 style last/first separator is <comma><space> | |||
['sep_nl_vanc'] = ',', -- Vancouver style name-list separator between authors is a comma | ['sep_nl_vanc'] = ',', -- Vancouver style name-list separator between authors is a comma | ||
['sep_name_vanc'] = ' ', -- Vancouver style last/first separator is a space | ['sep_name_vanc'] = ' ', -- Vancouver style last/first separator is a space | ||
['sep_list'] = ', ', -- used for |language= when list has 3+ items except for last sep which uses sep_list_end | |||
['sep_list_pair'] = ' and ', -- used for |language= when list has 2 items | |||
['sep_list_end'] = ', and ', -- used as last list sep for |language= when list has 3+ items | |||
['trans-italic-title'] = "[''$1'']", | ['trans-italic-title'] = "[''$1'']", | ||
['trans-quoted-title'] = "[$1]", | ['trans-quoted-title'] = "[$1]", -- for |trans-title= and |trans-quote= | ||
['vol-bold'] = '$1 <b>$2</b>', -- sepc, volume; for bold journal cites; for other cites ['vol'] in messages{} | ['vol-bold'] = '$1 <b>$2</b>', -- sepc, volume; for bold journal cites; for other cites ['vol'] in messages{} | ||
} | } | ||
--[[--------------------------< A L I A S E S > | --[[--------------------------< A L I A S E S >--------------------------------- | ||
Aliases table for commonly passed parameters. | Aliases table for commonly passed parameters. | ||
Parameter names on the right side in the | Parameter names on the right side in the assignments in this table must have been | ||
before they will be recognized as valid parameter names | defined in the Whitelist before they will be recognized as valid parameter names | ||
]] | ]] | ||
Line 224: | Line 279: | ||
['ArchiveFormat'] = 'archive-format', | ['ArchiveFormat'] = 'archive-format', | ||
['ArchiveURL'] = {'archive-url', 'archiveurl'}, -- Used by InternetArchiveBot | ['ArchiveURL'] = {'archive-url', 'archiveurl'}, -- Used by InternetArchiveBot | ||
['ArticleNumber'] = 'article-number', | |||
['ASINTLD'] = 'asin-tld', | ['ASINTLD'] = 'asin-tld', | ||
['At'] = 'at', -- Used by InternetArchiveBot | ['At'] = 'at', -- Used by InternetArchiveBot | ||
['Authors'] = { | ['Authors'] = {'people', 'credits'}, | ||
['BookTitle'] = {'book-title', 'booktitle'}, | ['BookTitle'] = {'book-title', 'booktitle'}, | ||
['Cartography'] = 'cartography', | ['Cartography'] = 'cartography', | ||
['Chapter'] = {'chapter', 'contribution', 'entry', 'article', 'section'}, | ['Chapter'] = {'chapter', 'contribution', 'entry', 'article', 'section'}, | ||
['ChapterFormat'] = {'chapter-format', 'contribution-format', 'entry-format', 'article-format', 'section-format'}; | ['ChapterFormat'] = {'chapter-format', 'contribution-format', 'entry-format', | ||
['ChapterURL'] = {'chapter-url | 'article-format', 'section-format'}; | ||
['ChapterUrlAccess'] = {'chapter-url-access', 'contribution-url-access', 'entry-url-access', 'article-url-access', 'section-url-access'}, -- Used by InternetArchiveBot | ['ChapterURL'] = {'chapter-url', 'contribution-url', 'entry-url', 'article-url', 'section-url'}, -- Used by InternetArchiveBot | ||
['Class'] = 'class', -- cite arxiv and arxiv | ['ChapterUrlAccess'] = {'chapter-url-access', 'contribution-url-access', | ||
'entry-url-access', 'article-url-access', 'section-url-access'}, -- Used by InternetArchiveBot | |||
['Class'] = 'class', -- cite arxiv and arxiv identifier | |||
['Collaboration'] = 'collaboration', | ['Collaboration'] = 'collaboration', | ||
['Conference'] = {'conference', 'event'}, | ['Conference'] = {'conference', 'event'}, | ||
['ConferenceFormat'] = | ['ConferenceFormat'] = 'conference-format', | ||
['ConferenceURL'] = | ['ConferenceURL'] = 'conference-url', -- Used by InternetArchiveBot | ||
['Date'] = {'date', 'air-date', 'airdate'}, -- air-date and airdate for cite episode and cite serial only | ['Date'] = {'date', 'air-date', 'airdate'}, -- air-date and airdate for cite episode and cite serial only | ||
['Degree'] = 'degree', | ['Degree'] = 'degree', | ||
['DF'] = 'df', | ['DF'] = 'df', | ||
['DisplayAuthors'] = {'display-authors', ' | ['DisplayAuthors'] = {'display-authors', 'display-subjects'}, | ||
['DisplayContributors'] = 'display-contributors', | ['DisplayContributors'] = 'display-contributors', | ||
['DisplayEditors'] = | ['DisplayEditors'] = 'display-editors', | ||
['DisplayInterviewers'] = 'display-interviewers', | ['DisplayInterviewers'] = 'display-interviewers', | ||
['DisplayTranslators'] = 'display-translators', | ['DisplayTranslators'] = 'display-translators', | ||
['Docket'] = 'docket', | ['Docket'] = 'docket', | ||
['DoiBroken'] = | ['DoiBroken'] = 'doi-broken-date', | ||
['Edition'] = 'edition', | ['Edition'] = 'edition', | ||
['Embargo'] = 'pmc-embargo-date', | |||
['Embargo'] = 'embargo', | |||
['Encyclopedia'] = {'encyclopedia', 'encyclopaedia', 'dictionary'}, -- cite encyclopedia only | ['Encyclopedia'] = {'encyclopedia', 'encyclopaedia', 'dictionary'}, -- cite encyclopedia only | ||
['Episode'] = 'episode', -- cite serial only TODO: make available to cite episode? | ['Episode'] = 'episode', -- cite serial only TODO: make available to cite episode? | ||
['Format'] = 'format', | ['Format'] = 'format', | ||
['ID'] = {'id', 'ID'}, | ['ID'] = {'id', 'ID'}, | ||
['Inset'] = 'inset', | ['Inset'] = 'inset', | ||
['Issue'] = {'issue', 'number'}, | ['Issue'] = {'issue', 'number'}, | ||
['Language'] = {'language', 'lang'}, | ['Language'] = {'language', 'lang'}, | ||
['MailingList'] = {'mailing-list', 'mailinglist'}, -- cite mailing list only | ['MailingList'] = {'mailing-list', 'mailinglist'}, -- cite mailing list only | ||
['Map'] = 'map', -- cite map only | ['Map'] = 'map', -- cite map only | ||
Line 271: | Line 322: | ||
['Minutes'] = 'minutes', | ['Minutes'] = 'minutes', | ||
['Mode'] = 'mode', | ['Mode'] = 'mode', | ||
[' | ['NameListStyle'] = 'name-list-style', | ||
['Network'] = 'network', | ['Network'] = 'network', | ||
['Newsgroup'] = 'newsgroup', -- cite newsgroup only | ['Newsgroup'] = 'newsgroup', -- cite newsgroup only | ||
['NoPP'] = {'no-pp', 'nopp'}, | ['NoPP'] = {'no-pp', 'nopp'}, | ||
['NoTracking'] = {' | ['NoTracking'] = {'no-tracking', 'template-doc-demo'}, | ||
['Number'] = 'number', -- this case only for cite techreport | ['Number'] = 'number', -- this case only for cite techreport | ||
[' | ['OrigDate'] = {'orig-date', 'orig-year', 'origyear'}, | ||
['Others'] = 'others', | ['Others'] = 'others', | ||
['Page'] = {'page', 'p'}, -- Used by InternetArchiveBot | ['Page'] = {'page', 'p'}, -- Used by InternetArchiveBot | ||
Line 288: | Line 339: | ||
['PublisherName'] = {'publisher', 'institution'}, | ['PublisherName'] = {'publisher', 'institution'}, | ||
['Quote'] = {'quote', 'quotation'}, | ['Quote'] = {'quote', 'quotation'}, | ||
['QuotePage'] = 'quote-page', | |||
['QuotePages'] = 'quote-pages', | |||
['Ref'] = 'ref', | ['Ref'] = 'ref', | ||
['Scale'] = 'scale', | ['Scale'] = 'scale', | ||
['ScriptChapter'] = {'script-chapter', 'script-contribution', 'script-entry', 'script-article', 'script-section'}, | ['ScriptChapter'] = {'script-chapter', 'script-contribution', 'script-entry', | ||
'script-article', 'script-section'}, | |||
['ScriptEncyclopedia'] = {'script-encyclopedia', 'script-encyclopaedia'}, -- cite encyclopedia only | |||
['ScriptMap'] = 'script-map', | ['ScriptMap'] = 'script-map', | ||
['ScriptPeriodical'] = {'script-journal', 'script-magazine', 'script-newspaper', 'script-periodical', 'script-website', 'script-work'}, | ['ScriptPeriodical'] = {'script-journal', 'script-magazine', 'script-newspaper', | ||
'script-periodical', 'script-website', 'script-work'}, | |||
['ScriptQuote'] = 'script-quote', | |||
['ScriptTitle'] = 'script-title', -- Used by InternetArchiveBot | ['ScriptTitle'] = 'script-title', -- Used by InternetArchiveBot | ||
['Season'] = 'season', | ['Season'] = 'season', | ||
['Sections'] = 'sections', -- cite map only | ['Sections'] = 'sections', -- cite map only | ||
['Series'] = {'series', 'version'}, | ['Series'] = {'series', 'version'}, | ||
['SeriesLink'] = {'series-link', 'serieslink'}, | ['SeriesLink'] = {'series-link', 'serieslink'}, | ||
['SeriesNumber'] = {'series-number', 'series-no | ['SeriesNumber'] = {'series-number', 'series-no'}, | ||
['Sheet'] = 'sheet', -- cite map only | ['Sheet'] = 'sheet', -- cite map only | ||
['Sheets'] = 'sheets', -- cite map only | ['Sheets'] = 'sheets', -- cite map only | ||
['Station'] = 'station', | ['Station'] = 'station', | ||
['Time'] = 'time', | ['Time'] = 'time', | ||
['TimeCaption'] = | ['TimeCaption'] = 'time-caption', | ||
['Title'] = 'title', -- Used by InternetArchiveBot | ['Title'] = 'title', -- Used by InternetArchiveBot | ||
['TitleLink'] = {'title-link', 'episode-link | ['TitleLink'] = {'title-link', 'episode-link', 'episodelink'}, -- Used by InternetArchiveBot | ||
['TitleNote'] = 'department', | ['TitleNote'] = {'title-note', 'department'}, | ||
['TitleType'] = {'type', 'medium'}, | ['TitleType'] = {'type', 'medium'}, | ||
['TransChapter'] = {'trans-article', 'trans-chapter', 'trans-contribution', 'trans-entry', 'trans-section'}, | ['TransChapter'] = {'trans-article', 'trans-chapter', 'trans-contribution', | ||
'trans-entry', 'trans-section'}, | |||
['Transcript'] = 'transcript', | ['Transcript'] = 'transcript', | ||
['TranscriptFormat'] = 'transcript-format', | ['TranscriptFormat'] = 'transcript-format', | ||
['TranscriptURL'] = | ['TranscriptURL'] = 'transcript-url', -- Used by InternetArchiveBot | ||
['TransEncyclopedia'] = {'trans-encyclopedia', 'trans-encyclopaedia'}, -- cite encyclopedia only | |||
['TransMap'] = 'trans-map', -- cite map only | ['TransMap'] = 'trans-map', -- cite map only | ||
['TransPeriodical'] = {'trans-journal', 'trans-magazine', 'trans-newspaper', 'trans-periodical', 'trans-website', 'trans-work'}, | ['TransPeriodical'] = {'trans-journal', 'trans-magazine', 'trans-newspaper', | ||
'trans-periodical', 'trans-website', 'trans-work'}, | |||
['TransQuote'] = 'trans-quote', | |||
['TransTitle'] = 'trans-title', -- Used by InternetArchiveBot | ['TransTitle'] = 'trans-title', -- Used by InternetArchiveBot | ||
['URL'] = {'url', 'URL'}, -- Used by InternetArchiveBot | ['URL'] = {'url', 'URL'}, -- Used by InternetArchiveBot | ||
Line 325: | Line 385: | ||
['Year'] = 'year', | ['Year'] = 'year', | ||
['AuthorList-First'] = {"first#", "author-first#", "author#-first", "given#"}, | ['AuthorList-First'] = {"first#", "author-first#", "author#-first", "author-given#", "author#-given", | ||
['AuthorList-Last'] = {"last#", "author-last#", "author#-last", "author#", "surname#", "subject#", 'host#'}, | "subject-first#", "subject#-first", "subject-given#", "subject#-given", | ||
['AuthorList-Link'] = {"author-link#", "author#- | "given#"}, | ||
['AuthorList-Mask'] = {"author-mask#", "author#-mask", " | ['AuthorList-Last'] = {"last#", "author-last#", "author#-last", "author-surname#", "author#-surname", | ||
"subject-last#", "subject#-last", "subject-surname#", "subject#-surname", | |||
['ContributorList-First'] = {'contributor-first#', 'contributor#-first', 'contributor-given#', 'contributor#-given'}, | "author#", 'host#', "subject#", "surname#"}, | ||
['ContributorList-Last'] = {'contributor-last#', 'contributor#-last', 'contributor#', 'contributor-surname | ['AuthorList-Link'] = {"author-link#", "author#-link", "subject-link#", | ||
"subject#-link", "authorlink#", "author#link"}, | |||
['AuthorList-Mask'] = {"author-mask#", "author#-mask", "subject-mask#", "subject#-mask"}, | |||
['ContributorList-First'] = {'contributor-first#', 'contributor#-first', | |||
'contributor-given#', 'contributor#-given'}, | |||
['ContributorList-Last'] = {'contributor-last#', 'contributor#-last', | |||
'contributor-surname#', 'contributor#-surname', 'contributor#'}, | |||
['ContributorList-Link'] = {'contributor-link#', 'contributor#-link'}, | ['ContributorList-Link'] = {'contributor-link#', 'contributor#-link'}, | ||
['ContributorList-Mask'] = {'contributor-mask#', 'contributor#-mask'}, | ['ContributorList-Mask'] = {'contributor-mask#', 'contributor#-mask'}, | ||
['EditorList-First'] = {"editor-first#", "editor#-first", "editor-given#", "editor#-given"}, | ['EditorList-First'] = {"editor-first#", "editor#-first", "editor-given#", "editor#-given"}, | ||
['EditorList-Last'] = {"editor-last#", "editor#-last", "editor#", "editor-surname | ['EditorList-Last'] = {"editor-last#", "editor#-last", "editor-surname#", | ||
['EditorList-Link'] = {"editor-link#", "editor#- | "editor#-surname", "editor#"}, | ||
['EditorList-Mask'] = {"editor-mask#", "editor#- | ['EditorList-Link'] = {"editor-link#", "editor#-link"}, | ||
['EditorList-Mask'] = {"editor-mask#", "editor#-mask"}, | |||
['InterviewerList-First'] = {'interviewer-first#', 'interviewer#-first'}, | ['InterviewerList-First'] = {'interviewer-first#', 'interviewer#-first', | ||
['InterviewerList-Last'] = {'interviewer-last#', 'interviewer#-last', 'interviewer#'}, | 'interviewer-given#', 'interviewer#-given'}, | ||
['InterviewerList-Last'] = {'interviewer-last#', 'interviewer#-last', | |||
'interviewer-surname#', 'interviewer#-surname', 'interviewer#'}, | |||
['InterviewerList-Link'] = {'interviewer-link#', 'interviewer#-link'}, | ['InterviewerList-Link'] = {'interviewer-link#', 'interviewer#-link'}, | ||
['InterviewerList-Mask'] = {'interviewer-mask#', 'interviewer#-mask'}, | ['InterviewerList-Mask'] = {'interviewer-mask#', 'interviewer#-mask'}, | ||
['TranslatorList-First'] = {'translator-first#', 'translator#-first', 'translator-given#', 'translator#-given'}, | ['TranslatorList-First'] = {'translator-first#', 'translator#-first', | ||
['TranslatorList-Last'] = {'translator-last#', 'translator#-last', 'translator#', 'translator-surname | 'translator-given#', 'translator#-given'}, | ||
['TranslatorList-Last'] = {'translator-last#', 'translator#-last', | |||
'translator-surname#', 'translator#-surname', 'translator#'}, | |||
['TranslatorList-Link'] = {'translator-link#', 'translator#-link'}, | ['TranslatorList-Link'] = {'translator-link#', 'translator#-link'}, | ||
['TranslatorList-Mask'] = {'translator-mask#', 'translator#-mask'}, | ['TranslatorList-Mask'] = {'translator-mask#', 'translator#-mask'}, | ||
Line 352: | Line 424: | ||
--[[--------------------------< P U N C T _ S K I P > | --[[--------------------------< P U N C T _ S K I P >--------------------------- | ||
builds a table of parameter names that the extraneous terminal punctuation check should not check. | builds a table of parameter names that the extraneous terminal punctuation check should not check. | ||
Line 358: | Line 430: | ||
]] | ]] | ||
local | local punct_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 | 'BookTitle', 'Chapter', 'ScriptChapter', 'ScriptTitle', 'Title', 'TransChapter', 'Transcript', 'TransMap', 'TransTitle', -- title-holding parameters | ||
'AuthorList-Mask', 'ContributorList-Mask', 'EditorList-Mask', 'InterviewerList-Mask', 'TranslatorList-Mask', -- name-list mask may have name separators | 'AuthorList-Mask', 'ContributorList-Mask', 'EditorList-Mask', 'InterviewerList-Mask', 'TranslatorList-Mask', -- name-list mask may have name separators | ||
'PostScript', 'Quote', 'Ref', | 'PostScript', 'Quote', 'ScriptQuote', 'TransQuote', 'Ref', -- miscellaneous | ||
'ArchiveURL', 'ChapterURL', 'ConferenceURL', ' | 'ArchiveURL', 'ChapterURL', 'ConferenceURL', 'MapURL', 'TranscriptURL', 'URL', -- URL-holding parameters | ||
} | |||
local url_meta_params = { -- table of aliases[] keys (meta parameters); each key has a table of parameter names for a value | |||
'ArchiveURL', 'ChapterURL', 'ConferenceURL', 'ID', 'MapURL', 'TranscriptURL', 'URL', -- parameters allowed to hold urls | |||
'Page', 'Pages', 'At', 'QuotePage', 'QuotePages', -- insource locators allowed to hold urls | |||
} | } | ||
local function build_skip_table (skip_t, meta_params) | |||
for _, meta_param in ipairs (meta_params) do -- for each meta parameter key | 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 | local params = aliases[meta_param]; -- get the parameter or the table of parameters associated with the meta parameter name | ||
if 'string' == type (params) then | if 'string' == type (params) then | ||
skip_t[params] = 1; -- just a single parameter | |||
else | else | ||
for _, param in ipairs (params) do -- get the parameter name | for _, param in ipairs (params) do -- get the parameter name | ||
skip_t[param] = 1; -- add the parameter name to the skip table | |||
local count; | local count; | ||
param, count = param:gsub ('#', ''); -- remove enumerator marker from enumerated parameters | param, count = param:gsub ('#', ''); -- remove enumerator marker from enumerated parameters | ||
if 0 ~= count then -- if removed | if 0 ~= count then -- if removed | ||
skip_t[param] = 1; -- add param name without enumerator marker | |||
end | end | ||
end | end | ||
end | end | ||
end | end | ||
return skip_t; | |||
end | |||
local punct_skip = {}; | |||
local url_skip = {}; | |||
--[[--------------------------< S I N G L E - L E T T E R S E C O N D - L E V E L D O M A I N S >---------- | |||
this is a list of tlds that are known to have single-letter second-level domain names. This list does not include | |||
ccTLDs which are accepted in is_domain_name(). | |||
]] | |||
local single_letter_2nd_lvl_domains_t = {'cash', 'company', 'foundation', 'media', 'org', 'today'}; | |||
--[[ | --[[-----------< S P E C I A L C A S E T R A N S L A T I O N S >------------ | ||
This table is primarily here to support internationalization. Translations in this table are used, for example, | This table is primarily here to support internationalization. Translations in | ||
when an error message, category name, etc is extracted from the English alias key. There may be other cases where | this table are used, for example, when an error message, category name, etc., | ||
is extracted from the English alias key. There may be other cases where | |||
this translation table may be useful. | this translation table may be useful. | ||
]] | ]] | ||
local is_Latn = 'A-Za-z\195\128-\195\150\195\152-\195\182\195\184-\198\191\199\132-\201\143\225\184\128-\225\187\191'; | |||
local special_case_translation = { | local special_case_translation = { | ||
['AuthorList'] = 'authors list', -- used to assemble maintenance category names | ['AuthorList'] = 'authors list', -- used to assemble maintenance category names | ||
['ContributorList'] = 'contributors list', -- translation of these names plus translation of the base | ['ContributorList'] = 'contributors list', -- translation of these names plus translation of the base maintenance category names in maint_cats{} table below | ||
['EditorList'] = 'editors list', -- must match the names of the actual categories | ['EditorList'] = 'editors list', -- must match the names of the actual categories | ||
['InterviewerList'] = 'interviewers list', -- this group or translations used by name_has_ed_markup() and name_has_mult_names() | ['InterviewerList'] = 'interviewers list', -- this group or translations used by name_has_ed_markup() and name_has_mult_names() | ||
['TranslatorList'] = 'translators list', | ['TranslatorList'] = 'translators list', | ||
[' | -- Lua patterns to match pseudo-titles used by InternetArchiveBot and others as placeholder for unknown |title= value | ||
['archived_copy'] = { -- used with CS1 maint: Archive[d] copy as title | |||
[' | ['en'] = '^archived?%s+copy$', -- for English; translators: keep this because templates imported from en.wiki | ||
['local'] = nil, -- translators: replace ['local'] = nil with lowercase translation only when bots or tools create generic titles in your language | |||
}, | |||
-- Lua patterns to match generic titles; usually created by bots or reference filling tools | |||
-- translators: replace ['local'] = nil with lowercase translation only when bots or tools create generic titles in your language | |||
-- generic titles and patterns in this table should be lowercase only | |||
-- leave ['local'] nil except when there is a matching generic title in your language | |||
-- boolean 'true' for plain-text searches; 'false' for pattern searches | |||
['generic_titles'] = { | |||
['accept'] = { | |||
}, | |||
['reject'] = { | |||
{['en'] = {'^wayback%s+machine$', false}, ['local'] = nil}, | |||
{['en'] = {'are you a robot', true}, ['local'] = nil}, | |||
{['en'] = {'hugedomains.com', true}, ['local'] = nil}, | |||
{['en'] = {'^[%(%[{<]?no +title[>}%]%)]?$', false}, ['local'] = nil}, | |||
{['en'] = {'page not found', true}, ['local'] = nil}, | |||
{['en'] = {'subscribe to read', true}, ['local'] = nil}, | |||
{['en'] = {'^[%(%[{<]?unknown[>}%]%)]?$', false}, ['local'] = nil}, | |||
{['en'] = {'website is for sale', true}, ['local'] = nil}, | |||
{['en'] = {'^404', false}, ['local'] = nil}, | |||
{['en'] = {'error[ %-]404', false}, ['local'] = nil}, | |||
{['en'] = {'internet archive wayback machine', true}, ['local'] = nil}, | |||
{['en'] = {'log into facebook', true}, ['local'] = nil}, | |||
{['en'] = {'login • instagram', true}, ['local'] = nil}, | |||
{['en'] = {'redirecting...', true}, ['local'] = nil}, | |||
{['en'] = {'usurped title', true}, ['local'] = nil}, -- added by a GreenC bot | |||
{['en'] = {'webcite query result', true}, ['local'] = nil}, | |||
{['en'] = {'wikiwix\'s cache', true}, ['local'] = nil}, | |||
} | |||
}, | |||
-- boolean 'true' for plain-text searches, search string must be lowercase only | |||
-- boolean 'false' for pattern searches | |||
-- leave ['local'] nil except when there is a matching generic name in your language | |||
['generic_names'] = { | |||
['accept'] = { | |||
{['en'] = {'%[%[[^|]*%(author%) *|[^%]]*%]%]', false}, ['local'] = nil}, | |||
}, | |||
['reject'] = { | |||
{['en'] = {'about us', true}, ['local'] = nil}, | |||
{['en'] = {'%f[%a][Aa]dvisor%f[%A]', false}, ['local'] = nil}, | |||
{['en'] = {'allmusic', true}, ['local'] = nil}, | |||
{['en'] = {'%f[%a][Aa]uthor%f[%A]', false}, ['local'] = nil}, | |||
{['en'] = {'^[Bb]ureau$', false}, ['local'] = nil}, | |||
{['en'] = {'business', true}, ['local'] = nil}, | |||
{['en'] = {'cnn', true}, ['local'] = nil}, | |||
{['en'] = {'collaborator', true}, ['local'] = nil}, | |||
{['en'] = {'^[Cc]ompany$', false}, ['local'] = nil}, | |||
{['en'] = {'contributor', true}, ['local'] = nil}, | |||
{['en'] = {'contact us', true}, ['local'] = nil}, | |||
{['en'] = {'correspondent', true}, ['local'] = nil}, | |||
{['en'] = {'^[Dd]esk$', false}, ['local'] = nil}, | |||
{['en'] = {'directory', true}, ['local'] = nil}, | |||
{['en'] = {'%f[%(%[][%(%[]%s*eds?%.?%s*[%)%]]?$', false}, ['local'] = nil}, | |||
{['en'] = {'[,%.%s]%f[e]eds?%.?$', false}, ['local'] = nil}, | |||
{['en'] = {'^eds?[%.,;]', false}, ['local'] = nil}, | |||
{['en'] = {'^[%(%[]%s*[Ee][Dd][Ss]?%.?%s*[%)%]]', false}, ['local'] = nil}, | |||
{['en'] = {'%f[%a][Ee]dited%f[%A]', false}, ['local'] = nil}, | |||
{['en'] = {'%f[%a][Ee]ditors?%f[%A]', false}, ['local'] = nil}, | |||
{['en'] = {'%f[%a][Ee]mail%f[%A]', false}, ['local'] = nil}, | |||
{['en'] = {'facebook', true}, ['local'] = nil}, | |||
{['en'] = {'google', true}, ['local'] = nil}, | |||
{['en'] = {'^[Gg]roup$', false}, ['local'] = nil}, | |||
{['en'] = {'home page', true}, ['local'] = nil}, | |||
{['en'] = {'^[Ii]nc%.?$', false}, ['local'] = nil}, | |||
{['en'] = {'instagram', true}, ['local'] = nil}, | |||
{['en'] = {'interviewer', true}, ['local'] = nil}, | |||
{['en'] = {'^[Ll]imited$', false}, ['local'] = nil}, | |||
{['en'] = {'linkedIn', true}, ['local'] = nil}, | |||
{['en'] = {'^[Nn]ews$', false}, ['local'] = nil}, | |||
{['en'] = {'[Nn]ews[ %-]?[Rr]oom', false}, ['local'] = nil}, | |||
{['en'] = {'pinterest', true}, ['local'] = nil}, | |||
{['en'] = {'policy', true}, ['local'] = nil}, | |||
{['en'] = {'privacy', true}, ['local'] = nil}, | |||
{['en'] = {'reuters', true}, ['local'] = nil}, | |||
{['en'] = {'translator', true}, ['local'] = nil}, | |||
{['en'] = {'tumblr', true}, ['local'] = nil}, | |||
{['en'] = {'twitter', true}, ['local'] = nil}, | |||
{['en'] = {'site name', true}, ['local'] = nil}, | |||
{['en'] = {'statement', true}, ['local'] = nil}, | |||
{['en'] = {'submitted', true}, ['local'] = nil}, | |||
{['en'] = {'super.?user', false}, ['local'] = nil}, | |||
{['en'] = {'%f['..is_Latn..'][Uu]ser%f[^'..is_Latn..']', false}, ['local'] = nil}, | |||
{['en'] = {'verfasser', true}, ['local'] = nil}, | |||
} | |||
} | |||
} | } | ||
Line 415: | Line 588: | ||
--[[--------------------------< D A T E _ N A M E S >---------------------------------------------------------- | --[[--------------------------< D A T E _ N A M E S >---------------------------------------------------------- | ||
This table of tables lists local language date names and fallback English date names. | This table of tables lists local language date names and fallback English date names. | ||
will look first in the local table for valid date names. | The code in Date_validation will look first in the local table for valid date names. | ||
will look in the English table. | If date names are not found in the local table, the code will look in the English table. | ||
Because citations can be copied to the local wiki from en.wiki, the English is required when the date-name translation | Because citations can be copied to the local wiki from en.wiki, the English is | ||
function date_name_xlate() is used. | required when the date-name translation function date_name_xlate() is used. | ||
In these tables, season numbering is defined by Extended Date/Time Format (EDTF) Specification (https://www.loc.gov/standards/datetime/) | In these tables, season numbering is defined by | ||
which became part of ISO 8601 in 2019. See '§Sub-year groupings'. | Extended Date/Time Format (EDTF) Specification (https://www.loc.gov/standards/datetime/) | ||
numbers 21-41. | which became part of ISO 8601 in 2019. See '§Sub-year groupings'. The standard | ||
defines various divisions using numbers 21-41. CS1|2 only supports generic seasons. | |||
EDTF does support the distinction between north and south hemisphere seasons | |||
but CS1|2 has no way to make that distinction. | |||
33-36 = Quarter 1, Quarter 2, Quarter 3, Quarter 4 (3 months each) | 33-36 = Quarter 1, Quarter 2, Quarter 3, Quarter 4 (3 months each) | ||
The standard does not address 'named' dates so, for the purposes of | The standard does not address 'named' dates so, for the purposes of CS1|2, | ||
should be out of the ISO 8601 (EDTF) range of uses for a while. | Easter and Christmas are defined here as 98 and 99, which should be out of the | ||
ISO 8601 (EDTF) range of uses for a while. | |||
local_date_names_from_mediawiki is a boolean. When set to: | |||
true – module will fetch local month names from MediaWiki for both date_names['local']['long'] and date_names['local']['short']; this will unconditionally overwrite manual translations | |||
false – module will *not* fetch local month names from MediaWiki | |||
Caveat lector: There is no guarantee that MediaWiki will provide short month names. At your wiki you can test | |||
the results of the MediaWiki fetch in the debug console with this command (the result is alpha sorted): | |||
=mw.dumpObject (p.date_names['local']) | |||
While the module can fetch month names from MediaWiki, it cannot fetch the quarter, season, and named date names | |||
from MediaWiki. Those must be translated manually. | |||
]] | ]] | ||
local local_date_names_from_mediawiki = true; -- when false, manual translation required for date_names['local']['long'] and date_names['local']['short']; overwrites manual translations | |||
-- when true, module fetches long and short month names from MediaWiki | |||
local date_names = { | local date_names = { | ||
['en'] = { | ['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}, | ||
['quarter'] = {['First Quarter']=33, ['Second Quarter']=34, ['Third Quarter']=35, ['Fourth Quarter']=36}, | ['quarter'] = {['First Quarter'] = 33, ['Second Quarter'] = 34, ['Third Quarter'] = 35, ['Fourth Quarter'] = 36}, | ||
['season'] = {['Winter']=24, ['Spring']=21, ['Summer']=22, ['Fall']=23, ['Autumn']=23}, | ['season'] = {['Winter'] = 24, ['Spring'] = 21, ['Summer'] = 22, ['Fall'] = 23, ['Autumn'] = 23}, | ||
['named'] = {['Easter']=98, ['Christmas']=99}, | ['named'] = {['Easter'] = 98, ['Christmas'] = 99}, | ||
}, | }, | ||
['local'] = { | -- when local_date_names_from_mediawiki = false | ||
['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}, | ['local'] = { -- replace these English date names with the local language equivalents | ||
['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}, | ['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}, | ||
['quarter'] = {['First Quarter']=33, ['Second Quarter']=34, ['Third Quarter']=35, ['Fourth Quarter']=36}, | ['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}, | ['quarter'] = {['First Quarter'] = 33, ['Second Quarter'] = 34, ['Third Quarter'] = 35, ['Fourth Quarter'] = 36}, | ||
['named'] = {['Easter']=98, ['Christmas']=99}, | ['season'] = {['Winter'] = 24, ['Spring'] = 21, ['Summer'] = 22, ['Fall'] = 23, ['Autumn'] = 23}, | ||
['named'] = {['Easter'] = 98, ['Christmas'] = 99}, | |||
}, | }, | ||
[' | ['inv_local_long'] = {}, -- used in date reformatting & translation; copy of date_names['local'].long where k/v are inverted: [1]='<local name>' etc. | ||
[' | ['inv_local_short'] = {}, -- used in date reformatting & translation; copy of date_names['local'].short where k/v are inverted: [1]='<local name>' etc. | ||
['inv_local_quarter'] = {}, -- used in date translation; copy of date_names['local'].quarter where k/v are inverted: [1]='<local name>' etc. | |||
['inv_local_season'] = {}, -- used in date translation; copy of date_names['local'].season where k/v are inverted: [1]='<local name>' etc. | |||
['inv_local_named'] = {}, -- used in date translation; copy of date_names['local'].named 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 | ['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'] = {}, | ['xlate_digits'] = {}, | ||
} | } | ||
for name, i in pairs (date_names['local'] | if local_date_names_from_mediawiki then -- if fetching local month names from MediaWiki is enabled | ||
local long_t = {}; | |||
local short_t = {}; | |||
for i=1, 12 do -- loop 12x and | |||
local name = lang_obj:formatDate('F', '2022-' .. i .. '-1'); -- get long month name for each i | |||
long_t[name] = i; -- save it | |||
name = lang_obj:formatDate('M', '2022-' .. i .. '-1'); -- get short month name for each i | |||
short_t[name] = i; -- save it | |||
end | |||
date_names['local']['long'] = long_t; -- write the long table – overwrites manual translation | |||
date_names['local']['short'] = short_t; -- write the short table – overwrites manual translation | |||
end | |||
-- create inverted date-name tables for reformatting and/or translation | |||
for _, invert_t in pairs {{'long', 'inv_local_long'}, {'short', 'inv_local_short'}, {'quarter', 'inv_local_quarter'}, {'season', 'inv_local_season'}, {'named', 'inv_local_named'}} do | |||
for name, i in pairs (date_names['local'][invert_t[1]]) do -- this table is ['name'] = i | |||
date_names[invert_t[2]][i] = name; -- invert to get [i] = 'name' for conversions from ymd | |||
end | |||
end | end | ||
for | if local_digits_from_mediawiki then -- if fetching local digits from MediaWiki is enabled | ||
date_names[' | local digits_t = {}; | ||
for i=0, 9 do -- loop 10x and | |||
digits_t [lang_obj:formatNum (i)] = tostring (i); -- format the loop indexer as local lang table index and assign loop indexer (a string) as the value | |||
end | |||
date_names['local_digits'] = digits_t; | |||
end | end | ||
Line 468: | Line 680: | ||
local df_template_patterns = { -- table of redirects to {{Use dmy dates}} and {{Use mdy dates}} | local df_template_patterns = { -- table of redirects to {{Use dmy dates}} and {{Use mdy dates}} | ||
'{{ *[Uu]se (dmy) dates *[|}]', | '{{ *[Uu]se +(dmy) +dates *[|}]', -- 1159k -- sorted by approximate transclusion count | ||
'{{ *[Uu]se | '{{ *[Uu]se +(mdy) +dates *[|}]', -- 212k | ||
'{{ *[Uu]se ( | '{{ *[Uu]se +(MDY) +dates *[|}]', -- 788 | ||
'{{ *[Uu]se | '{{ *[Uu]se +(DMY) +dates *[|}]', -- 343 | ||
'{{ *([ | '{{ *([Mm]dy) *[|}]', -- 176 | ||
'{{ *[Uu]se ( | '{{ *[Uu]se *(dmy) *[|}]', -- 156 + 18 | ||
'{{ *[Uu]se *(mdy) *[|}]', -- | '{{ *[Uu]se *(mdy) *[|}]', -- 149 + 11 | ||
'{{ *([ | '{{ *([Dd]my) *[|}]', -- 56 | ||
'{{ *[Uu]se (MDY) *[|}]', -- | '{{ *[Uu]se +(MDY) *[|}]', -- 5 | ||
'{{ *([Dd]MY) *[|}]', -- | '{{ *([Dd]MY) *[|}]', -- 3 | ||
'{{ *[Uu]se(mdy)dates *[|}]', -- 1 | |||
'{{ *[Uu]se +(DMY) *[|}]', -- 0 | |||
'{{ *([Mm]DY) *[|}]', -- 0 | '{{ *([Mm]DY) *[|}]', -- 0 | ||
} | } | ||
local title_object = mw.title.getCurrentTitle(); | |||
local content; -- done this way so that unused templates appear in unused-template-reports; self-transcluded makes them look like they are used | |||
if 10 ~= title_object.namespace then -- all namespaces except Template | |||
content = title_object: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 | |||
end | |||
local function get_date_format () | local function get_date_format () | ||
if not content then -- nil content when we're in template | |||
return nil; -- auto-formatting does not work in Template space so don't set global_df | |||
end | |||
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 | 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 | local start, _, match = content:find(pattern); -- match is the three letters indicating desired date format | ||
if match then | if match then | ||
local use_dates_template = content:match ('%b{}', start); -- get the whole template | |||
if | if use_dates_template:match ('| *cs1%-dates *= *[lsy][sy]?') then -- look for |cs1-dates=publication date length access-/archive-date length | ||
return match:lower() .. '-' .. | return match:lower() .. '-' .. use_dates_template:match ('| *cs1%-dates *= *([lsy][sy]?)'); | ||
else | else | ||
return match:lower() .. '-all'; -- no |cs1-dates= k/v pair; return value appropriate for use in |df= | return match:lower() .. '-all'; -- no |cs1-dates= k/v pair; return value appropriate for use in |df= | ||
Line 499: | Line 718: | ||
end | end | ||
local global_df | local global_df; -- TODO: add this to <global_cs1_config_t>? | ||
--[[ | --[[-----------------< V O L U M E , I S S U E , P A G E S >------------------ | ||
These tables hold cite class values (from the template invocation) and identify those templates that support | These tables hold cite class values (from the template invocation) and identify those templates that support | ||
Line 514: | Line 733: | ||
local templates_not_using_page = {'audio-visual', 'episode', 'mailinglist', 'newsgroup', 'podcast', 'serial', 'sign', 'speech'} | local templates_not_using_page = {'audio-visual', 'episode', 'mailinglist', 'newsgroup', 'podcast', 'serial', 'sign', 'speech'} | ||
--[[ | |||
These tables control when it is appropriate for {{citation}} to render |volume= and/or |issue=. The parameter | |||
names in the tables constrain {{citation}} so that its renderings match the renderings of the equivalent cs1 | |||
templates. For example, {{cite web}} does not support |volume= so the equivalent {{citation |website=...}} must | |||
not support |volume=. | |||
]] | |||
local citation_no_volume_t = { -- {{citation}} does not render |volume= when these parameters are used | |||
'website', 'mailinglist', 'script-website', | |||
} | |||
local citation_issue_t = { -- {{citation}} may render |issue= when these parameters are used | |||
'journal', 'magazine', 'newspaper', 'periodical', 'work', | |||
'script-journal', 'script-magazine', 'script-newspaper', 'script-periodical', 'script-work', | |||
} | |||
--[[ | |||
Patterns for finding extra text in |volume=, |issue=, |page=, |pages= | |||
]] | |||
local vol_iss_pg_patterns = { | |||
good_ppattern = '^P[^%.PpGg]', -- OK to begin with uppercase P: P7 (page 7 of section P), but not p123 (page 123); TODO: this allows 'Pages' which it should not | |||
bad_ppatterns = { -- patterns for |page= and |pages= | |||
'^[Pp][PpGg]?%.?[ %d]', | |||
'^[Pp][Pp]?%. ', -- from {{p.}} and {{pp.}} templates | |||
'^[Pp]ages?', | |||
'^[Pp]gs.?', | |||
}, | |||
vi_patterns_t = { -- combined to catch volume-like text in |issue= and issue-like text in |volume= | |||
'^volumes?', -- volume-like text | |||
'^vols?[%.:=]?', | |||
'^issues?', --issue-like text | |||
'^iss[%.:=]?', | |||
'^numbers?', | |||
'^nos?%A', -- don't match 'november' or 'nostradamus' | |||
'^nr[%.:=]?', | |||
'^n[%.:= ]', -- might be a valid issue without separator (space char is sep char here) | |||
'^n°', -- 'n' with degree sign (U+00B0) | |||
'^№', -- precomposed unicode numero character (U+2116) | |||
}, | |||
} | |||
--[[--------------------------< K E Y W O R D S > | --[[--------------------------< K E Y W O R D S >------------------------------- | ||
These tables hold keywords for those parameters that have defined sets of | These tables hold keywords for those parameters that have defined sets of acceptable keywords. | ||
]] | ]] | ||
--[[ | --[[-------------------< K E Y W O R D S T A B L E >-------------------------- | ||
this is a list of keywords; each key in the list is associated with a table of synonymous keywords possibly from | this is a list of keywords; each key in the list is associated with a table of | ||
different languages. | synonymous keywords possibly from different languages. | ||
for | for I18N: add local-language keywords to value table; do not change the key. | ||
For example, adding the German keyword 'ja': | |||
['affirmative'] = {'yes', 'true', 'y', 'ja'}, | ['affirmative'] = {'yes', 'true', 'y', 'ja'}, | ||
Because | Because CS1|2 templates from en.wiki articles are often copied to other local wikis, | ||
keywords remain in these tables. | it is recommended that the English keywords remain in these tables. | ||
]] | ]] | ||
local keywords = { | local keywords = { | ||
[' | ['amp'] = {'&', 'amp', 'ampersand'}, -- |name-list-style= | ||
['afterword'] = {'afterword'}, -- contribution | ['and'] = {'and', 'serial'}, -- |name-list-style= | ||
['bot: unknown'] = {'bot: unknown'}, -- url-status -- Used by InternetArchiveBot | ['affirmative'] = {'yes', 'true', 'y'}, -- |no-tracking=, |no-pp= -- Used by InternetArchiveBot | ||
['cs1'] = {'cs1'}, -- mode | ['afterword'] = {'afterword'}, -- |contribution= | ||
['cs2'] = {'cs2'}, -- mode | ['bot: unknown'] = {'bot: unknown'}, -- |url-status= -- Used by InternetArchiveBot | ||
['dead'] = {'dead'}, | ['cs1'] = {'cs1'}, -- |mode= | ||
['dmy'] = {'dmy'}, -- df | ['cs2'] = {'cs2'}, -- |mode= | ||
['dmy-all'] = {'dmy-all'}, -- df | ['dead'] = {'dead', 'deviated'}, -- |url-status= -- Used by InternetArchiveBot | ||
['foreword'] = {'foreword'}, -- contribution | ['dmy'] = {'dmy'}, -- |df= | ||
['free'] = {'free'}, -- | ['dmy-all'] = {'dmy-all'}, -- |df= | ||
['introduction'] = {'introduction'}, -- contribution | ['foreword'] = {'foreword'}, -- |contribution= | ||
['limited'] = {'limited'}, -- url-access -- Used by InternetArchiveBot | ['free'] = {'free'}, -- |<id>-access= -- Used by InternetArchiveBot | ||
['live'] = {'live'}, -- url-status -- Used by InternetArchiveBot | ['harv'] = {'harv'}, -- |ref=; this no longer supported; is_valid_parameter_value() called with <invert> = true | ||
['mdy'] = {'mdy'}, -- df | ['introduction'] = {'introduction'}, -- |contribution= | ||
['mdy-all'] = {'mdy-all'}, -- df | ['limited'] = {'limited'}, -- |url-access= -- Used by InternetArchiveBot | ||
['none'] = {'none'}, -- postscript, ref, title, type -- Used by InternetArchiveBot | ['live'] = {'live'}, -- |url-status= -- Used by InternetArchiveBot | ||
['preface'] = {'preface'}, -- contribution | ['mdy'] = {'mdy'}, -- |df= | ||
['registration'] = {'registration'}, -- url-access -- Used by InternetArchiveBot | ['mdy-all'] = {'mdy-all'}, -- |df= | ||
['subscription'] = {'subscription'}, -- url-access -- Used by InternetArchiveBot | ['none'] = {'none'}, -- |postscript=, |ref=, |title=, |type= -- Used by InternetArchiveBot | ||
['unfit'] = {'unfit'}, -- url-status -- Used by InternetArchiveBot | ['off'] = {'off'}, -- |title= (potentially also: |title-link=, |postscript=, |ref=, |type=) | ||
['usurped'] = {'usurped'}, -- url-status -- Used by InternetArchiveBot | ['preface'] = {'preface'}, -- |contribution= | ||
['vanc'] = {'vanc'}, -- name-list- | ['registration'] = {'registration'}, -- |url-access= -- Used by InternetArchiveBot | ||
['ymd'] = {'ymd'}, -- df | ['subscription'] = {'subscription'}, -- |url-access= -- Used by InternetArchiveBot | ||
['ymd-all'] = {'ymd-all'}, -- df | ['unfit'] = {'unfit'}, -- |url-status= -- Used by InternetArchiveBot | ||
-- ['yMd'] = {'yMd'}, | ['usurped'] = {'usurped'}, -- |url-status= -- Used by InternetArchiveBot | ||
-- ['yMd-all'] = {'yMd-all'}, | ['vanc'] = {'vanc'}, -- |name-list-style= | ||
['ymd'] = {'ymd'}, -- |df= | |||
['ymd-all'] = {'ymd-all'}, -- |df= | |||
-- ['yMd'] = {'yMd'}, -- |df=; not supported at en.wiki | |||
-- ['yMd-all'] = {'yMd-all'}, -- |df=; not supported at en.wiki | |||
} | } | ||
--[[ | --[[------------------------< X L A T E _ K E Y W O R D S >--------------------- | ||
this function builds a list, keywords_xlate{}, of the keywords found in keywords{} where the values from keywords{} | this function builds a list, keywords_xlate{}, of the keywords found in keywords{} where the values from keywords{} | ||
Line 593: | Line 862: | ||
--[[ | --[[----------------< M A K E _ K E Y W O R D S _ L I S T >--------------------- | ||
this function assembles, for parameter-value validation, the list of keywords appropriate to that parameter. | this function assembles, for parameter-value validation, the list of keywords appropriate to that parameter. | ||
Line 613: | Line 882: | ||
--[[ | --[[----------------< K E Y W O R D S _ L I S T S >----------------------------- | ||
this is a list of lists of valid keywords for the various parameters in [key]. | this is a list of lists of valid keywords for the various parameters in [key]. | ||
are the canonical en.wiki parameter names though some are contrived because of use in multiple differently named | Generally the keys in this table are the canonical en.wiki parameter names though | ||
parameters: ['yes_true_y'], ['id-access']. | some are contrived because of use in multiple differently named parameters: | ||
['yes_true_y'], ['id-access']. | |||
The function make_keywords_list() extracts the individual keywords from the appropriate list in keywords{}. | The function make_keywords_list() extracts the individual keywords from the | ||
appropriate list in keywords{}. | |||
The lists in this table are used to validate the keyword assignment for the parameters named in this table's keys. | The lists in this table are used to validate the keyword assignment for the | ||
parameters named in this table's keys. | |||
]] | ]] | ||
Line 629: | Line 901: | ||
['contribution'] = make_keywords_list ({keywords.afterword, keywords.foreword, keywords.introduction, keywords.preface}), | ['contribution'] = make_keywords_list ({keywords.afterword, keywords.foreword, keywords.introduction, keywords.preface}), | ||
['df'] = make_keywords_list ({keywords.dmy, keywords['dmy-all'], keywords.mdy, keywords['mdy-all'], keywords.ymd, keywords['ymd-all']}), | ['df'] = make_keywords_list ({keywords.dmy, keywords['dmy-all'], keywords.mdy, keywords['mdy-all'], keywords.ymd, keywords['ymd-all']}), | ||
-- ['df'] = make_keywords_list ({keywords.dmy, keywords['dmy-all'], keywords.mdy, keywords['mdy-all'], keywords.ymd, keywords['ymd-all'], keywords.yMd, keywords['yMd-all']}), -- not supported at en.wiki | -- ['df'] = make_keywords_list ({keywords.dmy, keywords['dmy-all'], keywords.mdy, keywords['mdy-all'], keywords.ymd, keywords['ymd-all'], keywords.yMd, keywords['yMd-all']}), -- not supported at en.wiki | ||
['mode'] = make_keywords_list ({keywords.cs1, keywords.cs2}), | ['mode'] = make_keywords_list ({keywords.cs1, keywords.cs2}), | ||
['name-list- | ['name-list-style'] = make_keywords_list ({keywords.amp, keywords['and'], keywords.vanc}), | ||
['ref'] = make_keywords_list ({keywords.harv}), -- inverted check; |ref=harv no longer supported | |||
['url-access'] = make_keywords_list ({keywords.subscription, keywords.limited, keywords.registration}), | ['url-access'] = make_keywords_list ({keywords.subscription, keywords.limited, keywords.registration}), | ||
['url-status'] = make_keywords_list ({keywords.dead, keywords.live, keywords.unfit, keywords.usurped, keywords['bot: unknown']}), | ['url-status'] = make_keywords_list ({keywords.dead, keywords.live, keywords.unfit, keywords.usurped, keywords['bot: unknown']}), | ||
Line 638: | Line 911: | ||
--[[--------------------------< S | --[[--------------------------< C S 1 _ C O N F I G _ G E T >-------------------------------------------------- | ||
fetch and validate values from {{cs1 config}} template to fill <global_cs1_config_t> | |||
no error messages; when errors are detected, the parameter value from {{cs1 config}} is blanked. | |||
Supports all parameters and aliases associated with the metaparameters: DisplayAuthors, DisplayContributors, | |||
DisplayEditors, DisplayInterviewers, DisplayTranslators, NameListStyle, and Mode. The DisplayWhatever metaparameters | |||
accept numeric values only (|display-authors=etal and the like is not supported). | |||
]] | |||
local global_cs1_config_t = {}; -- TODO: add value returned from get_date_format() to this table? | |||
local function get_cs1_config () | |||
if not content then -- nil content when we're in template | |||
return nil; -- auto-formatting does not work in Template space so don't set global_df | |||
end | |||
local start = content:find('{{ *[Cc][Ss]1 config *[|}]'); -- <start> is offset into <content> when {{cs1 config}} found; nil else | |||
if start then | |||
local cs1_config_template = content:match ('%b{}', start); -- get the whole template | |||
if not cs1_config_template then | |||
return nil; | |||
end | |||
local params_t = mw.text.split (cs1_config_template:gsub ('^{{%s*', ''):gsub ('%s*}}$', ''), '%s*|%s*'); -- remove '{{' and '}}'; make a sequence of parameter/value pairs (split on the pipe) | |||
table.remove (params_t, 1); -- remove the template name because it isn't a parameter/value pair | |||
local config_meta_params_t = {'DisplayAuthors', 'DisplayContributors', 'DisplayEditors', 'DisplayInterviewers', 'DisplayTranslators', 'NameListStyle', 'Mode'}; | |||
local meta_param_map_t = {}; -- list of accepted parameter names usable in {{cs1 config}} goes here | |||
for _, meta_param in ipairs (config_meta_params_t) do -- for i18n using <config_meta_params_t>, map template parameter names to their metaparameter equivalents | |||
if 'table' == type (aliases[meta_param]) then -- if <meta_param> is a sequence, | |||
for _, param in ipairs (aliases[meta_param]) do -- extract its contents | |||
meta_param_map_t[param] = meta_param; -- and add to <meta_param_map_t> | |||
end | |||
else | |||
meta_param_map_t[aliases[meta_param]] = meta_param; -- not a sequence so just add the parameter to <meta_param_map_t> | |||
end | |||
end | |||
local keywords_t = {}; -- map valid keywords to their associate metaparameter; reverse form of <keyword_lists[key] for these metaparameters | |||
for _, metaparam_t in ipairs ({{'NameListStyle', 'name-list-style'}, {'Mode', 'mode'}}) do -- only these metaparameter / keywords_lists key pairs | |||
for _, keyword in ipairs (keywords_lists[metaparam_t[2]]) do -- spin through the list of keywords | |||
keywords_t[keyword] = metaparam_t[1]; -- add [keyword] = metaparameter to the map | |||
end | |||
end | |||
for _, param in ipairs (params_t) do -- spin through the {{cs1 config}} parameters and fill <global_cs1_config_t> | |||
local k, v = param:match ('([^=]-)%s*=%s*(.+)'); -- <k> is the parameter name; <v> is parameter's assigned value | |||
if k then | |||
if k:find ('^display') then -- if <k> is one of the |display-<namelist>= parameters | |||
if v:match ('%d+') then -- the assigned value must be digits; doesn't accept 'etal' | |||
global_cs1_config_t[meta_param_map_t[k]]=v; -- add the display param and its value to globals table | |||
end | |||
else | |||
if keywords_t[v] == meta_param_map_t[k] then -- keywords_t[v] returns nil or the metaparam name; these must be the same | |||
global_cs1_config_t[meta_param_map_t[k]]=v; -- add the parameter and its value to globals table | |||
end | |||
end | |||
end | |||
end | |||
end | |||
end | |||
get_cs1_config (); -- fill <global_cs1_config_t> | |||
--[[---------------------< S T R I P M A R K E R S >---------------------------- | |||
Common pattern definition location for stripmarkers so that we don't have to go hunting for them if (when) | Common pattern definition location for stripmarkers so that we don't have to go | ||
MediaWiki changes their form. | hunting for them if (when) MediaWiki changes their form. | ||
]] | ]] | ||
Line 651: | Line 994: | ||
--[[ | --[[------------< I N V I S I B L E _ C H A R A C T E R S >--------------------- | ||
This table holds non-printing or invisible characters indexed either by name or by Unicode group. Values are decimal | This table holds non-printing or invisible characters indexed either by name or | ||
representations of UTF-8 codes. The table is organized as a table of tables because the | by Unicode group. Values are decimal representations of UTF-8 codes. The table | ||
is organized as a table of tables because the Lua pairs keyword returns table | |||
the top of the table are also found in the ranges specified by the entries at the bottom of the 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. | |||
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 | ||
stripmarker is not an error but some others are because the parameter values that include them become part of the | delete characters. The nowiki stripmarker is not an error but some others are | ||
template's metadata before stripmarker replacement. | because the parameter values that include them become part of the template's | ||
metadata before stripmarker replacement. | |||
]] | ]] | ||
local invisible_defs = { | |||
del = '\127', -- used to distinguish between stripmarker and del char | |||
zwj = '\226\128\141', -- used with capture because zwj may be allowed | |||
} | |||
local invisible_chars = { | local invisible_chars = { | ||
{'replacement', '\239\191\189'}, -- U+FFFD, EF BF BD | {'replacement', '\239\191\189'}, -- U+FFFD, EF BF BD | ||
{'zero width joiner', ' | {'zero width joiner', '('.. invisible_defs.zwj .. ')'}, -- U+200D, E2 80 8D; capture because zwj may be allowed | ||
{'zero width space', '\226\128\139'}, -- U+200B, E2 80 8B | {'zero width space', '\226\128\139'}, -- U+200B, E2 80 8B | ||
{'hair space', '\226\128\138'}, -- U+200A, E2 80 8A | {'hair space', '\226\128\138'}, -- U+200A, E2 80 8A | ||
Line 675: | Line 1,026: | ||
{'carriage return', '\013'}, -- U+000D (CR), 0D | {'carriage return', '\013'}, -- U+000D (CR), 0D | ||
{'stripmarker', stripmarkers.any}, -- stripmarker; may or may not be an error; capture returns the stripmaker type | {'stripmarker', stripmarkers.any}, -- stripmarker; may or may not be an error; capture returns the stripmaker type | ||
{'delete', ' | {'delete', '('.. invisible_defs.del .. ')'}, -- U+007F (DEL), 7F; must be done after stripmarker test; capture to distinguish isolated del chars not part of stripmarker | ||
{'C0 control', '[\000-\008\011\012\014-\031]'}, -- U+0000–U+001F (NULL–US), 00–1F (except HT, LF, CR (09, 0A, 0D)) | {'C0 control', '[\000-\008\011\012\014-\031]'}, -- U+0000–U+001F (NULL–US), 00–1F (except HT, LF, CR (09, 0A, 0D)) | ||
{'C1 control', '[\194\128-\194\159]'}, -- U+0080–U+009F (XXX–APC), C2 80 – C2 9F | {'C1 control', '[\194\128-\194\159]'}, -- U+0080–U+009F (XXX–APC), C2 80 – C2 9F | ||
-- {'Specials', '[\239\191\185-\239\191\191]'}, -- U+FFF9-U+FFFF, EF BF B9 – EF BF BF | -- {'Specials', '[\239\191\185-\239\191\191]'}, -- U+FFF9-U+FFFF, EF BF B9 – EF BF BF | ||
-- {'Private use area', '[\238\128\128-\239\163\191]'}, -- U+E000–U+F8FF, EE 80 80 – EF A3 BF | -- {'Private use area', '[\238\128\128-\239\163\191]'}, -- U+E000–U+F8FF, EE 80 80 – EF A3 BF | ||
-- {'Supplementary Private Use Area-A', '[\243\176\128\128-\243\191\191\189]'}, -- U+F0000–U+FFFFD, F3 B0 80 80 – F3 BF BF BD | -- {'Supplementary Private Use Area-A', '[\243\176\128\128-\243\191\191\189]'}, -- U+F0000–U+FFFFD, F3 B0 80 80 – F3 BF BF BD | ||
-- {'Supplementary Private Use Area-B', '[\244\128\128\128-\244\143\191\189]'}, -- U+100000–U+10FFFD, F4 80 80 80 – F4 8F BF BD | -- {'Supplementary Private Use Area-B', '[\244\128\128\128-\244\143\191\189]'}, -- U+100000–U+10FFFD, F4 80 80 80 – F4 8F BF BD | ||
} | } | ||
--[[ | --[[ | ||
Indic script makes use of zero width joiner as a character modifier so zwj characters must be left in. This | |||
pattern covers all of the unicode characters for these languages: | Indic script makes use of zero width joiner as a character modifier so zwj | ||
characters must be left in. This pattern covers all of the unicode characters | |||
for these languages: | |||
Devanagari 0900–097F – https://unicode.org/charts/PDF/U0900.pdf | Devanagari 0900–097F – https://unicode.org/charts/PDF/U0900.pdf | ||
Devanagari extended A8E0–A8FF – https://unicode.org/charts/PDF/UA8E0.pdf | Devanagari extended A8E0–A8FF – https://unicode.org/charts/PDF/UA8E0.pdf | ||
Line 703: | Line 1,056: | ||
Myanmar extended B A9E0-A9FF - https://unicode.org/charts/PDF/UA9E0.pdf | Myanmar extended B A9E0-A9FF - https://unicode.org/charts/PDF/UA9E0.pdf | ||
the pattern is used by has_invisible_chars() and coins_cleanup() | the pattern is used by has_invisible_chars() and coins_cleanup() | ||
]] | ]] | ||
local indic_script = '[\224\164\128-\224\181\191\224\163\160-\224\183\191\225\128\128-\225\130\159\234\167\160-\234\167\191\234\169\160-\234\169\191]'; | local indic_script = '[\224\164\128-\224\181\191\224\163\160-\224\183\191\225\128\128-\225\130\159\234\167\160-\234\167\191\234\169\160-\234\169\191]'; | ||
-- list of emoji that use a zwj character (U+200D) to combine with another emoji | |||
-- from: https://unicode.org/Public/emoji/15.1/emoji-zwj-sequences.txt; version: 15.1; 2023-06-05 | |||
-- table created by: [[:en:Module:Make emoji zwj table]] | |||
local emoji_t = { -- indexes are decimal forms of the hex values in U+xxxx | |||
[8596] = true, -- U+2194 ↔ left right arrow | |||
[8597] = true, -- U+2195 ↕ up down arrow | |||
[9760] = true, -- U+2620 ☠ skull and crossbones | |||
[9792] = true, -- U+2640 ♀ female sign | |||
[9794] = true, -- U+2642 ♂ male sign | |||
[9877] = true, -- U+2695 ⚕ staff of aesculapius | |||
[9878] = true, -- U+2696 ⚖ scales | |||
[9895] = true, -- U+26A7 ⚧ male with stroke and male and female sign | |||
[9992] = true, -- U+2708 ✈ airplane | |||
[10052] = true, -- U+2744 ❄ snowflake | |||
[10084] = true, -- U+2764 ❤ heavy black heart | |||
[10145] = true, -- U+27A1 ➡ black rightwards arrow | |||
[11035] = true, -- U+2B1B ⬛ black large square | |||
[127752] = true, -- U+1F308 🌈 rainbow | |||
[127787] = true, -- U+1F32B 🌫 fog | |||
[127806] = true, -- U+1F33E 🌾 ear of rice | |||
[127859] = true, -- U+1F373 🍳 cooking | |||
[127868] = true, -- U+1F37C 🍼 baby bottle | |||
[127876] = true, -- U+1F384 🎄 christmas tree | |||
[127891] = true, -- U+1F393 🎓 graduation cap | |||
[127908] = true, -- U+1F3A4 🎤 microphone | |||
[127912] = true, -- U+1F3A8 🎨 artist palette | |||
[127979] = true, -- U+1F3EB 🏫 school | |||
[127981] = true, -- U+1F3ED 🏭 factory | |||
[128102] = true, -- U+1F466 👦 boy | |||
[128103] = true, -- U+1F467 👧 girl | |||
[128104] = true, -- U+1F468 👨 man | |||
[128105] = true, -- U+1F469 👩 woman | |||
[128139] = true, -- U+1F48B 💋 kiss mark | |||
[128165] = true, -- U+1F4A5 💥 collision symbol | |||
[128168] = true, -- U+1F4A8 💨 dash symbol | |||
[128171] = true, -- U+1F4AB 💫 dizzy symbol | |||
[128187] = true, -- U+1F4BB 💻 personal computer | |||
[128188] = true, -- U+1F4BC 💼 brief case | |||
[128293] = true, -- U+1F525 🔥 fire | |||
[128295] = true, -- U+1F527 🔧 wrench | |||
[128300] = true, -- U+1F52C 🔬 microscope | |||
[128488] = true, -- U+1F5E8 🗨 left speech bubble | |||
[128640] = true, -- U+1F680 🚀 rocket | |||
[128658] = true, -- U+1F692 🚒 fire engine | |||
[129001] = true, -- U+1F7E9 🟩 large green square | |||
[129003] = true, -- U+1F7EB 🟫 large brown square | |||
[129309] = true, -- U+1F91D 🤝 handshake | |||
[129455] = true, -- U+1F9AF 🦯 probing cane | |||
[129456] = true, -- U+1F9B0 🦰 emoji component red hair | |||
[129457] = true, -- U+1F9B1 🦱 emoji component curly hair | |||
[129458] = true, -- U+1F9B2 🦲 emoji component bald | |||
[129459] = true, -- U+1F9B3 🦳 emoji component white hair | |||
[129466] = true, -- U+1F9BA 🦺 safety vest | |||
[129468] = true, -- U+1F9BC 🦼 motorized wheelchair | |||
[129469] = true, -- U+1F9BD 🦽 manual wheelchair | |||
[129489] = true, -- U+1F9D1 🧑 adult | |||
[129490] = true, -- U+1F9D2 🧒 child | |||
[129657] = true, -- U+1FA79 🩹 adhesive bandage | |||
[129778] = true, -- U+1FAF2 🫲 leftwards hand | |||
} | |||
--[[----------------------< L A N G U A G E S U P P O R T >------------------- | |||
--[[ | |||
These tables and constants support various language-specific functionality. | These tables and constants support various language-specific functionality. | ||
Line 717: | Line 1,129: | ||
]] | ]] | ||
local this_wiki_code = mw.getContentLanguage():getCode(); -- get this wiki's language code | --local this_wiki_code = mw.getContentLanguage():getCode(); -- get this wiki's language code | ||
local this_wiki_code = lang_obj:getCode(); -- get this wiki's language code | |||
this_wiki_code = mw.getCurrentFrame(): | if string.match (mw.site.server, 'wikidata') then | ||
this_wiki_code = mw.getCurrentFrame():callParserFunction('int', {'lang'}); -- on Wikidata so use interface language setting instead | |||
end | end | ||
local | local mw_languages_by_tag_t = mw.language.fetchLanguageNames (this_wiki_code, 'all'); -- get a table of language tag/name pairs known to Wikimedia; used for interwiki tests | ||
local mw_languages_by_name_t = {}; | |||
for k, v in pairs (mw_languages_by_tag_t) do -- build a 'reversed' table name/tag language pairs know to MediaWiki; used for |language= | |||
v = mw.ustring.lower (v); -- lowercase for tag fetch; get name's proper case from mw_languages_by_tag_t[<tag>] | |||
if mw_languages_by_name_t[v] then -- when name already in the table | |||
if 2 == #k or 3 == #k then -- if tag does not have subtags | |||
mw_languages_by_name_t[v] = k; -- prefer the shortest tag for this name | |||
end | |||
else -- here when name not in the table | |||
mw_languages_by_name_t[v] = k; -- so add name and matching tag | |||
end | |||
end | |||
local inter_wiki_map = {}; -- map of interwiki prefixes that are language-code prefixes | |||
for k, v in pairs (mw.site.interwikiMap ('local')) do -- spin through the base interwiki map (limited to local) | |||
if mw_languages_by_tag_t[v["prefix"]] then -- if the prefix matches a known language tag | |||
inter_wiki_map[v["prefix"]] = true; -- add it to our local map | |||
end | |||
end | |||
--[[ | --[[--------------------< S C R I P T _ L A N G _ C O D E S >------------------- | ||
This table is used to hold ISO 639-1 two-character and ISO 639-3 three-character language codes that apply only | This table is used to hold ISO 639-1 two-character and ISO 639-3 three-character | ||
to |script-title= and |script-chapter= | language codes that apply only to |script-title= and |script-chapter= | ||
]] | ]] | ||
local script_lang_codes = { | local script_lang_codes = { | ||
'am', 'ar', 'be', 'bg', 'bn', 'bo', 'bs', 'dv', 'dz', 'el', 'fa', | 'ab', 'am', 'ar', 'be', 'bg', 'bn', 'bo', 'bs', 'ce', 'dv', 'dz', 'el', 'fa', 'grc', | ||
'gu', 'he', 'hi', 'hy', 'ja', 'ka', 'kk', 'km', 'kn', 'ko', 'ku', | 'gu', 'he', 'hi', 'hy', 'ja', 'ka', 'kk', 'km', 'kn', 'ko', 'ku', 'ky', 'lo', 'mk', 'ml', | ||
'mn', 'mni', 'mr', 'my', 'ne', 'or', 'ota', 'pa', 'ps', 'ru', 'sd', 'si', 'sr', 'syc', | |||
'ta', 'te', 'tg', 'th', 'ti', 'tt', 'ug', 'uk', 'ur', 'uz', 'yi', 'yue', 'zh' | |||
}; | }; | ||
--[[ | --[[---------------< L A N G U A G E R E M A P P I N G >---------------------- | ||
These tables hold language information that is different (correct) from MediaWiki's definitions | These tables hold language information that is different (correct) from MediaWiki's definitions | ||
For each [' | For each ['<tag>'] = 'language name' in lang_code_remap{} there must be a matching ['language name'] = {'language name', '<tag>'} in lang_name_remap{} | ||
lang_tag_remap{}: | |||
key is always lowercase ISO 639-1, -2, -3 language | key is always lowercase ISO 639-1, -2, -3 language tag or a valid lowercase IETF language tag | ||
value is properly spelled and capitalized language name associated with | value is properly spelled and capitalized language name associated with <tag> | ||
only one language name per | only one language name per <tag>; | ||
key/value pair must have matching entry in lang_name_remap{} | key/value pair must have matching entry in lang_name_remap{} | ||
lang_name_remap{}: | lang_name_remap{}: | ||
key is always lowercase language name | key is always lowercase language name | ||
value is a table the holds correctly spelled and capitalized language name [1] and associated | value is a table the holds correctly spelled and capitalized language name [1] and associated tag [2] (tag must match a tag key in lang_tag_remap{}) | ||
may have multiple keys referring to a common preferred name and | may have multiple keys referring to a common preferred name and tag; For example: | ||
['kolsch'] and ['kölsch'] both refer to 'Kölsch' and 'ksh' | ['kolsch'] and ['kölsch'] both refer to 'Kölsch' and 'ksh' | ||
]] | ]] | ||
local | local lang_tag_remap = { -- used for |language= and |script-title= / |script-chapter= | ||
['als'] = 'Tosk Albanian', -- MediaWiki returns Alemannisch | ['als'] = 'Tosk Albanian', -- MediaWiki returns Alemannisch | ||
['bh'] = 'Bihari', -- MediaWiki uses 'bh' as a subdomain name for Bhojpuri Wikipedia: bh.wikipedia.org | ['bh'] = 'Bihari', -- MediaWiki uses 'bh' as a subdomain name for Bhojpuri Wikipedia: bh.wikipedia.org | ||
Line 766: | Line 1,197: | ||
['bn'] = 'Bengali', -- MediaWiki returns Bangla | ['bn'] = 'Bengali', -- MediaWiki returns Bangla | ||
['ca-valencia'] = 'Valencian', -- IETF variant of Catalan | ['ca-valencia'] = 'Valencian', -- IETF variant of Catalan | ||
[' | ['fkv'] = 'Kven', -- MediaWiki returns Kvensk | ||
['gsw'] = 'Swiss German', | |||
['ilo'] = 'Ilocano', -- MediaWiki/IANA/ISO 639: Iloko; use en.wiki preferred name | ['ilo'] = 'Ilocano', -- MediaWiki/IANA/ISO 639: Iloko; use en.wiki preferred name | ||
['ksh'] = 'Kölsch', -- MediaWiki: Colognian; use IANA/ISO 639 preferred name | ['ksh'] = 'Kölsch', -- MediaWiki: Colognian; use IANA/ISO 639 preferred name | ||
Line 772: | Line 1,204: | ||
['mis-x-ripuar'] = 'Ripuarian', -- override MediaWiki ksh; no IANA/ISO 639 code for Ripuarian; IETF private code created at Module:Lang/data | ['mis-x-ripuar'] = 'Ripuarian', -- override MediaWiki ksh; no IANA/ISO 639 code for Ripuarian; IETF private code created at Module:Lang/data | ||
['nan-tw'] = 'Taiwanese Hokkien', -- make room for MediaWiki/IANA/ISO 639 nan: Min Nan Chinese and support en.wiki preferred name | ['nan-tw'] = 'Taiwanese Hokkien', -- make room for MediaWiki/IANA/ISO 639 nan: Min Nan Chinese and support en.wiki preferred name | ||
['sr-ec'] = 'Serbian (Cyrillic script)', -- MediaWiki returns српски (ћирилица) | |||
['sr-el'] = 'Serbian (Latin script)', -- MediaWiki returns srpski (latinica) | |||
} | } | ||
local lang_name_remap = { -- used for |language= | local lang_name_remap = { -- used for |language=; names require proper capitalization; tags must be lowercase | ||
['alemannic'] = {'Swiss German', 'gsw'}, -- ISO 639-2, -3 alternate for Swiss German; MediaWiki mediawiki returns Alemannic for gsw; en.wiki preferred name | |||
['alemannisch'] = {'Swiss German', 'gsw'}, -- not an ISO or IANA language name; MediaWiki uses 'als' as a subdomain name for Alemannic Wikipedia: als.wikipedia.org | ['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 | ['bangla'] = {'Bengali', 'bn'}, -- MediaWiki returns Bangla (the endonym) but we want Bengali (the exonym); here we remap | ||
Line 782: | Line 1,217: | ||
['blackfoot'] = {'Blackfoot', 'bla'}, -- MediaWiki/IANA/ISO 639: Siksika; use en.wiki preferred name | ['blackfoot'] = {'Blackfoot', 'bla'}, -- MediaWiki/IANA/ISO 639: Siksika; use en.wiki preferred name | ||
['colognian'] = {'Colognian', 'ksh-x-colog'}, -- MediaWiki preferred name for ksh | ['colognian'] = {'Colognian', 'ksh-x-colog'}, -- MediaWiki preferred name for ksh | ||
['ilocano'] = {'Ilocano', 'ilo'}, -- MediaWiki/IANA/ISO 639: Iloko; use en.wiki preferred name | ['ilocano'] = {'Ilocano', 'ilo'}, -- MediaWiki/IANA/ISO 639: Iloko; use en.wiki preferred name | ||
['kolsch'] = {'Kölsch', 'ksh'}, -- use IANA/ISO 639 preferred name (use non-diacritical o instead of umlaut ö) | ['kolsch'] = {'Kölsch', 'ksh'}, -- use IANA/ISO 639 preferred name (use non-diacritical o instead of umlaut ö) | ||
['kölsch'] = {'Kölsch', 'ksh'}, -- use IANA/ISO 639 preferred name | ['kölsch'] = {'Kölsch', 'ksh'}, -- use IANA/ISO 639 preferred name | ||
['kven'] = {'Kven', 'fkv'}, -- Unicode CLDR have decided not to support English language name for these two... | |||
['kvensk'] = {'Kven', 'fkv'}, -- ...they say to refer to IANA registry for English names | |||
['ripuarian'] = {'Ripuarian', 'mis-x-ripuar'}, -- group of dialects; no code in MediaWiki or in IANA/ISO 639 | ['ripuarian'] = {'Ripuarian', 'mis-x-ripuar'}, -- group of dialects; no code in MediaWiki or in IANA/ISO 639 | ||
-- [' | ['serbian (cyrillic script)'] = {'Serbian (Cyrillic script)', 'sr-cyrl'}, -- special case to get correct tag when |language=sr-ec | ||
['taiwanese hokkien'] = {'Taiwanese Hokkien', 'nan- | ['serbian (latin script)'] = {'Serbian (Latin script)', 'sr-latn'}, -- special case to get correct tag when |language=sr-el | ||
['swiss german'] = {'Swiss German', 'gsw'}, | |||
['taiwanese hokkien'] = {'Taiwanese Hokkien', 'nan-tw'}, -- make room for MediaWiki/IANA/ISO 639 nan: Min Nan Chinese | |||
['tosk albanian'] = {'Tosk Albanian', 'als'}, -- MediaWiki replaces 'Tosk Albanian' with 'Alemannisch' so 'Tosk Albanian' cannot be found | ['tosk albanian'] = {'Tosk Albanian', 'als'}, -- MediaWiki replaces 'Tosk Albanian' with 'Alemannisch' so 'Tosk Albanian' cannot be found | ||
['valencian'] = {'Valencian', 'ca'}, | ['valencian'] = {'Valencian', 'ca-valencia'}, -- variant of Catalan; categorizes as Valencian | ||
} | } | ||
--[[ | --[[---------------< P R O P E R T I E S _ C A T E G O R I E S >---------------- | ||
Properties categories. These are used for investigating qualities of citations. | |||
]] | ]] | ||
local prop_cats = { | local prop_cats = { | ||
[' | ['foreign-lang-source'] = 'CS1 $1-language sources ($2)', -- |language= categories; $1 is foreign-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 | ||
[' | ['interproj-linked-name'] = 'CS1 interproject-linked names|$1', -- any author, editor, etc that has an interproject link; $1 is interproject tag used as a sort key | ||
['location test'] = 'CS1 location test', | ['interwiki-linked-name'] = 'CS1 interwiki-linked names|$1', -- any author, editor, etc that has an interwiki link; $1 is interwiki tag used as a sort key; yeilds to interproject | ||
[' | ['local-lang-source'] = 'CS1 $1-language sources ($2)', -- |language= categories; $1 is local-language name, $2 is ISO639-1 code; not emitted when local_lang_cat_enable is false | ||
[' | ['location-test'] = 'CS1 location test', | ||
[' | ['long-vol'] = 'CS1: long volume value', -- probably temporary cat to identify scope of |volume= values longer than 4 characters | ||
[' | ['script'] = 'CS1 uses $1-language script ($2)', -- |script-title=xx: has matching category; $1 is language name, $2 is ISO639-1 code | ||
['tracked-param'] = 'CS1 tracked parameter: $1', -- $1 is base (enumerators removed) parameter name | |||
['year-range-abbreviated'] = 'CS1: abbreviated year range', -- probably temporary cat to identify scope of |date=, |year= values using YYYY–YY form | |||
} | } | ||
--[[ | --[[-------------------< T I T L E _ T Y P E S >-------------------------------- | ||
Here we map a template's CitationClass to TitleType (default values for |type= parameter) | Here we map a template's CitationClass to TitleType (default values for |type= parameter) | ||
Line 853: | Line 1,260: | ||
local title_types = { | local title_types = { | ||
['AV-media-notes'] = 'Media notes', | ['AV-media-notes'] = 'Media notes', | ||
['document'] = 'Document', | |||
['interview'] = 'Interview', | ['interview'] = 'Interview', | ||
['mailinglist'] = 'Mailing list', | ['mailinglist'] = 'Mailing list', | ||
Line 859: | Line 1,267: | ||
['pressrelease'] = 'Press release', | ['pressrelease'] = 'Press release', | ||
['report'] = 'Report', | ['report'] = 'Report', | ||
['speech'] = 'Speech', | |||
['techreport'] = 'Technical report', | ['techreport'] = 'Technical report', | ||
['thesis'] = 'Thesis', | ['thesis'] = 'Thesis', | ||
Line 864: | Line 1,273: | ||
--[[ | --[[--------------------------< B U I L D _ K N O W N _ F R E E _ D O I _ R E G I S T R A N T S _ T A B L E >-- | ||
build a table of doi registrants known to be free-to-read In a doi, the registrant ID is the series of digits | |||
between the '10.' and the first '/': in doi 10.1100/sommat, 1100 is the registrant ID | |||
see §3.2.2 DOI prefix of the Doi Handbook p. 43 | |||
https://www.doi.org/doi-handbook/DOI_Handbook_Final.pdf#page=43 | |||
]] | ]] | ||
local function build_free_doi_registrants_table() | |||
local registrants_t = {}; | |||
for _, v in ipairs ({ | |||
'1045', '1074', '1096', '1100', '1155', '1186', '1194', '1371', '1629', '1989', '1999', '2147', '2196', '3285', '3389', '3390', | |||
'3748', '3814', '3847', '3897', '4061', '4089', '4103', '4172', '4175', '4230', '4236', '4239', '4240', '4249', '4251', | |||
'4252', '4253', '4254', '4291', '4292', '4329', '4330', '4331', '5194', '5210', '5306', '5312', '5313', '5314', | |||
'5315', '5316', '5317', '5318', '5319', '5320', '5321', '5334', '5402', '5409', '5410', '5411', '5412', | |||
'5492', '5493', '5494', '5495', '5496', '5497', '5498', '5499', '5500', '5501', '5527', '5528', '5662', | |||
'6064', '6219', '7167', '7217', '7287', '7482', '7490', '7554', '7717', '7759', '7766', '11131', '11569', '11647', | |||
'11648', '12688', '12703', '12715', '12942', '12998', '13105', '14256', '14293', '14303', '15215', '15347', '15412', '15560', '16995', | |||
'17645', '19080', '19173', '20944', '21037', '21468', '21767', '22261', '22323', '22459', '24105', '24196', '24966', | |||
'26775', '30845', '32545', '35711', '35712', '35713', '35995', '36648', '37126', '37532', '37871', '47128', | |||
'47622', '47959', '52437', '52975', '53288', '54081', '54947', '55667', '55914', '57009', '58647', '59081', | |||
}) do | |||
registrants_t[v] = true; -- build a k/v table of known free-to-read doi registrants | |||
end | |||
return registrants_t; | |||
end | |||
local extended_registrants_t = { -- known free registrants identifiable by the doi suffix incipit | |||
['1016'] = {'j.heliyon'}, -- Heliyon | |||
['1046'] = {'j.1365-8711', 'j.1365-246x'}, -- MNRAS, GJI | |||
['1093'] = {'mnras', 'mnrasl', 'gji', 'rasti'}, -- MNRAS, MNRAS Letters, GJI, RASTI | |||
['1099'] = {'acmi', 'mic', '00221287', 'mgen'}, -- Access Microbiology, Microbiology, Journal of General Microbiology, Microbial Genomics | |||
['1111'] = {'j.1365-2966', 'j.1745-3933', 'j.1365-246X'}, -- MNRAS, MNRAS Letters, GJI | |||
['1210'] = {'jendso','jcemcr'}, -- Journal of the Endocrine Society, JCEM Case Reports | |||
} | |||
--[[===================<< E R R O R M E S S A G I N G >>====================== | |||
]] | |||
--[[ | --[[----------< E R R O R M E S S A G E S U P P L I M E N T S >------------- | ||
I18N for those messages that are supplemented with additional specific text that | |||
the error | describes the reason for the error | ||
TODO: merge this with special_case_translations{}? | TODO: merge this with special_case_translations{}? | ||
Line 878: | Line 1,325: | ||
local err_msg_supl = { | local err_msg_supl = { | ||
['char'] = 'invalid character', -- isbn, sbn | ['char'] = 'invalid character', -- |isbn=, |sbn= | ||
['check'] = 'checksum', -- isbn, sbn | ['check'] = 'checksum', -- |isbn=, |sbn= | ||
['flag'] = 'flag', -- archive-url | ['flag'] = 'flag', -- |archive-url= | ||
['form'] = 'invalid form', -- isbn, sbn | ['form'] = 'invalid form', -- |isbn=, |sbn= | ||
['group'] = 'invalid group id', -- isbn | ['group'] = 'invalid group id', -- |isbn= | ||
['initials'] = 'initials', -- | ['initials'] = 'initials', -- Vancouver | ||
['journal'] = 'journal', -- bibcode | ['invalid language code'] = 'invalid language code', -- |script-<param>= | ||
['length'] = 'length', -- isbn, bibcode, sbn | ['journal'] = 'journal', -- |bibcode= | ||
['liveweb'] = 'liveweb', -- archive-url | ['length'] = 'length', -- |isbn=, |bibcode=, |sbn= | ||
['missing comma'] = 'missing comma', -- | ['liveweb'] = 'liveweb', -- |archive-url= | ||
['name'] = 'name', -- | ['missing comma'] = 'missing comma', -- Vancouver | ||
['non-Latin char'] = 'non-Latin character', -- | ['missing prefix'] = 'missing prefix', -- |script-<param>= | ||
['path'] = 'path', -- archive-url | ['missing title part'] = 'missing title part', -- |script-<param>= | ||
['prefix'] = 'invalid prefix', -- isbn | ['name'] = 'name', -- Vancouver | ||
['punctuation'] = 'punctuation', -- | ['non-Latin char'] = 'non-Latin character', -- Vancouver | ||
['save'] = 'save command', -- archive-url | ['path'] = 'path', -- |archive-url= | ||
['suffix'] = 'suffix', -- | ['prefix'] = 'invalid prefix', -- |isbn= | ||
['timestamp'] = 'timestamp', -- archive-url | ['punctuation'] = 'punctuation', -- Vancouver | ||
['value'] = 'value', -- bibcode | ['save'] = 'save command', -- |archive-url= | ||
['year'] = 'year', -- bibcode | ['suffix'] = 'suffix', -- Vancouver | ||
['timestamp'] = 'timestamp', -- |archive-url= | |||
['unknown language code'] = 'unknown language code', -- |script-<param>= | |||
['value'] = 'value', -- |bibcode= | |||
['year'] = 'year', -- |bibcode= | |||
} | } | ||
--[[ | --[[--------------< E R R O R _ C O N D I T I O N S >--------------------------- | ||
Error condition table | Error condition table. This table has two sections: errors at the top, maintenance | ||
at the bottom. Maint 'messaging' does not have a 'message' (message=nil) | |||
The following contains a list of IDs for various error conditions defined in the code. For each ID, we specify a | The following contains a list of IDs for various error conditions defined in the | ||
text message to display, an error category to include, and whether the error message should be wrapped as a hidden comment. | code. For each ID, we specify a text message to display, an error category to | ||
include, and whether the error message should be wrapped as a hidden comment. | |||
Anchor changes require identical changes to matching anchor in Help:CS1 errors | Anchor changes require identical changes to matching anchor in Help:CS1 errors | ||
TODO: rename error_conditions{} to something more generic; create separate error | |||
and maint tables inside that? | |||
]] | ]] | ||
local error_conditions = { | local error_conditions = { | ||
err_accessdate_missing_url = { | |||
message = '<code class="cs1-code">|access-date=</code> requires <code class="cs1-code">|url=</code>', | message = '<code class="cs1-code">|access-date=</code> requires <code class="cs1-code">|url=</code>', | ||
anchor = 'accessdate_missing_url', | anchor = 'accessdate_missing_url', | ||
category = ' | category = 'CS1 errors: access-date without URL', | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_apostrophe_markup = { | |||
message = 'Italic or bold markup not allowed in: <code class="cs1-code">|$1=</code>', -- $1 is parameter name | message = 'Italic or bold markup not allowed in: <code class="cs1-code">|$1=</code>', -- $1 is parameter name | ||
anchor = 'apostrophe_markup', | anchor = 'apostrophe_markup', | ||
Line 925: | Line 1,381: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_archive_date_missing_url = { | |||
message = '<code class="cs1-code">|archive-date=</code> requires <code class="cs1-code">|archive-url=</code>', | |||
anchor = 'archive_date_missing_url', | |||
category = 'CS1 errors: archive-url', | |||
hidden = false | |||
}, | |||
err_archive_date_url_ts_mismatch = { | |||
message = '<code class="cs1-code">|archive-date=</code> / <code class="cs1-code">|archive-url=</code> timestamp mismatch; $1 suggested', | |||
anchor = 'archive_date_url_ts_mismatch', | |||
category = 'CS1 errors: archive-url', | |||
hidden = false | |||
}, | |||
err_archive_missing_date = { | |||
message = '<code class="cs1-code">|archive-url=</code> requires <code class="cs1-code">|archive-date=</code>', | message = '<code class="cs1-code">|archive-url=</code> requires <code class="cs1-code">|archive-date=</code>', | ||
anchor = 'archive_missing_date', | anchor = 'archive_missing_date', | ||
category = ' | category = 'CS1 errors: archive-url', | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_archive_missing_url = { | |||
message = '<code class="cs1-code">|archive-url=</code> requires <code class="cs1-code">|url=</code>', | message = '<code class="cs1-code">|archive-url=</code> requires <code class="cs1-code">|url=</code>', | ||
anchor = 'archive_missing_url', | anchor = 'archive_missing_url', | ||
category = ' | category = 'CS1 errors: archive-url', | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_archive_url = { | |||
message = '<code class="cs1-code">|archive-url=</code> is malformed: $1', -- $1 is error message detail | message = '<code class="cs1-code">|archive-url=</code> is malformed: $1', -- $1 is error message detail | ||
anchor = 'archive_url', | anchor = 'archive_url', | ||
category = ' | category = 'CS1 errors: archive-url', | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_arxiv_missing = { | |||
message = '<code class="cs1-code">|arxiv=</code> required', | message = '<code class="cs1-code">|arxiv=</code> required', | ||
anchor = 'arxiv_missing', | anchor = 'arxiv_missing', | ||
Line 949: | Line 1,417: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_asintld_missing_asin = { | |||
message = '<code class="cs1-code">|$1=</code> requires <code class="cs1-code">|asin=</code>', -- $1 is parameter name | |||
anchor = 'asintld_missing_asin', | |||
category = 'CS1 errors: ASIN TLD', | |||
hidden = false | |||
}, | |||
err_bad_arxiv = { | |||
message = 'Check <code class="cs1-code">|arxiv=</code> value', | message = 'Check <code class="cs1-code">|arxiv=</code> value', | ||
anchor = 'bad_arxiv', | anchor = 'bad_arxiv', | ||
Line 955: | Line 1,429: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_bad_asin = { | |||
message = 'Check <code class="cs1-code">|asin=</code> value', | message = 'Check <code class="cs1-code">|asin=</code> value', | ||
anchor = 'bad_asin', | anchor = 'bad_asin', | ||
Line 961: | Line 1,435: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_bad_asin_tld = { | |||
message = 'Check <code class="cs1-code">|asin-tld=</code> value', | |||
anchor = 'bad_asin_tld', | |||
category ='CS1 errors: ASIN TLD', | |||
hidden = false | |||
}, | |||
err_bad_bibcode = { | |||
message = 'Check <code class="cs1-code">|bibcode=</code> $1', -- $1 is error message detail | message = 'Check <code class="cs1-code">|bibcode=</code> $1', -- $1 is error message detail | ||
anchor = 'bad_bibcode', | anchor = 'bad_bibcode', | ||
Line 967: | Line 1,447: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_bad_biorxiv = { | |||
message = 'Check <code class="cs1-code">|biorxiv=</code> value', | message = 'Check <code class="cs1-code">|biorxiv=</code> value', | ||
anchor = 'bad_biorxiv', | anchor = 'bad_biorxiv', | ||
Line 973: | Line 1,453: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_bad_citeseerx = { | |||
message = 'Check <code class="cs1-code">|citeseerx=</code> value', | message = 'Check <code class="cs1-code">|citeseerx=</code> value', | ||
anchor = 'bad_citeseerx', | anchor = 'bad_citeseerx', | ||
Line 979: | Line 1,459: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_bad_date = { | |||
message = 'Check date values in: | message = 'Check date values in: $1', -- $1 is a parameter name list | ||
anchor = 'bad_date', | anchor = 'bad_date', | ||
category = 'CS1 errors: dates', | category = 'CS1 errors: dates', | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_bad_doi = { | |||
message = 'Check <code class="cs1-code">|doi=</code> value', | message = 'Check <code class="cs1-code">|doi=</code> value', | ||
anchor = 'bad_doi', | anchor = 'bad_doi', | ||
Line 991: | Line 1,471: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_bad_hdl = { | |||
message = 'Check <code class="cs1-code">|hdl=</code> value', | message = 'Check <code class="cs1-code">|hdl=</code> value', | ||
anchor = 'bad_hdl', | anchor = 'bad_hdl', | ||
Line 997: | Line 1,477: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_bad_isbn = { | |||
message = 'Check <code class="cs1-code">|isbn=</code> value: $1', -- $1 is error message detail | message = 'Check <code class="cs1-code">|isbn=</code> value: $1', -- $1 is error message detail | ||
anchor = 'bad_isbn', | anchor = 'bad_isbn', | ||
Line 1,003: | Line 1,483: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_bad_ismn = { | |||
message = 'Check <code class="cs1-code">|ismn=</code> value', | message = 'Check <code class="cs1-code">|ismn=</code> value', | ||
anchor = 'bad_ismn', | anchor = 'bad_ismn', | ||
Line 1,009: | Line 1,489: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_bad_issn = { | |||
message = 'Check <code class="cs1-code">|$1issn=</code> value', -- $1 is 'e' or '' for eissn or issn | message = 'Check <code class="cs1-code">|$1issn=</code> value', -- $1 is 'e' or '' for eissn or issn | ||
anchor = 'bad_issn', | anchor = 'bad_issn', | ||
Line 1,015: | Line 1,495: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_bad_jfm = { | |||
message = 'Check <code class="cs1-code">|jfm=</code> value', | message = 'Check <code class="cs1-code">|jfm=</code> value', | ||
anchor = 'bad_jfm', | anchor = 'bad_jfm', | ||
Line 1,021: | Line 1,501: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_bad_jstor = { | |||
message = 'Check <code class="cs1-code">|jstor=</code> value', | |||
anchor = 'bad_jstor', | |||
category = 'CS1 errors: JSTOR', | |||
hidden = false | |||
}, | |||
err_bad_lccn = { | |||
message = 'Check <code class="cs1-code">|lccn=</code> value', | message = 'Check <code class="cs1-code">|lccn=</code> value', | ||
anchor = 'bad_lccn', | anchor = 'bad_lccn', | ||
Line 1,027: | Line 1,513: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_bad_medrxiv = { | |||
message = 'Check <code class="cs1-code">| | message = 'Check <code class="cs1-code">|medrxiv=</code> value', | ||
anchor = ' | anchor = 'bad_medrxiv', | ||
category = 'CS1 errors: | category = 'CS1 errors: medRxiv', | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_bad_mr = { | |||
message = 'Check <code class="cs1-code">|mr=</code> value', | message = 'Check <code class="cs1-code">|mr=</code> value', | ||
anchor = 'bad_mr', | anchor = 'bad_mr', | ||
Line 1,039: | Line 1,525: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_bad_oclc = { | |||
message = 'Check <code class="cs1-code">|oclc=</code> value', | |||
anchor = 'bad_oclc', | |||
category = 'CS1 errors: OCLC', | |||
hidden = false | |||
}, | |||
err_bad_ol = { | |||
message = 'Check <code class="cs1-code">|ol=</code> value', | message = 'Check <code class="cs1-code">|ol=</code> value', | ||
anchor = 'bad_ol', | anchor = 'bad_ol', | ||
Line 1,045: | Line 1,537: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_bad_osti = { | |||
message = 'Check <code class="cs1-code">|osti=</code> value', | |||
anchor = 'bad_osti', | |||
category = 'CS1 errors: OSTI', | |||
hidden = false | |||
}, | |||
err_bad_paramlink = { -- for |title-link=, |author/editor/translator-link=, |series-link=, |episode-link= | |||
message = 'Check <code class="cs1-code">|$1=</code> value', -- $1 is parameter name | message = 'Check <code class="cs1-code">|$1=</code> value', -- $1 is parameter name | ||
anchor = 'bad_paramlink', | anchor = 'bad_paramlink', | ||
Line 1,051: | Line 1,549: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_bad_pmc = { | |||
message = 'Check <code class="cs1-code">|pmc=</code> value', | message = 'Check <code class="cs1-code">|pmc=</code> value', | ||
anchor = 'bad_pmc', | anchor = 'bad_pmc', | ||
Line 1,057: | Line 1,555: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_bad_pmid = { | |||
message = 'Check <code class="cs1-code">|pmid=</code> value', | message = 'Check <code class="cs1-code">|pmid=</code> value', | ||
anchor = 'bad_pmid', | anchor = 'bad_pmid', | ||
Line 1,063: | Line 1,561: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_bad_rfc = { | |||
message = 'Check <code class="cs1-code">| | message = 'Check <code class="cs1-code">|rfc=</code> value', | ||
anchor = ' | anchor = 'bad_rfc', | ||
category = 'CS1 errors: | category = 'CS1 errors: RFC', | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_bad_s2cid = { | |||
message = 'Check <code class="cs1-code">|s2cid=</code> value', | message = 'Check <code class="cs1-code">|s2cid=</code> value', | ||
anchor = 'bad_s2cid', | anchor = 'bad_s2cid', | ||
Line 1,075: | Line 1,573: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_bad_sbn = { | |||
message = 'Check <code class="cs1-code">|sbn=</code> value: $1', -- $1 is error message detail | message = 'Check <code class="cs1-code">|sbn=</code> value: $1', -- $1 is error message detail | ||
anchor = 'bad_sbn', | anchor = 'bad_sbn', | ||
Line 1,081: | Line 1,579: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_bad_ssrn = { | |||
message = 'Check <code class="cs1-code">|ssrn=</code> value', | message = 'Check <code class="cs1-code">|ssrn=</code> value', | ||
anchor = 'bad_ssrn', | anchor = 'bad_ssrn', | ||
Line 1,087: | Line 1,585: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_bad_url = { | |||
message = 'Check $1 value', -- $1 is parameter name | message = 'Check $1 value', -- $1 is parameter name | ||
anchor = 'bad_url', | anchor = 'bad_url', | ||
category = ' | category = 'CS1 errors: URL', | ||
hidden = false | |||
}, | |||
err_bad_usenet_id = { | |||
message = 'Check <code class="cs1-code">|message-id=</code> value', | |||
anchor = 'bad_message_id', | |||
category = 'CS1 errors: message-id', | |||
hidden = false | hidden = false | ||
}, | }, | ||
err_bad_zbl = { | |||
message = 'Check <code class="cs1-code">|zbl=</code> value', | message = 'Check <code class="cs1-code">|zbl=</code> value', | ||
anchor = 'bad_zbl', | anchor = 'bad_zbl', | ||
category = 'CS1 errors: | category = 'CS1 errors: Zbl', | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_bare_url_missing_title = { | |||
message = '$1 missing title', -- $1 is parameter name | message = '$1 missing title', -- $1 is parameter name | ||
anchor = 'bare_url_missing_title', | anchor = 'bare_url_missing_title', | ||
category = ' | category = 'CS1 errors: bare URL', | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_biorxiv_missing = { | |||
message = '<code class="cs1-code">|biorxiv=</code> required', | message = '<code class="cs1-code">|biorxiv=</code> required', | ||
anchor = 'biorxiv_missing', | anchor = 'biorxiv_missing', | ||
Line 1,111: | Line 1,615: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_chapter_ignored = { | |||
message = '<code class="cs1-code">|$1=</code> ignored', -- $1 is parameter name | message = '<code class="cs1-code">|$1=</code> ignored', -- $1 is parameter name | ||
anchor = 'chapter_ignored', | anchor = 'chapter_ignored', | ||
Line 1,117: | Line 1,621: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_citation_missing_title = { | |||
message = 'Missing or empty <code class="cs1-code">|$1=</code>', -- $1 is parameter name | message = 'Missing or empty <code class="cs1-code">|$1=</code>', -- $1 is parameter name | ||
anchor = 'citation_missing_title', | anchor = 'citation_missing_title', | ||
category = ' | category = 'CS1 errors: missing title', | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_citeseerx_missing = { | |||
message = '<code class="cs1-code">|citeseerx=</code> required', | message = '<code class="cs1-code">|citeseerx=</code> required', | ||
anchor = 'citeseerx_missing', | anchor = 'citeseerx_missing', | ||
Line 1,129: | Line 1,633: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_cite_web_url = { -- this error applies to cite web and to cite podcast | |||
message = 'Missing or empty <code class="cs1-code">|url=</code>', | message = 'Missing or empty <code class="cs1-code">|url=</code>', | ||
anchor = 'cite_web_url', | anchor = 'cite_web_url', | ||
category = ' | category = 'CS1 errors: requires URL', | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_class_ignored = { | |||
message = '<code class="cs1-code">|class=</code> ignored', | message = '<code class="cs1-code">|class=</code> ignored', | ||
anchor = 'class_ignored', | anchor = 'class_ignored', | ||
Line 1,141: | Line 1,645: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_contributor_ignored = { | |||
message = '<code class="cs1-code">|contributor=</code> ignored', | message = '<code class="cs1-code">|contributor=</code> ignored', | ||
anchor = 'contributor_ignored', | anchor = 'contributor_ignored', | ||
Line 1,147: | Line 1,651: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_contributor_missing_required_param = { | |||
message = '<code class="cs1-code">|contributor=</code> requires <code class="cs1-code">|$1=</code>', -- $1 is parameter name | message = '<code class="cs1-code">|contributor=</code> requires <code class="cs1-code">|$1=</code>', -- $1 is parameter name | ||
anchor = 'contributor_missing_required_param', | anchor = 'contributor_missing_required_param', | ||
Line 1,153: | Line 1,657: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_deprecated_params = { | |||
message = 'Cite uses deprecated parameter <code class="cs1-code">|$1=</code>', -- $1 is parameter name | message = 'Cite uses deprecated parameter <code class="cs1-code">|$1=</code>', -- $1 is parameter name | ||
anchor = 'deprecated_params', | anchor = 'deprecated_params', | ||
Line 1,159: | Line 1,663: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_disp_name = { | |||
message = 'Invalid <code class="cs1-code">|$1=$2</code>', -- $1 is parameter name; $2 is the assigned value | |||
anchor = 'disp_name', | |||
category = 'CS1 errors: display-names', | |||
hidden = false, | |||
}, | |||
err_doibroken_missing_doi = { | |||
message = '<code class="cs1-code">|$1=</code> requires <code class="cs1-code">|doi=</code>', -- $1 is parameter name | message = '<code class="cs1-code">|$1=</code> requires <code class="cs1-code">|doi=</code>', -- $1 is parameter name | ||
anchor = 'doibroken_missing_doi', | anchor = 'doibroken_missing_doi', | ||
Line 1,165: | Line 1,675: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_embargo_missing_pmc = { | |||
message = '<code class="cs1-code">|$1=</code> requires <code class="cs1-code">|pmc=</code>', -- $1 is parameter name | |||
anchor = 'embargo_missing_pmc', | |||
category = 'CS1 errors: PMC embargo', | |||
hidden = false | |||
}, | |||
err_empty_citation = { | |||
message = 'Empty citation', | message = 'Empty citation', | ||
anchor = 'empty_citation', | anchor = 'empty_citation', | ||
category = ' | category = 'CS1 errors: empty citation', | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_etal = { | |||
message = 'Explicit use of et al. in: <code class="cs1-code">|$1=</code>', -- $1 is parameter name | message = 'Explicit use of et al. in: <code class="cs1-code">|$1=</code>', -- $1 is parameter name | ||
anchor = 'explicit_et_al', | anchor = 'explicit_et_al', | ||
Line 1,177: | Line 1,693: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_extra_text_edition = { | |||
message = '<code class="cs1-code">|edition=</code> has extra text', | |||
anchor = 'extra_text_edition', | |||
category = 'CS1 errors: extra text: edition', | |||
hidden = false, | |||
}, | |||
err_extra_text_issue = { | |||
message = '<code class="cs1-code">|$1=</code> has extra text', -- $1 is parameter name | |||
anchor = 'extra_text_issue', | |||
category = 'CS1 errors: extra text: issue', | |||
hidden = false, | |||
}, | |||
err_extra_text_pages = { | |||
message = '<code class="cs1-code">|$1=</code> has extra text', -- $1 is parameter name | |||
anchor = 'extra_text_pages', | |||
category = 'CS1 errors: extra text: pages', | |||
hidden = false, | |||
}, | |||
err_extra_text_volume = { | |||
message = '<code class="cs1-code">|$1=</code> has extra text', -- $1 is parameter name | |||
anchor = 'extra_text_volume', | |||
category = 'CS1 errors: extra text: volume', | |||
hidden = false, | |||
}, | |||
err_first_missing_last = { | |||
message = '<code class="cs1-code">|$1=</code> missing <code class="cs1-code">|$2=</code>', -- $1 is first alias, $2 is matching last alias | message = '<code class="cs1-code">|$1=</code> missing <code class="cs1-code">|$2=</code>', -- $1 is first alias, $2 is matching last alias | ||
anchor = 'first_missing_last', | anchor = 'first_missing_last', | ||
Line 1,183: | Line 1,723: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_format_missing_url = { | |||
message = '<code class="cs1-code">|$1=</code> requires <code class="cs1-code">|$2=</code>', -- $1 is format parameter $2 is url parameter | message = '<code class="cs1-code">|$1=</code> requires <code class="cs1-code">|$2=</code>', -- $1 is format parameter $2 is url parameter | ||
anchor = 'format_missing_url', | anchor = 'format_missing_url', | ||
category = ' | category = 'CS1 errors: format without URL', | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_generic_name = { | |||
message = 'Invalid <code class="cs1-code">|$1=$2</code>', -- $1 is parameter name $2 is | message = '<code class="cs1-code">|$1=</code> has generic name', -- $1 is parameter name | ||
anchor = 'generic_name', | |||
category = 'CS1 errors: generic name', | |||
hidden = false, | |||
}, | |||
err_generic_title = { | |||
message = 'Cite uses generic title', | |||
anchor = 'generic_title', | |||
category = 'CS1 errors: generic title', | |||
hidden = false, | |||
}, | |||
err_invalid_param_val = { | |||
message = 'Invalid <code class="cs1-code">|$1=$2</code>', -- $1 is parameter name $2 is parameter value | |||
anchor = 'invalid_param_val', | anchor = 'invalid_param_val', | ||
category = 'CS1 errors: invalid parameter value', | category = 'CS1 errors: invalid parameter value', | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_invisible_char = { | |||
message = '$1 in $2 at position $3', -- $1 is invisible char $2 is parameter name $3 is position number | message = '$1 in $2 at position $3', -- $1 is invisible char $2 is parameter name $3 is position number | ||
anchor = 'invisible_char', | anchor = 'invisible_char', | ||
Line 1,201: | Line 1,753: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_medrxiv_missing = { | |||
message = '<code class="cs1-code">|medrxiv=</code> required', | |||
anchor = 'medrxiv_missing', | |||
category = 'CS1 errors: medRxiv', -- same as bad medRxiv | |||
hidden = false | |||
}, | |||
err_missing_name = { | |||
message = 'Missing <code class="cs1-code">|$1$2=</code>', -- $1 is modified NameList; $2 is enumerator | message = 'Missing <code class="cs1-code">|$1$2=</code>', -- $1 is modified NameList; $2 is enumerator | ||
anchor = 'missing_name', | anchor = 'missing_name', | ||
Line 1,207: | Line 1,765: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_missing_periodical = { | |||
message = 'Cite $1 requires <code class="cs1-code">|$2=</code>', -- $1 is cs1 template name; $2 is canonical periodical parameter name for cite $1 | message = 'Cite $1 requires <code class="cs1-code">|$2=</code>', -- $1 is cs1 template name; $2 is canonical periodical parameter name for cite $1 | ||
anchor = 'missing_periodical', | anchor = 'missing_periodical', | ||
category = 'CS1 errors: missing periodical', | category = 'CS1 errors: missing periodical', | ||
hidden = | hidden = false | ||
}, | }, | ||
err_missing_pipe = { | |||
message = 'Missing pipe in: <code class="cs1-code">|$1=</code>', -- $1 is parameter name | message = 'Missing pipe in: <code class="cs1-code">|$1=</code>', -- $1 is parameter name | ||
anchor = 'missing_pipe', | anchor = 'missing_pipe', | ||
Line 1,219: | Line 1,777: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_missing_publisher = { | |||
message = 'Cite $1 requires <code class="cs1-code">|$2=</code>', -- $1 is cs1 template name; $2 is canonical publisher parameter name for cite $1 | |||
anchor = 'missing_publisher', | |||
category = 'CS1 errors: missing publisher', | |||
hidden = false | |||
}, | |||
err_numeric_names = { | |||
message = '<code class="cs1-code">|$1=</code> has numeric name', -- $1 is parameter name', | |||
anchor = 'numeric_names', | |||
category = 'CS1 errors: numeric name', | |||
hidden = false, | |||
}, | |||
err_param_access_requires_param = { | |||
message = '<code class="cs1-code">|$1-access=</code> requires <code class="cs1-code">|$1=</code>', -- $1 is parameter name | message = '<code class="cs1-code">|$1-access=</code> requires <code class="cs1-code">|$1=</code>', -- $1 is parameter name | ||
anchor = 'param_access_requires_param', | anchor = 'param_access_requires_param', | ||
Line 1,225: | Line 1,795: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_param_has_ext_link = { | |||
message = 'External link in <code class="cs1-code">$1</code>', -- $1 is parameter name | message = 'External link in <code class="cs1-code">$1</code>', -- $1 is parameter name | ||
anchor = 'param_has_ext_link', | anchor = 'param_has_ext_link', | ||
Line 1,231: | Line 1,801: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_parameter_ignored = { | |||
message = 'Unknown parameter <code class="cs1-code">|$1=</code> ignored', -- $1 is parameter name | message = 'Unknown parameter <code class="cs1-code">|$1=</code> ignored', -- $1 is parameter name | ||
anchor = 'parameter_ignored', | anchor = 'parameter_ignored', | ||
category = ' | category = 'CS1 errors: unsupported parameter', | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_parameter_ignored_suggest = { | |||
message = 'Unknown parameter <code class="cs1-code">|$1=</code> ignored (<code class="cs1-code">|$2=</code> suggested)', -- $1 is unknown | message = 'Unknown parameter <code class="cs1-code">|$1=</code> ignored (<code class="cs1-code">|$2=</code> suggested)', -- $1 is unknown parameter $2 is suggested parameter name | ||
anchor = 'parameter_ignored_suggest', | anchor = 'parameter_ignored_suggest', | ||
category = ' | category = 'CS1 errors: unsupported parameter', | ||
hidden = false | |||
}, | |||
err_periodical_ignored = { | |||
message = '<code class="cs1-code">|$1=</code> ignored', -- $1 is parameter name | |||
anchor = 'periodical_ignored', | |||
category = 'CS1 errors: periodical ignored', | |||
hidden = false | hidden = false | ||
}, | }, | ||
err_redundant_parameters = { | |||
message = 'More than one of $1 specified', -- $1 is error message detail | message = 'More than one of $1 specified', -- $1 is error message detail | ||
anchor = 'redundant_parameters', | anchor = 'redundant_parameters', | ||
category = ' | category = 'CS1 errors: redundant parameter', | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_script_parameter = { | |||
message = 'Invalid <code class="cs1-code">|$1=</code>: $2', -- $1 is parameter name $2 is script language code or error detail | message = 'Invalid <code class="cs1-code">|$1=</code>: $2', -- $1 is parameter name $2 is script language code or error detail | ||
anchor = 'script_parameter', | anchor = 'script_parameter', | ||
Line 1,255: | Line 1,831: | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_ssrn_missing = { | |||
message = '<code class="cs1-code">|ssrn=</code> required', | message = '<code class="cs1-code">|ssrn=</code> required', | ||
anchor = 'ssrn_missing', | anchor = 'ssrn_missing', | ||
category = 'CS1 errors: | category = 'CS1 errors: SSRN', | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_text_ignored = { | |||
message = 'Text "$1" ignored', -- $1 is ignored text | message = 'Text "$1" ignored', -- $1 is ignored text | ||
anchor = 'text_ignored', | anchor = 'text_ignored', | ||
category = ' | category = 'CS1 errors: unrecognized parameter', | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_trans_missing_title = { | |||
message = '<code class="cs1-code">|trans-$1=</code> requires <code class="cs1-code">|$1=</code> or | message = '<code class="cs1-code">|trans-$1=</code> requires <code class="cs1-code">|$1=</code> or <code class="cs1-code">|script-$1=</code>', -- $1 is base parameter name | ||
anchor = 'trans_missing_title', | anchor = 'trans_missing_title', | ||
category = 'CS1 errors: translated title', | category = 'CS1 errors: translated title', | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_param_unknown_empty = { | |||
message = 'Vancouver style error: $1', | message = 'Cite has empty unknown parameter$1: $2', -- $1 is 's' or empty space; $2 is emty unknown param list | ||
anchor = 'param_unknown_empty', | |||
category = 'CS1 errors: empty unknown parameters', | |||
hidden = false | |||
}, | |||
err_vancouver = { | |||
message = 'Vancouver style error: $1 in name $2', -- $1 is error detail, $2 is the nth name | |||
anchor = 'vancouver', | anchor = 'vancouver', | ||
category = 'CS1 errors: Vancouver style', | category = 'CS1 errors: Vancouver style', | ||
hidden = false | hidden = false | ||
}, | }, | ||
err_wikilink_in_url = { | |||
message = 'URL–wikilink conflict', -- uses ndash | message = 'URL–wikilink conflict', -- uses ndash | ||
anchor = 'wikilink_in_url', | anchor = 'wikilink_in_url', | ||
category = 'CS1 errors: URL–wikilink conflict', -- uses ndash | category = 'CS1 errors: URL–wikilink conflict', -- uses ndash | ||
hidden = false | hidden = false | ||
}, | |||
--[[--------------------------< M A I N T >------------------------------------- | |||
maint messages do not have a message (message = nil); otherwise the structure | |||
is the same as error messages | |||
]] | |||
maint_archived_copy = { | |||
message = nil, | |||
anchor = 'archived_copy', | |||
category = 'CS1 maint: archived copy as title', | |||
hidden = true, | |||
}, | |||
maint_bibcode = { | |||
message = nil, | |||
anchor = 'bibcode', | |||
category = 'CS1 maint: bibcode', | |||
hidden = true, | |||
}, | |||
maint_location_no_publisher = { -- cite book, conference, encyclopedia; citation as book cite or encyclopedia cite | |||
message = nil, | |||
anchor = 'location_no_publisher', | |||
category = 'CS1 maint: location missing publisher', | |||
hidden = true, | |||
}, | |||
maint_bot_unknown = { | |||
message = nil, | |||
anchor = 'bot:_unknown', | |||
category = 'CS1 maint: bot: original URL status unknown', | |||
hidden = true, | |||
}, | |||
maint_date_auto_xlated = { -- date auto-translation not supported by en.wiki | |||
message = nil, | |||
anchor = 'date_auto_xlated', | |||
category = 'CS1 maint: date auto-translated', | |||
hidden = true, | |||
}, | |||
maint_date_format = { | |||
message = nil, | |||
anchor = 'date_format', | |||
category = 'CS1 maint: date format', | |||
hidden = true, | |||
}, | |||
maint_date_year = { | |||
message = nil, | |||
anchor = 'date_year', | |||
category = 'CS1 maint: date and year', | |||
hidden = true, | |||
}, | |||
maint_doi_ignore = { | |||
message = nil, | |||
anchor = 'doi_ignore', | |||
category = 'CS1 maint: ignored DOI errors', | |||
hidden = true, | |||
}, | |||
maint_doi_inactive = { | |||
message = nil, | |||
anchor = 'doi_inactive', | |||
category = 'CS1 maint: DOI inactive', | |||
hidden = true, | |||
}, | |||
maint_doi_inactive_dated = { | |||
message = nil, | |||
anchor = 'doi_inactive_dated', | |||
category = 'CS1 maint: DOI inactive as of $2$3$1', -- $1 is year, $2 is month-name or empty string, $3 is space or empty string | |||
hidden = true, | |||
}, | |||
maint_doi_unflagged_free = { | |||
message = nil, | |||
anchor = 'doi_unflagged_free', | |||
category = 'CS1 maint: unflagged free DOI', | |||
hidden = true, | |||
}, | |||
maint_extra_punct = { | |||
message = nil, | |||
anchor = 'extra_punct', | |||
category = 'CS1 maint: extra punctuation', | |||
hidden = true, | |||
}, | |||
maint_isbn_ignore = { | |||
message = nil, | |||
anchor = 'ignore_isbn_err', | |||
category = 'CS1 maint: ignored ISBN errors', | |||
hidden = true, | |||
}, | |||
maint_issn_ignore = { | |||
message = nil, | |||
anchor = 'ignore_issn', | |||
category = 'CS1 maint: ignored ISSN errors', | |||
hidden = true, | |||
}, | |||
maint_jfm_format = { | |||
message = nil, | |||
anchor = 'jfm_format', | |||
category = 'CS1 maint: JFM format', | |||
hidden = true, | |||
}, | |||
maint_location = { | |||
message = nil, | |||
anchor = 'location', | |||
category = 'CS1 maint: location', | |||
hidden = true, | |||
}, | |||
maint_mr_format = { | |||
message = nil, | |||
anchor = 'mr_format', | |||
category = 'CS1 maint: MR format', | |||
hidden = true, | |||
}, | |||
maint_mult_names = { | |||
message = nil, | |||
anchor = 'mult_names', | |||
category = 'CS1 maint: multiple names: $1', -- $1 is '<name>s list'; gets value from special_case_translation table | |||
hidden = true, | |||
}, | |||
maint_numeric_names = { | |||
message = nil, | |||
anchor = 'numeric_names', | |||
category = 'CS1 maint: numeric names: $1', -- $1 is '<name>s list'; gets value from special_case_translation table | |||
hidden = true, | |||
}, | |||
maint_others = { | |||
message = nil, | |||
anchor = 'others', | |||
category = 'CS1 maint: others', | |||
hidden = true, | |||
}, | |||
maint_others_avm = { | |||
message = nil, | |||
anchor = 'others_avm', | |||
category = 'CS1 maint: others in cite AV media (notes)', | |||
hidden = true, | |||
}, | |||
maint_overridden_setting = { | |||
message = nil, | |||
anchor = 'overridden', | |||
category = 'CS1 maint: overridden setting', | |||
hidden = true, | |||
}, | |||
maint_pmc_embargo = { | |||
message = nil, | |||
anchor = 'embargo', | |||
category = 'CS1 maint: PMC embargo expired', | |||
hidden = true, | |||
}, | |||
maint_pmc_format = { | |||
message = nil, | |||
anchor = 'pmc_format', | |||
category = 'CS1 maint: PMC format', | |||
hidden = true, | |||
}, | |||
maint_postscript = { | |||
message = nil, | |||
anchor = 'postscript', | |||
category = 'CS1 maint: postscript', | |||
hidden = true, | |||
}, | |||
maint_ref_duplicates_default = { | |||
message = nil, | |||
anchor = 'ref_default', | |||
category = 'CS1 maint: ref duplicates default', | |||
hidden = true, | |||
}, | |||
maint_unfit = { | |||
message = nil, | |||
anchor = 'unfit', | |||
category = 'CS1 maint: unfit URL', | |||
hidden = true, | |||
}, | |||
maint_unknown_lang = { | |||
message = nil, | |||
anchor = 'unknown_lang', | |||
category = 'CS1 maint: unrecognized language', | |||
hidden = true, | |||
}, | |||
maint_untitled = { | |||
message = nil, | |||
anchor = 'untitled', | |||
category = 'CS1 maint: untitled periodical', | |||
hidden = true, | |||
}, | |||
maint_url_status = { | |||
message = nil, | |||
anchor = 'url_status', | |||
category = 'CS1 maint: url-status', | |||
hidden = true, | |||
}, | |||
maint_year= { | |||
message = nil, | |||
anchor = 'year', | |||
category = 'CS1 maint: year', | |||
hidden = true, | |||
}, | |||
maint_zbl = { | |||
message = nil, | |||
anchor = 'zbl', | |||
category = 'CS1 maint: Zbl', | |||
hidden = true, | |||
}, | }, | ||
} | } | ||
--[[--------------------------< I D _ L I M I T S _ D A T A _ T >---------------------------------------------- | |||
fetch id limits for certain identifiers from c:Data:CS1/Identifier limits.tab. This source is a json tabular | |||
data file maintained at wikipedia commons. Convert the json format to a table of k/v pairs. | |||
The values from <id_limits_data_t> are used to set handle.id_limit. | |||
]] | |||
local id_limits_data_t = {}; | |||
for _, limit_t in ipairs (mw.ext.data.get ("CS1/Identifier limits.tab").data) do | |||
id_limits_data_t[limit_t[1]] = limit_t[2]; -- <limit[1]> is identifier; <limit[2]> is upper limit for that identifier | |||
end | |||
--[[--------------------------< I D _ H A N D L E R S >-------------------------------------------------------- | --[[--------------------------< I D _ H A N D L E R S >-------------------------------------------------------- | ||
The following contains a list of values for various defined identifiers. For each identifier we specify a | The following contains a list of values for various defined identifiers. For each | ||
variety of information necessary to properly render the identifier in the citation. | identifier we specify a variety of information necessary to properly render the | ||
identifier in the citation. | |||
parameters: a list of parameter aliases for this identifier; first in the list is the canonical form | parameters: a list of parameter aliases for this identifier; first in the list is the canonical form | ||
link: Wikipedia article name | link: Wikipedia article name | ||
redirect: a local redirect to a local Wikipedia article name; at en.wiki, 'ISBN (identifier)' is a redirect to 'International Standard Book Number' | redirect: a local redirect to a local Wikipedia article name; at en.wiki, 'ISBN (identifier)' is a redirect to 'International Standard Book Number' | ||
q: | q: Wikidata q number for the identifier | ||
label: the label | label: the label preceding the identifier; label is linked to a Wikipedia article (in this order): | ||
redirect from id_handlers['<id>'].redirect when use_identifier_redirects is true | redirect from id_handlers['<id>'].redirect when use_identifier_redirects is true | ||
Wikidata-supplied article name for the local wiki from id_handlers['<id>'].q | |||
local article name from id_handlers['<id>'].link | local article name from id_handlers['<id>'].link | ||
prefix: the first part of a URL that will be concatenated with a second part which usually contains the identifier | |||
suffix: optional third part to be added after the identifier | |||
prefix: the first part of a | encode: true if URI should be percent-encoded; otherwise false | ||
encode: true if | |||
COinS: identifier link or keyword for use in COinS: | COinS: identifier link or keyword for use in COinS: | ||
for identifiers registered at info-uri.info use: info:.... | for identifiers registered at info-uri.info use: info:.... where '...' is the appropriate identifier label | ||
for identifiers that have COinS keywords, use the keyword: rft.isbn, rft.issn, rft.eissn | for identifiers that have COinS keywords, use the keyword: rft.isbn, rft.issn, rft.eissn | ||
for others make a | for |asin= and |ol=, which require assembly, use the keyword: url | ||
for others make a URL using the value in prefix/suffix and #label, use the keyword: pre (not checked; any text other than 'info', 'rft', or 'url' works here) | |||
set to nil to leave the identifier out of the COinS | set to nil to leave the identifier out of the COinS | ||
separator: character or text between label and the identifier in the rendered citation | separator: character or text between label and the identifier in the rendered citation | ||
id_limit: for those identifiers with established limits, this property holds the upper limit | id_limit: for those identifiers with established limits, this property holds the upper limit | ||
access: use this parameter to set the access level for all instances of this identifier. | access: use this parameter to set the access level for all instances of this identifier. | ||
the value must be a valid access level for an identifier (see ['id-access'] in this file). | |||
custom_access: to enable custom access level for an identifier, set this parameter | custom_access: to enable custom access level for an identifier, set this parameter | ||
to the parameter that should control it (normally 'id-access') | |||
]] | ]] | ||
Line 1,325: | Line 2,125: | ||
q = 'Q118398', | q = 'Q118398', | ||
label = 'arXiv', | label = 'arXiv', | ||
prefix = 'https://arxiv.org/abs/', | |||
prefix = '//arxiv.org/abs/', | |||
encode = false, | encode = false, | ||
COinS = 'info:arxiv', | COinS = 'info:arxiv', | ||
Line 1,338: | Line 2,137: | ||
q = 'Q1753278', | q = 'Q1753278', | ||
label = 'ASIN', | label = 'ASIN', | ||
prefix = 'https://www.amazon.', | |||
prefix = '//www.amazon.', | COinS = 'url', | ||
COinS = | |||
separator = ' ', | separator = ' ', | ||
encode = false; | encode = false; | ||
Line 1,350: | Line 2,148: | ||
q = 'Q25754', | q = 'Q25754', | ||
label = 'Bibcode', | label = 'Bibcode', | ||
prefix = 'https://ui.adsabs.harvard.edu/abs/', | prefix = 'https://ui.adsabs.harvard.edu/abs/', | ||
encode = false, | encode = false, | ||
Line 1,363: | Line 2,160: | ||
q = 'Q19835482', | q = 'Q19835482', | ||
label = 'bioRxiv', | label = 'bioRxiv', | ||
prefix = 'https://doi.org/', | |||
prefix = '//doi.org/', | |||
COinS = 'pre', -- use prefix value | COinS = 'pre', -- use prefix value | ||
access = 'free', -- free to read | access = 'free', -- free to read | ||
Line 1,376: | Line 2,172: | ||
q = 'Q2715061', | q = 'Q2715061', | ||
label = 'CiteSeerX', | label = 'CiteSeerX', | ||
prefix = 'https://citeseerx.ist.psu.edu/viewdoc/summary?doi=', | |||
prefix = '//citeseerx.ist.psu.edu/viewdoc/summary?doi=', | |||
COinS = 'pre', -- use prefix value | COinS = 'pre', -- use prefix value | ||
access = 'free', -- free to read | access = 'free', -- free to read | ||
Line 1,384: | Line 2,179: | ||
}, | }, | ||
['DOI'] = { -- Used by InternetArchiveBot | ['DOI'] = { -- Used by InternetArchiveBot | ||
parameters = { 'doi', 'DOI' }, | parameters = { 'doi', 'DOI'}, | ||
link = 'Digital object identifier', | link = 'Digital object identifier', | ||
redirect = 'doi (identifier)', | redirect = 'doi (identifier)', | ||
q = 'Q25670', | q = 'Q25670', | ||
label = 'doi', | label = 'doi', | ||
prefix = 'https://doi.org/', | |||
prefix = '//doi.org/', | |||
COinS = 'info:doi', | COinS = 'info:doi', | ||
separator = ':', | separator = ':', | ||
Line 1,398: | Line 2,192: | ||
['EISSN'] = { | ['EISSN'] = { | ||
parameters = {'eissn', 'EISSN'}, | parameters = {'eissn', 'EISSN'}, | ||
link = ' | link = 'International Standard Serial Number#Electronic ISSN', | ||
redirect = 'eISSN (identifier)', | redirect = 'eISSN (identifier)', | ||
q = 'Q46339674', | q = 'Q46339674', | ||
label = 'eISSN', | label = 'eISSN', | ||
prefix = 'https://search.worldcat.org/issn/', | |||
prefix = '// | |||
COinS = 'rft.eissn', | COinS = 'rft.eissn', | ||
encode = false, | encode = false, | ||
Line 1,414: | Line 2,207: | ||
q = 'Q3126718', | q = 'Q3126718', | ||
label = 'hdl', | label = 'hdl', | ||
prefix = 'https://hdl.handle.net/', | |||
prefix = '//hdl.handle.net/', | |||
COinS = 'info:hdl', | COinS = 'info:hdl', | ||
separator = ':', | separator = ':', | ||
Line 1,422: | Line 2,214: | ||
}, | }, | ||
['ISBN'] = { -- Used by InternetArchiveBot | ['ISBN'] = { -- Used by InternetArchiveBot | ||
parameters = {'isbn', 'ISBN | parameters = {'isbn', 'ISBN'}, | ||
link = 'International Standard Book Number', | link = 'International Standard Book Number', | ||
redirect = 'ISBN (identifier)', | redirect = 'ISBN (identifier)', | ||
q = 'Q33057', | q = 'Q33057', | ||
label = 'ISBN', | label = 'ISBN', | ||
prefix = 'Special:BookSources/', | prefix = 'Special:BookSources/', | ||
COinS = 'rft.isbn', | COinS = 'rft.isbn', | ||
Line 1,438: | Line 2,229: | ||
q = 'Q1666938', | q = 'Q1666938', | ||
label = 'ISMN', | label = 'ISMN', | ||
prefix = '', -- not currently used; | prefix = '', -- not currently used; | ||
COinS = | COinS = nil, -- nil because we can't use pre or rft or info: | ||
separator = ' ', | separator = ' ', | ||
}, | }, | ||
Line 1,449: | Line 2,239: | ||
q = 'Q131276', | q = 'Q131276', | ||
label = 'ISSN', | label = 'ISSN', | ||
prefix = 'https://search.worldcat.org/issn/', | |||
prefix = '// | |||
COinS = 'rft.issn', | COinS = 'rft.issn', | ||
encode = false, | encode = false, | ||
Line 1,461: | Line 2,250: | ||
q = '', | q = '', | ||
label = 'JFM', | label = 'JFM', | ||
prefix = 'https://zbmath.org/?format=complete&q=an:', | |||
prefix = '//zbmath.org/?format=complete&q=an:', | |||
COinS = 'pre', -- use prefix value | COinS = 'pre', -- use prefix value | ||
encode = true, | encode = true, | ||
Line 1,473: | Line 2,261: | ||
q = 'Q1420342', | q = 'Q1420342', | ||
label = 'JSTOR', | label = 'JSTOR', | ||
prefix = 'https://www.jstor.org/stable/', | |||
prefix = '//www.jstor.org/stable/', | |||
COinS = 'pre', -- use prefix value | COinS = 'pre', -- use prefix value | ||
encode = false, | encode = false, | ||
Line 1,486: | Line 2,273: | ||
q = 'Q620946', | q = 'Q620946', | ||
label = 'LCCN', | label = 'LCCN', | ||
prefix = 'https://lccn.loc.gov/', | |||
prefix = '// | COinS = 'info:lccn', | ||
COinS = ' | encode = false, | ||
separator = ' ', | |||
}, | |||
['MEDRXIV'] = { | |||
parameters = {'medrxiv'}, | |||
link = 'medRxiv', | |||
redirect = 'medRxiv (identifier)', | |||
q = 'Q58465838', | |||
label = 'medRxiv', | |||
prefix = 'https://www.medrxiv.org/content/', | |||
COinS = 'pre', -- use prefix value | |||
access = 'free', -- free to read | |||
encode = false, | encode = false, | ||
separator = ' ', | separator = ' ', | ||
Line 1,498: | Line 2,296: | ||
q = 'Q211172', | q = 'Q211172', | ||
label = 'MR', | label = 'MR', | ||
prefix = 'https://mathscinet.ams.org/mathscinet-getitem?mr=', | |||
prefix = '// | |||
COinS = 'pre', -- use prefix value | COinS = 'pre', -- use prefix value | ||
encode = true, | encode = true, | ||
Line 1,510: | Line 2,307: | ||
q = 'Q190593', | q = 'Q190593', | ||
label = 'OCLC', | label = 'OCLC', | ||
prefix = 'https://search.worldcat.org/oclc/', | |||
prefix = '// | |||
COinS = 'info:oclcnum', | COinS = 'info:oclcnum', | ||
encode = true, | encode = true, | ||
separator = ' ', | separator = ' ', | ||
id_limit = id_limits_data_t.OCLC or 0, | |||
}, | }, | ||
['OL'] = { | ['OL'] = { | ||
Line 1,522: | Line 2,319: | ||
q = 'Q1201876', | q = 'Q1201876', | ||
label = 'OL', | label = 'OL', | ||
prefix = 'https://openlibrary.org/', | |||
prefix = '//openlibrary.org/', | COinS = 'url', | ||
COinS = | |||
separator = ' ', | separator = ' ', | ||
encode = true, | encode = true, | ||
Line 1,535: | Line 2,331: | ||
q = 'Q2015776', | q = 'Q2015776', | ||
label = 'OSTI', | label = 'OSTI', | ||
prefix = 'https://www.osti.gov/biblio/', | |||
prefix = '//www.osti.gov/biblio/', | |||
COinS = 'pre', -- use prefix value | COinS = 'pre', -- use prefix value | ||
encode = true, | encode = true, | ||
separator = ' ', | separator = ' ', | ||
id_limit = id_limits_data_t.OSTI or 0, | |||
custom_access = 'osti-access', | custom_access = 'osti-access', | ||
}, | }, | ||
Line 1,548: | Line 2,344: | ||
q = 'Q229883', | q = 'Q229883', | ||
label = 'PMC', | label = 'PMC', | ||
prefix = 'https://www.ncbi.nlm.nih.gov/pmc/articles/PMC', | |||
prefix = '//www.ncbi.nlm.nih.gov/pmc/articles/PMC', | suffix = '', | ||
suffix = | |||
COinS = 'pre', -- use prefix value | COinS = 'pre', -- use prefix value | ||
encode = true, | encode = true, | ||
separator = ' ', | separator = ' ', | ||
id_limit = | id_limit = id_limits_data_t.PMC or 0, | ||
access = 'free', -- free to read | access = 'free', -- free to read | ||
}, | }, | ||
Line 1,561: | Line 2,356: | ||
link = 'PubMed Identifier', | link = 'PubMed Identifier', | ||
redirect = 'PMID (identifier)', | redirect = 'PMID (identifier)', | ||
q = '', | q = 'Q2082879', | ||
label = 'PMID', | label = 'PMID', | ||
prefix = 'https://pubmed.ncbi.nlm.nih.gov/', | |||
prefix = '//pubmed.ncbi.nlm.nih.gov/', | |||
COinS = 'info:pmid', | COinS = 'info:pmid', | ||
encode = false, | encode = false, | ||
separator = ' ', | separator = ' ', | ||
id_limit = | id_limit = id_limits_data_t.PMID or 0, | ||
}, | }, | ||
['RFC'] = { | ['RFC'] = { | ||
Line 1,576: | Line 2,370: | ||
q = 'Q212971', | q = 'Q212971', | ||
label = 'RFC', | label = 'RFC', | ||
prefix = 'https://tools.ietf.org/html/rfc', | |||
prefix = '//tools.ietf.org/html/rfc', | |||
COinS = 'pre', -- use prefix value | COinS = 'pre', -- use prefix value | ||
encode = false, | encode = false, | ||
separator = ' ', | separator = ' ', | ||
id_limit = id_limits_data_t.RFC or 0, | |||
access = 'free', -- free to read | access = 'free', -- free to read | ||
}, | }, | ||
Line 1,588: | Line 2,382: | ||
redirect = 'SBN (identifier)', | redirect = 'SBN (identifier)', | ||
label = 'SBN', | label = 'SBN', | ||
prefix = 'Special:BookSources/0-', -- prefix has leading zero necessary to make 9-digit sbn a 10-digit isbn | prefix = 'Special:BookSources/0-', -- prefix has leading zero necessary to make 9-digit sbn a 10-digit isbn | ||
COinS = nil, -- nil because we can't use pre or rft or info: | COinS = nil, -- nil because we can't use pre or rft or info: | ||
Line 1,599: | Line 2,392: | ||
q = 'Q7550801', | q = 'Q7550801', | ||
label = 'SSRN', | label = 'SSRN', | ||
prefix = 'https://papers.ssrn.com/sol3/papers.cfm?abstract_id=', | |||
prefix = '//ssrn.com/ | |||
COinS = 'pre', -- use prefix value | COinS = 'pre', -- use prefix value | ||
encode = true, | encode = true, | ||
separator = ' ', | separator = ' ', | ||
id_limit = | id_limit = id_limits_data_t.SSRN or 0, | ||
custom_access = 'ssrn-access', | |||
}, | }, | ||
['S2CID'] = { | ['S2CID'] = { | ||
Line 1,613: | Line 2,405: | ||
q = 'Q22908627', | q = 'Q22908627', | ||
label = 'S2CID', | label = 'S2CID', | ||
prefix = 'https://api.semanticscholar.org/CorpusID:', | prefix = 'https://api.semanticscholar.org/CorpusID:', | ||
COinS = 'pre', -- use prefix value | COinS = 'pre', -- use prefix value | ||
encode = false, | encode = false, | ||
separator = ' ', | separator = ' ', | ||
id_limit = | id_limit = id_limits_data_t.S2CID or 0, | ||
custom_access = 's2cid-access', | custom_access = 's2cid-access', | ||
}, | }, | ||
Line 1,627: | Line 2,418: | ||
q = 'Q193162', | q = 'Q193162', | ||
label = 'Usenet:', | label = 'Usenet:', | ||
prefix = 'news:', | prefix = 'news:', | ||
encode = false, | encode = false, | ||
Line 1,639: | Line 2,429: | ||
q = 'Q190269', | q = 'Q190269', | ||
label = 'Zbl', | label = 'Zbl', | ||
prefix = 'https://zbmath.org/?format=complete&q=an:', | |||
prefix = '//zbmath.org/?format=complete&q=an:', | |||
COinS = 'pre', -- use prefix value | COinS = 'pre', -- use prefix value | ||
encode = true, | encode = true, | ||
Line 1,648: | Line 2,437: | ||
--[[--------------------------< E X P O R T S > | --[[--------------------------< E X P O R T S >--------------------------------- | ||
]] | ]] | ||
return { | return { | ||
use_identifier_redirects = | use_identifier_redirects = use_identifier_redirects, -- booleans defined in the settings at the top of this module | ||
local_lang_cat_enable = local_lang_cat_enable, | |||
date_name_auto_xlate_enable = date_name_auto_xlate_enable, | |||
date_digit_auto_xlate_enable = date_digit_auto_xlate_enable, | |||
enable_sort_keys = enable_sort_keys, | |||
-- tables and variables created when this module is loaded | |||
global_df = get_date_format (), -- this line can be replaced with "global_df = 'dmy-all'," to have all dates auto translated to dmy format. | |||
global_cs1_config_t = global_cs1_config_t, -- global settings from {{cs1 config}} | |||
punct_skip = build_skip_table (punct_skip, punct_meta_params), | |||
url_skip = build_skip_table (url_skip, url_meta_params), | |||
known_free_doi_registrants_t = build_free_doi_registrants_table(), | |||
name_space_sort_keys = name_space_sort_keys, | |||
aliases = aliases, | aliases = aliases, | ||
special_case_translation = special_case_translation, | special_case_translation = special_case_translation, | ||
Line 1,661: | Line 2,462: | ||
editor_markup_patterns = editor_markup_patterns, | editor_markup_patterns = editor_markup_patterns, | ||
et_al_patterns = et_al_patterns, | et_al_patterns = et_al_patterns, | ||
extended_registrants_t = extended_registrants_t, | |||
id_handlers = id_handlers, | id_handlers = id_handlers, | ||
keywords_lists = keywords_lists, | keywords_lists = keywords_lists, | ||
keywords_xlate = keywords_xlate, | keywords_xlate = keywords_xlate, | ||
stripmarkers=stripmarkers, | stripmarkers = stripmarkers, | ||
invisible_chars = invisible_chars, | invisible_chars = invisible_chars, | ||
invisible_defs = invisible_defs, | |||
indic_script = indic_script, | indic_script = indic_script, | ||
emoji_t = emoji_t, | |||
maint_cats = maint_cats, | maint_cats = maint_cats, | ||
messages = messages, | messages = messages, | ||
presentation = presentation, | presentation = presentation, | ||
prop_cats = prop_cats, | prop_cats = prop_cats, | ||
script_lang_codes = script_lang_codes, | script_lang_codes = script_lang_codes, | ||
lang_tag_remap = lang_tag_remap, | |||
lang_name_remap = lang_name_remap, | lang_name_remap = lang_name_remap, | ||
this_wiki_code = this_wiki_code, | this_wiki_code = this_wiki_code, | ||
title_types = title_types, | title_types = title_types, | ||
uncategorized_namespaces = | uncategorized_namespaces = uncategorized_namespaces_t, | ||
uncategorized_subpages = uncategorized_subpages, | uncategorized_subpages = uncategorized_subpages, | ||
templates_using_volume = templates_using_volume, | templates_using_volume = templates_using_volume, | ||
templates_using_issue = templates_using_issue, | templates_using_issue = templates_using_issue, | ||
templates_not_using_page = templates_not_using_page, | templates_not_using_page = templates_not_using_page, | ||
vol_iss_pg_patterns = vol_iss_pg_patterns, | |||
single_letter_2nd_lvl_domains_t = single_letter_2nd_lvl_domains_t, | |||
inter_wiki_map = inter_wiki_map, | |||
mw_languages_by_tag_t = mw_languages_by_tag_t, | |||
mw_languages_by_name_t = mw_languages_by_name_t, | |||
citation_class_map_t = citation_class_map_t, | |||
citation_issue_t = citation_issue_t, | |||
citation_no_volume_t = citation_no_volume_t, | |||
} | } |