<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://www.nordiclarp.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Nordiclarpwikiadmin</id>
	<title>Nordic Larp Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://www.nordiclarp.org/wiki/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Nordiclarpwikiadmin"/>
	<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/Special:Contributions/Nordiclarpwikiadmin"/>
	<updated>2026-04-27T10:01:41Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Main_Page&amp;diff=6679</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Main_Page&amp;diff=6679"/>
		<updated>2025-11-01T23:05:19Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Nordic Larp Wiki collects information about Nordic-style larp games and their design tools. The tools presented have been play-tested in games or presented in published articles.&lt;br /&gt;
&lt;br /&gt;
[[Image:Next_Stop_Kymlinge.jpg|thumb|[[Next Stop: Kymlinge]] being played at [[Grenselandet]] 2013.|none]]&lt;br /&gt;
&lt;br /&gt;
=What is Nordic Larp?=__NOEDITSECTION__&lt;br /&gt;
Nordic-style larp, or Nordic Larp, is a term used to describe a tradition of larp game design that emerged in the Nordic countries. Some aims and ideals typical for this unique gaming scene include immersion, collaboration and artistic vision.&lt;br /&gt;
&lt;br /&gt;
You can read more on the [[Nordic Larp]] page.&lt;br /&gt;
&lt;br /&gt;
= Starting Places=__NOEDITSECTION__&lt;br /&gt;
Here are some suggested starting places for browsing this wiki:&lt;br /&gt;
&lt;br /&gt;
*[[:Category:Larps|Larps]] - Nordic-style larps or larps using design tools covered by this wiki.&lt;br /&gt;
*[[:Category:Meeting places|Meeting places]] - Other places where people meet to discuss and develop Nordic larp game design.&lt;br /&gt;
*[[:Category:Techniques|Techniques]] - Techniques and tools used before, during or after larp games.&lt;br /&gt;
*[[:Category:Documentation|Documentation]] - Books, films and other publications about Nordic-style larp.&lt;br /&gt;
*[[:Category:Concepts|Concepts]] - Concepts used to talk about Nordic-style larp.&lt;br /&gt;
*[[:Category:Projects|Projects]] - Other projects not covered by the above categories.&lt;br /&gt;
*[[:Category:Organizations|Organizations]] - Non-profits, groups, companies, larpwright collectives, NGO&#039;s and others.&lt;br /&gt;
*[[:Category:People|People]] - Persons of interest in the Nordic Larp conversation.&lt;br /&gt;
*[[Event Calendars]] - Upcoming Larps and events maintained by third parties.&lt;br /&gt;
*[[:Category:Contents|All content]]&lt;br /&gt;
&lt;br /&gt;
=Contribute=&lt;br /&gt;
If you wish to contribute content to the Wiki, please check out the [[Nordic_Larp_Wiki:Community_portal|community portal]] for help and guidelines.&lt;br /&gt;
&lt;br /&gt;
To edit pages you need to [[Special:CreateAccount|create an account]], [[Special:AccountSecurity|enable two-factor authentication]], [[Special:UserLogout|log out]] and [[Special:UserLogin|log back in]] with said two-factor authentication.&lt;br /&gt;
&lt;br /&gt;
__NOTOC__&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Module:Citation&amp;diff=6678</id>
		<title>Module:Citation</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Module:Citation&amp;diff=6678"/>
		<updated>2025-11-01T21:43:41Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;return require [[Module:Cite]]&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Module:Citation/CS1/Whitelist&amp;diff=6675</id>
		<title>Module:Citation/CS1/Whitelist</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Module:Citation/CS1/Whitelist&amp;diff=6675"/>
		<updated>2025-11-01T21:43:17Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[--------------------------&amp;lt; S U P P O R T E D   P A R A M E T E R S &amp;gt;--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Because a steady-state signal conveys no useful information, whitelist.basic_arguments[] list items can have three values:&lt;br /&gt;
	true - these parameters are valid and supported parameters&lt;br /&gt;
	false - these parameters are deprecated but still supported&lt;br /&gt;
	tracked - these parameters are valid and supported parameters tracked in an eponymous properties category&lt;br /&gt;
	nil - these parameters are no longer supported. remove entirely&lt;br /&gt;
	&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local basic_arguments_t = {&lt;br /&gt;
	[&#039;accessdate&#039;] = true,&lt;br /&gt;
	[&#039;access-date&#039;] = true,&lt;br /&gt;
	[&#039;agency&#039;] = true,&lt;br /&gt;
	[&#039;archivedate&#039;] = true,&lt;br /&gt;
	[&#039;archive-date&#039;] = true,&lt;br /&gt;
	[&#039;archive-format&#039;] = true,&lt;br /&gt;
	[&#039;archiveurl&#039;] = true,&lt;br /&gt;
	[&#039;archive-url&#039;] = true,&lt;br /&gt;
	[&#039;article&#039;] = true,&lt;br /&gt;
	[&#039;article-format&#039;] = true,&lt;br /&gt;
	[&#039;article-number&#039;] = true,													-- {{cite journal}}, {{cite conference}}; {{citation}} when |journal= has a value&lt;br /&gt;
	[&#039;article-url&#039;] = true,&lt;br /&gt;
	[&#039;article-url-access&#039;] = true,&lt;br /&gt;
	[&#039;arxiv&#039;] = true,															-- cite arxiv; here because allowed in cite ... as identifier&lt;br /&gt;
	[&#039;asin&#039;] = true,&lt;br /&gt;
	[&#039;ASIN&#039;] = true,&lt;br /&gt;
	[&#039;asin-tld&#039;] = true,&lt;br /&gt;
	[&#039;at&#039;] = true,&lt;br /&gt;
	[&#039;author&#039;] = true,&lt;br /&gt;
	[&#039;author-first&#039;] = true,&lt;br /&gt;
	[&#039;author-given&#039;] = true,&lt;br /&gt;
	[&#039;author-last&#039;] = true,&lt;br /&gt;
	[&#039;author-surname&#039;] = true,&lt;br /&gt;
	[&#039;authorlink&#039;] = true,&lt;br /&gt;
	[&#039;author-link&#039;] = true,&lt;br /&gt;
	[&#039;author-mask&#039;] = true,&lt;br /&gt;
	[&#039;bibcode&#039;] = true,&lt;br /&gt;
	[&#039;bibcode-access&#039;] = true,&lt;br /&gt;
	[&#039;biorxiv&#039;] = true,															-- cite biorxiv; here because allowed in cite ... as identifier&lt;br /&gt;
	[&#039;chapter&#039;] = true,&lt;br /&gt;
	[&#039;chapter-format&#039;] = true,&lt;br /&gt;
	[&#039;chapter-url&#039;] = true,&lt;br /&gt;
	[&#039;chapter-url-access&#039;] = true,&lt;br /&gt;
	[&#039;citeseerx&#039;] = true,														-- cite citeseerx; here because allowed in cite ... as identifier&lt;br /&gt;
	[&#039;collaboration&#039;] = true,&lt;br /&gt;
	[&#039;contribution&#039;] = true,&lt;br /&gt;
	[&#039;contribution-format&#039;] = true,&lt;br /&gt;
	[&#039;contribution-url&#039;] = true,&lt;br /&gt;
	[&#039;contribution-url-access&#039;] = true,&lt;br /&gt;
	[&#039;contributor&#039;] = true,&lt;br /&gt;
	[&#039;contributor-first&#039;] = true,&lt;br /&gt;
	[&#039;contributor-given&#039;] = true,&lt;br /&gt;
	[&#039;contributor-last&#039;] = true,&lt;br /&gt;
	[&#039;contributor-surname&#039;] = true,&lt;br /&gt;
	[&#039;contributor-link&#039;] = true,&lt;br /&gt;
	[&#039;contributor-mask&#039;] = true,&lt;br /&gt;
	[&#039;date&#039;] = true,&lt;br /&gt;
	[&#039;department&#039;] = true,&lt;br /&gt;
	[&#039;df&#039;] = true,&lt;br /&gt;
	[&#039;dictionary&#039;] = true,&lt;br /&gt;
	[&#039;display-authors&#039;] = true,&lt;br /&gt;
	[&#039;display-contributors&#039;] = true,&lt;br /&gt;
	[&#039;display-editors&#039;] = true,&lt;br /&gt;
	[&#039;display-interviewers&#039;] = true,&lt;br /&gt;
	[&#039;display-subjects&#039;] = true,&lt;br /&gt;
	[&#039;display-translators&#039;] = true,&lt;br /&gt;
	[&#039;doi&#039;] = true,&lt;br /&gt;
	[&#039;DOI&#039;] = true,&lt;br /&gt;
	[&#039;doi-access&#039;] = true,&lt;br /&gt;
	[&#039;doi-broken-date&#039;] = true,&lt;br /&gt;
	[&#039;edition&#039;] = true,&lt;br /&gt;
	[&#039;editor&#039;] = true,&lt;br /&gt;
	[&#039;editor-first&#039;] = true,&lt;br /&gt;
	[&#039;editor-given&#039;] = true,&lt;br /&gt;
	[&#039;editor-last&#039;] = true,&lt;br /&gt;
	[&#039;editor-surname&#039;] = true,&lt;br /&gt;
	[&#039;editor-link&#039;] = true,&lt;br /&gt;
	[&#039;editor-mask&#039;] = true,&lt;br /&gt;
	[&#039;eissn&#039;] = true,&lt;br /&gt;
	[&#039;EISSN&#039;] = true,&lt;br /&gt;
	[&#039;encyclopaedia&#039;] = true,&lt;br /&gt;
	[&#039;encyclopedia&#039;] = true,&lt;br /&gt;
	[&#039;entry&#039;] = true,&lt;br /&gt;
	[&#039;entry-format&#039;] = true,&lt;br /&gt;
	[&#039;entry-url&#039;] = true,&lt;br /&gt;
	[&#039;entry-url-access&#039;] = true,&lt;br /&gt;
	[&#039;eprint&#039;] = true,															-- cite arxiv; here because allowed in cite ... as identifier&lt;br /&gt;
	[&#039;first&#039;] = true,&lt;br /&gt;
	[&#039;format&#039;] = true,&lt;br /&gt;
	[&#039;given&#039;] = true,&lt;br /&gt;
	[&#039;hdl&#039;] = true,&lt;br /&gt;
	[&#039;HDL&#039;] = true,&lt;br /&gt;
	[&#039;hdl-access&#039;] = true,&lt;br /&gt;
	[&#039;host&#039;] = true,															-- unique to certain templates?&lt;br /&gt;
	[&#039;id&#039;] = true,&lt;br /&gt;
	[&#039;ID&#039;] = true,&lt;br /&gt;
	[&#039;institution&#039;] = true,														-- constrain to cite thesis?&lt;br /&gt;
	[&#039;interviewer&#039;] = true,&lt;br /&gt;
	[&#039;interviewer-first&#039;] = true,&lt;br /&gt;
	[&#039;interviewer-given&#039;] = true,&lt;br /&gt;
	[&#039;interviewer-last&#039;] = true,&lt;br /&gt;
	[&#039;interviewer-surname&#039;] = true,&lt;br /&gt;
	[&#039;interviewer-link&#039;] = true,&lt;br /&gt;
	[&#039;interviewer-mask&#039;] = true,&lt;br /&gt;
	[&#039;isbn&#039;] = true,&lt;br /&gt;
	[&#039;ISBN&#039;] = true,&lt;br /&gt;
	[&#039;ismn&#039;] = true,&lt;br /&gt;
	[&#039;ISMN&#039;] = true,&lt;br /&gt;
	[&#039;issn&#039;] = true,&lt;br /&gt;
	[&#039;ISSN&#039;] = true,&lt;br /&gt;
	[&#039;issue&#039;] = true,&lt;br /&gt;
	[&#039;jfm&#039;] = true,&lt;br /&gt;
	[&#039;JFM&#039;] = true,&lt;br /&gt;
	[&#039;journal&#039;] = true,&lt;br /&gt;
	[&#039;jstor&#039;] = true,&lt;br /&gt;
	[&#039;JSTOR&#039;] = true,&lt;br /&gt;
	[&#039;jstor-access&#039;] = true,&lt;br /&gt;
	[&#039;lang&#039;] = true,&lt;br /&gt;
	[&#039;language&#039;] = true,&lt;br /&gt;
	[&#039;last&#039;] = true,&lt;br /&gt;
	[&#039;lccn&#039;] = true,&lt;br /&gt;
	[&#039;LCCN&#039;] = true,&lt;br /&gt;
	[&#039;location&#039;] = true,&lt;br /&gt;
	[&#039;magazine&#039;] = true,&lt;br /&gt;
	[&#039;medium&#039;] = true,&lt;br /&gt;
	[&#039;medrxiv&#039;] = true,															-- cite medrxiv; here because allowed in cite ... as identifier&lt;br /&gt;
	[&#039;minutes&#039;] = true,															-- constrain to cite AV media and podcast?&lt;br /&gt;
	[&#039;mode&#039;] = true,&lt;br /&gt;
	[&#039;mr&#039;] = true,&lt;br /&gt;
	[&#039;MR&#039;] = true,&lt;br /&gt;
	[&#039;name-list-style&#039;] = true,&lt;br /&gt;
	[&#039;newspaper&#039;] = true,&lt;br /&gt;
	[&#039;no-pp&#039;] = true,&lt;br /&gt;
	[&#039;no-tracking&#039;] = true,&lt;br /&gt;
	[&#039;number&#039;] = true,&lt;br /&gt;
	[&#039;oclc&#039;] = true,&lt;br /&gt;
	[&#039;OCLC&#039;] = true,&lt;br /&gt;
	[&#039;ol&#039;] = true,&lt;br /&gt;
	[&#039;OL&#039;] = true,&lt;br /&gt;
	[&#039;ol-access&#039;] = true,&lt;br /&gt;
	[&#039;orig-date&#039;] = true,&lt;br /&gt;
	[&#039;origyear&#039;] = true,&lt;br /&gt;
	[&#039;orig-year&#039;] = true,&lt;br /&gt;
	[&#039;osti&#039;] = true,&lt;br /&gt;
	[&#039;OSTI&#039;] = true,&lt;br /&gt;
	[&#039;osti-access&#039;] = true,&lt;br /&gt;
	[&#039;others&#039;] = true,&lt;br /&gt;
	[&#039;p&#039;] = true,&lt;br /&gt;
	[&#039;page&#039;] = true,&lt;br /&gt;
	[&#039;pages&#039;] = true,&lt;br /&gt;
	[&#039;periodical&#039;] = true,&lt;br /&gt;
	[&#039;place&#039;] = true,&lt;br /&gt;
	[&#039;pmc&#039;] = true,&lt;br /&gt;
	[&#039;PMC&#039;] = true,&lt;br /&gt;
	[&#039;pmc-embargo-date&#039;] = true,&lt;br /&gt;
	[&#039;pmid&#039;] = true,&lt;br /&gt;
	[&#039;PMID&#039;] = true,&lt;br /&gt;
	[&#039;postscript&#039;] = true,&lt;br /&gt;
	[&#039;pp&#039;] = true,&lt;br /&gt;
	[&#039;publication-date&#039;] = true,&lt;br /&gt;
	[&#039;publication-place&#039;] = true,&lt;br /&gt;
	[&#039;publisher&#039;] = true,&lt;br /&gt;
	[&#039;quotation&#039;] = true,&lt;br /&gt;
	[&#039;quote&#039;] = true,&lt;br /&gt;
	[&#039;quote-page&#039;] = true,&lt;br /&gt;
	[&#039;quote-pages&#039;] = true,&lt;br /&gt;
	[&#039;ref&#039;] = true,&lt;br /&gt;
	[&#039;rfc&#039;] = true,&lt;br /&gt;
	[&#039;RFC&#039;] = true,&lt;br /&gt;
	[&#039;sbn&#039;] = true,&lt;br /&gt;
	[&#039;SBN&#039;] = true,&lt;br /&gt;
	[&#039;scale&#039;] = true,&lt;br /&gt;
	[&#039;script-article&#039;] = true,&lt;br /&gt;
	[&#039;script-chapter&#039;] = true,&lt;br /&gt;
	[&#039;script-contribution&#039;] = true,&lt;br /&gt;
	[&#039;script-encyclopaedia&#039;] = true,&lt;br /&gt;
	[&#039;script-encyclopedia&#039;] = true,&lt;br /&gt;
	[&#039;script-entry&#039;] = true,&lt;br /&gt;
	[&#039;script-journal&#039;] = true,&lt;br /&gt;
	[&#039;script-magazine&#039;] = true,&lt;br /&gt;
	[&#039;script-newspaper&#039;] = true,&lt;br /&gt;
	[&#039;script-periodical&#039;] = true,&lt;br /&gt;
	[&#039;script-quote&#039;] = true,&lt;br /&gt;
	[&#039;script-section&#039;] = true,&lt;br /&gt;
	[&#039;script-title&#039;] = true,&lt;br /&gt;
	[&#039;script-website&#039;] = true,&lt;br /&gt;
	[&#039;script-work&#039;] = true,&lt;br /&gt;
	[&#039;section&#039;] = true,&lt;br /&gt;
	[&#039;section-format&#039;] = true,&lt;br /&gt;
	[&#039;section-url&#039;] = true,&lt;br /&gt;
	[&#039;section-url-access&#039;] = true,&lt;br /&gt;
	[&#039;series&#039;] = true,&lt;br /&gt;
	[&#039;ssrn&#039;] = true,															-- cite ssrn; these three here because allowed in cite ... as identifier&lt;br /&gt;
	[&#039;SSRN&#039;] = true,&lt;br /&gt;
	[&#039;ssrn-access&#039;] = true,&lt;br /&gt;
	[&#039;subject&#039;] = true,&lt;br /&gt;
	[&#039;subject-first&#039;] = true,&lt;br /&gt;
	[&#039;subject-given&#039;] = true,&lt;br /&gt;
	[&#039;subject-last&#039;] = true,&lt;br /&gt;
	[&#039;subject-link&#039;] = true,&lt;br /&gt;
	[&#039;subject-mask&#039;] = true,&lt;br /&gt;
	[&#039;subject-surname&#039;] = true,&lt;br /&gt;
	[&#039;surname&#039;] = true,&lt;br /&gt;
	[&#039;s2cid&#039;] = true,&lt;br /&gt;
	[&#039;S2CID&#039;] = true,&lt;br /&gt;
	[&#039;s2cid-access&#039;] = true,&lt;br /&gt;
	[&#039;template-doc-demo&#039;] = true,&lt;br /&gt;
	[&#039;time&#039;] = true,															-- constrain to cite av media and podcast?&lt;br /&gt;
	[&#039;time-caption&#039;] = true,													-- constrain to cite av media and podcast?&lt;br /&gt;
	[&#039;title&#039;] = true,&lt;br /&gt;
	[&#039;title-link&#039;] = true,&lt;br /&gt;
	[&#039;title-note&#039;] = true,&lt;br /&gt;
	[&#039;translator&#039;] = true,&lt;br /&gt;
	[&#039;translator-first&#039;] = true,&lt;br /&gt;
	[&#039;translator-given&#039;] = true,&lt;br /&gt;
	[&#039;translator-last&#039;] = true,	&lt;br /&gt;
	[&#039;translator-surname&#039;] = true,&lt;br /&gt;
	[&#039;translator-link&#039;] = true,&lt;br /&gt;
	[&#039;translator-mask&#039;] = true,&lt;br /&gt;
	[&#039;trans-article&#039;] = true,&lt;br /&gt;
	[&#039;trans-chapter&#039;] = true,&lt;br /&gt;
	[&#039;trans-contribution&#039;] = true,&lt;br /&gt;
	[&#039;trans-encyclopaedia&#039;] = true,&lt;br /&gt;
	[&#039;trans-encyclopedia&#039;] = true,&lt;br /&gt;
	[&#039;trans-entry&#039;] = true,&lt;br /&gt;
	[&#039;trans-journal&#039;] = true,&lt;br /&gt;
	[&#039;trans-magazine&#039;] = true,&lt;br /&gt;
	[&#039;trans-newspaper&#039;] = true,&lt;br /&gt;
	[&#039;trans-periodical&#039;] = true,&lt;br /&gt;
	[&#039;trans-quote&#039;] = true,&lt;br /&gt;
	[&#039;trans-section&#039;] = true,&lt;br /&gt;
	[&#039;trans-title&#039;] = true,&lt;br /&gt;
	[&#039;trans-website&#039;] = true,&lt;br /&gt;
	[&#039;trans-work&#039;] = true,&lt;br /&gt;
	[&#039;type&#039;] = true,&lt;br /&gt;
	[&#039;url&#039;] = true,&lt;br /&gt;
	[&#039;URL&#039;] = true,&lt;br /&gt;
	[&#039;url-access&#039;] = true,&lt;br /&gt;
	[&#039;url-status&#039;] = true,&lt;br /&gt;
	[&#039;vauthors&#039;] = true,&lt;br /&gt;
	[&#039;veditors&#039;] = true,&lt;br /&gt;
	[&#039;version&#039;] = true,&lt;br /&gt;
	[&#039;via&#039;] = true,&lt;br /&gt;
	[&#039;volume&#039;] = true,&lt;br /&gt;
	[&#039;website&#039;] = true,&lt;br /&gt;
	[&#039;work&#039;] = true,&lt;br /&gt;
	[&#039;year&#039;] = true,&lt;br /&gt;
	[&#039;zbl&#039;] = true,&lt;br /&gt;
	[&#039;ZBL&#039;] = true,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
local numbered_arguments_t = {&lt;br /&gt;
	[&#039;author#&#039;] = true,&lt;br /&gt;
	[&#039;author-first#&#039;] = true,&lt;br /&gt;
	[&#039;author#-first&#039;] = true,&lt;br /&gt;
	[&#039;author-given#&#039;] = true,&lt;br /&gt;
	[&#039;author#-given&#039;] = true,&lt;br /&gt;
	[&#039;author-last#&#039;] = true,&lt;br /&gt;
	[&#039;author#-last&#039;] = true,&lt;br /&gt;
	[&#039;author-surname#&#039;] = true,&lt;br /&gt;
	[&#039;author#-surname&#039;] = true,&lt;br /&gt;
	[&#039;author-link#&#039;] = true,&lt;br /&gt;
	[&#039;author#-link&#039;] = true,&lt;br /&gt;
	[&#039;authorlink#&#039;] = true,&lt;br /&gt;
	[&#039;author#link&#039;] = true,&lt;br /&gt;
	[&#039;author-mask#&#039;] = true,&lt;br /&gt;
	[&#039;author#-mask&#039;] = true,&lt;br /&gt;
	[&#039;contributor#&#039;] = true,&lt;br /&gt;
	[&#039;contributor-first#&#039;] = true,&lt;br /&gt;
	[&#039;contributor#-first&#039;] = true,&lt;br /&gt;
	[&#039;contributor-given#&#039;] = true,&lt;br /&gt;
	[&#039;contributor#-given&#039;] = true,&lt;br /&gt;
	[&#039;contributor-last#&#039;] = true,&lt;br /&gt;
	[&#039;contributor#-last&#039;] = true,&lt;br /&gt;
	[&#039;contributor-surname#&#039;] = true,&lt;br /&gt;
	[&#039;contributor#-surname&#039;] = true,&lt;br /&gt;
	[&#039;contributor-link#&#039;] = true,&lt;br /&gt;
	[&#039;contributor#-link&#039;] = true,&lt;br /&gt;
	[&#039;contributor-mask#&#039;] = true,&lt;br /&gt;
	[&#039;contributor#-mask&#039;] = true,&lt;br /&gt;
	[&#039;editor#&#039;] = true,&lt;br /&gt;
	[&#039;editor-first#&#039;] = true,&lt;br /&gt;
	[&#039;editor#-first&#039;] = true,&lt;br /&gt;
	[&#039;editor-given#&#039;] = true,&lt;br /&gt;
	[&#039;editor#-given&#039;] = true,&lt;br /&gt;
	[&#039;editor-last#&#039;] = true,&lt;br /&gt;
	[&#039;editor#-last&#039;] = true,&lt;br /&gt;
	[&#039;editor-surname#&#039;] = true,&lt;br /&gt;
	[&#039;editor#-surname&#039;] = true,&lt;br /&gt;
	[&#039;editor-link#&#039;] = true,&lt;br /&gt;
	[&#039;editor#-link&#039;] = true,&lt;br /&gt;
	[&#039;editor-mask#&#039;] = true,&lt;br /&gt;
	[&#039;editor#-mask&#039;] = true,&lt;br /&gt;
	[&#039;first#&#039;] = true,&lt;br /&gt;
	[&#039;given#&#039;] = true,&lt;br /&gt;
	[&#039;host#&#039;] = true,&lt;br /&gt;
	[&#039;interviewer#&#039;] = true,&lt;br /&gt;
	[&#039;interviewer-first#&#039;] = true,&lt;br /&gt;
	[&#039;interviewer#-first&#039;] = true,&lt;br /&gt;
	[&#039;interviewer-given#&#039;] = true,&lt;br /&gt;
	[&#039;interviewer#-given&#039;] = true,&lt;br /&gt;
	[&#039;interviewer-last#&#039;] = true,&lt;br /&gt;
	[&#039;interviewer#-last&#039;] = true,&lt;br /&gt;
	[&#039;interviewer-surname#&#039;] = true,&lt;br /&gt;
	[&#039;interviewer#-surname&#039;] = true,&lt;br /&gt;
	[&#039;interviewer-link#&#039;] = true,&lt;br /&gt;
	[&#039;interviewer#-link&#039;] = true,&lt;br /&gt;
	[&#039;interviewer-mask#&#039;] = true,&lt;br /&gt;
	[&#039;interviewer#-mask&#039;] = true,&lt;br /&gt;
	[&#039;last#&#039;] = true,&lt;br /&gt;
	[&#039;subject#&#039;] = true,&lt;br /&gt;
	[&#039;subject-first#&#039;] = true,&lt;br /&gt;
	[&#039;subject#-first&#039;] = true,&lt;br /&gt;
	[&#039;subject-given#&#039;] = true,&lt;br /&gt;
	[&#039;subject#-given&#039;] = true,&lt;br /&gt;
	[&#039;subject-last#&#039;] = true,&lt;br /&gt;
	[&#039;subject#-last&#039;] = true,&lt;br /&gt;
	[&#039;subject-link#&#039;] = true,&lt;br /&gt;
	[&#039;subject#-link&#039;] = true,&lt;br /&gt;
	[&#039;subject-mask#&#039;] = true,&lt;br /&gt;
	[&#039;subject#-mask&#039;] = true,&lt;br /&gt;
	[&#039;subject-surname#&#039;] = true,&lt;br /&gt;
	[&#039;subject#-surname&#039;] = true,&lt;br /&gt;
	[&#039;surname#&#039;] = true,&lt;br /&gt;
	[&#039;translator#&#039;] = true,&lt;br /&gt;
	[&#039;translator-first#&#039;] = true,&lt;br /&gt;
	[&#039;translator#-first&#039;] = true,&lt;br /&gt;
	[&#039;translator-given#&#039;] = true,&lt;br /&gt;
	[&#039;translator#-given&#039;] = true,&lt;br /&gt;
	[&#039;translator-last#&#039;] = true,&lt;br /&gt;
	[&#039;translator#-last&#039;] = true,&lt;br /&gt;
	[&#039;translator-surname#&#039;] = true,&lt;br /&gt;
	[&#039;translator#-surname&#039;] = true,&lt;br /&gt;
	[&#039;translator-link#&#039;] = true,&lt;br /&gt;
	[&#039;translator#-link&#039;] = true,&lt;br /&gt;
	[&#039;translator-mask#&#039;] = true,&lt;br /&gt;
	[&#039;translator#-mask&#039;] = true,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; P R E P R I N T   S U P P O R T E D   P A R A M E T E R S &amp;gt;--------------------&lt;br /&gt;
&lt;br /&gt;
Cite arXiv, cite biorxiv, cite citeseerx, cite medrxiv, and cite ssrn are preprint templates that use the limited&lt;br /&gt;
set of parameters defined in the limited_basic_arguments and limited_numbered_arguments tables.  Those lists are&lt;br /&gt;
supplemented with a template-specific list of parameters that are required by the particular template and may be&lt;br /&gt;
exclusive to one of the preprint templates.  Some of these parameters may also be available to the general cs1|2&lt;br /&gt;
templates.&lt;br /&gt;
&lt;br /&gt;
Same conventions for true/false/tracked/nil as above.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local preprint_arguments_t = {&lt;br /&gt;
	arxiv = {&lt;br /&gt;
		[&#039;arxiv&#039;] = true,														-- cite arxiv and arxiv identifiers&lt;br /&gt;
		[&#039;class&#039;] = true,&lt;br /&gt;
		[&#039;eprint&#039;] = true,														-- cite arxiv and arxiv identifiers&lt;br /&gt;
		},&lt;br /&gt;
	biorxiv = {&lt;br /&gt;
		[&#039;biorxiv&#039;] = true,&lt;br /&gt;
		},&lt;br /&gt;
	citeseerx = {&lt;br /&gt;
		[&#039;citeseerx&#039;] = true,&lt;br /&gt;
		},&lt;br /&gt;
	medrxiv = {&lt;br /&gt;
		[&#039;medrxiv&#039;] = true,&lt;br /&gt;
		},&lt;br /&gt;
	ssrn = {&lt;br /&gt;
		[&#039;ssrn&#039;] = true,&lt;br /&gt;
		[&#039;SSRN&#039;] = true,&lt;br /&gt;
		[&#039;ssrn-access&#039;] = true,&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; L I M I T E D   S U P P O R T E D   P A R A M E T E R S &amp;gt;----------------------&lt;br /&gt;
&lt;br /&gt;
cite arxiv, cite biorxiv, cite citeseerx, cite medrxiv, and cite ssrn templates are preprint templates so are&lt;br /&gt;
allowed only a limited subset of parameters allowed to all other cs1|2 templates.  The limited subset is defined&lt;br /&gt;
here.&lt;br /&gt;
&lt;br /&gt;
This list of parameters also used by {{cite document}}&lt;br /&gt;
&lt;br /&gt;
Same conventions for true/false/tracked/nil as above.&lt;br /&gt;
	&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local limited_basic_arguments_t = {&lt;br /&gt;
	[&#039;at&#039;] = true,&lt;br /&gt;
	[&#039;author&#039;] = true,&lt;br /&gt;
	[&#039;author-first&#039;] = true,&lt;br /&gt;
	[&#039;author-given&#039;] = true,&lt;br /&gt;
	[&#039;author-last&#039;] = true,&lt;br /&gt;
	[&#039;author-surname&#039;] = true,&lt;br /&gt;
	[&#039;author-link&#039;] = true,&lt;br /&gt;
	[&#039;authorlink&#039;] = true,&lt;br /&gt;
	[&#039;author-mask&#039;] = true,&lt;br /&gt;
	[&#039;collaboration&#039;] = true,&lt;br /&gt;
	[&#039;date&#039;] = true,&lt;br /&gt;
	[&#039;df&#039;] = true,&lt;br /&gt;
	[&#039;display-authors&#039;] = true,&lt;br /&gt;
	[&#039;first&#039;] = true,&lt;br /&gt;
	[&#039;given&#039;] = true,&lt;br /&gt;
	[&#039;language&#039;] = true,&lt;br /&gt;
	[&#039;last&#039;] = true,&lt;br /&gt;
	[&#039;mode&#039;] = true,&lt;br /&gt;
	[&#039;name-list-style&#039;] = true,&lt;br /&gt;
	[&#039;no-tracking&#039;] = true,&lt;br /&gt;
	[&#039;p&#039;] = true,&lt;br /&gt;
	[&#039;page&#039;] = true,&lt;br /&gt;
	[&#039;pages&#039;] = true,&lt;br /&gt;
	[&#039;postscript&#039;] = true,&lt;br /&gt;
	[&#039;pp&#039;] = true,&lt;br /&gt;
	[&#039;quotation&#039;] = true,&lt;br /&gt;
	[&#039;quote&#039;] = true,&lt;br /&gt;
	[&#039;ref&#039;] = true,&lt;br /&gt;
	[&#039;surname&#039;] = true,&lt;br /&gt;
	[&#039;template-doc-demo&#039;] = true,&lt;br /&gt;
	[&#039;title&#039;] = true,&lt;br /&gt;
	[&#039;trans-title&#039;] = true,&lt;br /&gt;
	[&#039;vauthors&#039;] = true,&lt;br /&gt;
	[&#039;year&#039;] = true,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
local limited_numbered_arguments_t = {&lt;br /&gt;
	[&#039;author#&#039;] = true,&lt;br /&gt;
	[&#039;author-first#&#039;] = true,&lt;br /&gt;
	[&#039;author#-first&#039;] = true,&lt;br /&gt;
	[&#039;author-given#&#039;] = true,&lt;br /&gt;
	[&#039;author#-given&#039;] = true,&lt;br /&gt;
	[&#039;author-last#&#039;] = true,&lt;br /&gt;
	[&#039;author#-last&#039;] = true,&lt;br /&gt;
	[&#039;author-surname#&#039;] = true,&lt;br /&gt;
	[&#039;author#-surname&#039;] = true,&lt;br /&gt;
	[&#039;author-link#&#039;] = true,&lt;br /&gt;
	[&#039;author#-link&#039;] = true,&lt;br /&gt;
	[&#039;authorlink#&#039;] = true,&lt;br /&gt;
	[&#039;author#link&#039;] = true,&lt;br /&gt;
	[&#039;author-mask#&#039;] = true,&lt;br /&gt;
	[&#039;author#-mask&#039;] = true,&lt;br /&gt;
	[&#039;first#&#039;] = true,&lt;br /&gt;
	[&#039;given#&#039;] = true,&lt;br /&gt;
	[&#039;last#&#039;] = true,&lt;br /&gt;
	[&#039;surname#&#039;] = true,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; U N I Q U E _ A R G U M E N T S &amp;gt;----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Some templates have unique parameters.  Those templates and their unique parameters are listed here. Keys in this&lt;br /&gt;
table are the template&#039;s CitationClass parameter value&lt;br /&gt;
&lt;br /&gt;
Same conventions for true/false/tracked/nil as above.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local unique_arguments_t = {&lt;br /&gt;
	[&#039;audio-visual&#039;] = {&lt;br /&gt;
		[&#039;people&#039;] = true,&lt;br /&gt;
		[&#039;transcript&#039;] = true,&lt;br /&gt;
		[&#039;transcript-format&#039;] = true,&lt;br /&gt;
		[&#039;transcript-url&#039;] = true,&lt;br /&gt;
		},&lt;br /&gt;
	conference = {&lt;br /&gt;
		[&#039;book-title&#039;] = true,&lt;br /&gt;
		[&#039;conference&#039;] = true,&lt;br /&gt;
		[&#039;conference-format&#039;] = true,&lt;br /&gt;
		[&#039;conference-url&#039;] = true,&lt;br /&gt;
		[&#039;event&#039;] = true,&lt;br /&gt;
		},&lt;br /&gt;
	episode = {&lt;br /&gt;
		[&#039;airdate&#039;] = true,&lt;br /&gt;
		[&#039;air-date&#039;] = true,&lt;br /&gt;
		[&#039;credits&#039;] = true,&lt;br /&gt;
		[&#039;episode-link&#039;] = true,												-- alias of |title-link=&lt;br /&gt;
		[&#039;network&#039;] = true,&lt;br /&gt;
		[&#039;people&#039;] = true,&lt;br /&gt;
		[&#039;season&#039;] = true,&lt;br /&gt;
		[&#039;series-link&#039;] = true,&lt;br /&gt;
		[&#039;series-no&#039;] = true,&lt;br /&gt;
		[&#039;series-number&#039;] = true,&lt;br /&gt;
		[&#039;station&#039;] = true,&lt;br /&gt;
		[&#039;transcript&#039;] = true,&lt;br /&gt;
		[&#039;transcript-format&#039;] = true,&lt;br /&gt;
		[&#039;transcript-url&#039;] = true,&lt;br /&gt;
		},&lt;br /&gt;
	mailinglist = {&lt;br /&gt;
		[&#039;mailing-list&#039;] = true,&lt;br /&gt;
		},&lt;br /&gt;
	map = {&lt;br /&gt;
		[&#039;cartography&#039;] = true,&lt;br /&gt;
		[&#039;inset&#039;] = true,&lt;br /&gt;
		[&#039;map&#039;] = true,&lt;br /&gt;
		[&#039;map-format&#039;] = true,&lt;br /&gt;
		[&#039;map-url&#039;] = true,&lt;br /&gt;
		[&#039;map-url-access&#039;] = true,&lt;br /&gt;
		[&#039;script-map&#039;] = true,&lt;br /&gt;
		[&#039;sections&#039;] = true,&lt;br /&gt;
		[&#039;sheet&#039;] = true,&lt;br /&gt;
		[&#039;sheets&#039;] = true,&lt;br /&gt;
		[&#039;trans-map&#039;] = true,&lt;br /&gt;
		},&lt;br /&gt;
	newsgroup = {&lt;br /&gt;
		[&#039;message-id&#039;] = true,&lt;br /&gt;
		[&#039;newsgroup&#039;] = true,&lt;br /&gt;
		},&lt;br /&gt;
	report = {&lt;br /&gt;
		[&#039;docket&#039;] = true,&lt;br /&gt;
		},&lt;br /&gt;
	serial = {&lt;br /&gt;
		[&#039;airdate&#039;] = true,&lt;br /&gt;
		[&#039;air-date&#039;] = true,&lt;br /&gt;
		[&#039;credits&#039;] = true,&lt;br /&gt;
		[&#039;episode&#039;] = true,														-- cite serial only TODO: make available to cite episode?&lt;br /&gt;
		[&#039;episode-link&#039;] = true,												-- alias of |title-link=&lt;br /&gt;
		[&#039;network&#039;] = true,&lt;br /&gt;
		[&#039;people&#039;] = true,&lt;br /&gt;
		[&#039;series-link&#039;] = true,&lt;br /&gt;
		[&#039;station&#039;] = true,&lt;br /&gt;
		},&lt;br /&gt;
	speech = {&lt;br /&gt;
		[&#039;conference&#039;] = true,&lt;br /&gt;
		[&#039;conference-format&#039;] = true,&lt;br /&gt;
		[&#039;conference-url&#039;] = true,&lt;br /&gt;
		[&#039;event&#039;] = true,&lt;br /&gt;
		},&lt;br /&gt;
	thesis = {&lt;br /&gt;
		[&#039;degree&#039;] = true,&lt;br /&gt;
		[&#039;docket&#039;] = true,&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; C I T E _ D O C U M E N T &amp;gt;----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Special case for cite document.  This template takes the limited basic and limited enumerated parameters plus&lt;br /&gt;
others that are apply only to standalone published sources that cannot be cited any other way; no url, book,&lt;br /&gt;
periodical, etc parameters; limited support for name lists and named identifiers.&lt;br /&gt;
&lt;br /&gt;
when validating parameters in {{cite document}} templates, the basic and &lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local document_arguments_t = {&lt;br /&gt;
	[&#039;bibcode&#039;] = true,&lt;br /&gt;
	[&#039;bibcode-access&#039;] = true,&lt;br /&gt;
	[&#039;doi&#039;] = true,&lt;br /&gt;
	[&#039;DOI&#039;] = true,&lt;br /&gt;
	[&#039;doi-access&#039;] = true,&lt;br /&gt;
	[&#039;doi-broken-date&#039;] = true,&lt;br /&gt;
	[&#039;hdl&#039;] = true,&lt;br /&gt;
	[&#039;HDL&#039;] = true,&lt;br /&gt;
	[&#039;hdl-access&#039;] = true,&lt;br /&gt;
	[&#039;id&#039;] = true,&lt;br /&gt;
	[&#039;ID&#039;] = true,&lt;br /&gt;
	[&#039;jfm&#039;] = true,&lt;br /&gt;
	[&#039;JFM&#039;] = true,&lt;br /&gt;
	[&#039;lang&#039;] = true,&lt;br /&gt;
	[&#039;location&#039;] = true,&lt;br /&gt;
	[&#039;mr&#039;] = true,&lt;br /&gt;
	[&#039;MR&#039;] = true,&lt;br /&gt;
	[&#039;no-pp&#039;] = true,&lt;br /&gt;
	[&#039;orig-date&#039;] = true,&lt;br /&gt;
	[&#039;origyear&#039;] = true,&lt;br /&gt;
	[&#039;orig-year&#039;] = true,&lt;br /&gt;
	[&#039;osti&#039;] = true,&lt;br /&gt;
	[&#039;OSTI&#039;] = true,&lt;br /&gt;
	[&#039;osti-access&#039;] = true,&lt;br /&gt;
	[&#039;place&#039;] = true,&lt;br /&gt;
	[&#039;publisher&#039;] = true,&lt;br /&gt;
	[&#039;quote-page&#039;] = true,&lt;br /&gt;
	[&#039;quote-pages&#039;] = true,&lt;br /&gt;
	[&#039;script-quote&#039;] = true,&lt;br /&gt;
	[&#039;script-title&#039;] = true,&lt;br /&gt;
	[&#039;title-link&#039;] = true,&lt;br /&gt;
	[&#039;translator&#039;] = true,&lt;br /&gt;
	[&#039;translator-first&#039;] = true,&lt;br /&gt;
	[&#039;translator-given&#039;] = true,&lt;br /&gt;
	[&#039;translator-last&#039;] = true,&lt;br /&gt;
	[&#039;translator-surname&#039;] = true,&lt;br /&gt;
	[&#039;translator-link&#039;] = true,&lt;br /&gt;
	[&#039;translator-mask&#039;] = true,&lt;br /&gt;
	[&#039;trans-quote&#039;] = true,&lt;br /&gt;
	[&#039;type&#039;] = true,&lt;br /&gt;
	[&#039;zbl&#039;] = true,&lt;br /&gt;
	[&#039;ZBL&#039;] = true,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
local document_numbered_arguments_t = {&lt;br /&gt;
	[&#039;translator#&#039;] = true,&lt;br /&gt;
	[&#039;translator-first#&#039;] = true,&lt;br /&gt;
	[&#039;translator#-first&#039;] = true,&lt;br /&gt;
	[&#039;translator-given#&#039;] = true,&lt;br /&gt;
	[&#039;translator#-given&#039;] = true,&lt;br /&gt;
	[&#039;translator-last#&#039;] = true,&lt;br /&gt;
	[&#039;translator#-last&#039;] = true,&lt;br /&gt;
	[&#039;translator-surname#&#039;] = true,&lt;br /&gt;
	[&#039;translator#-surname&#039;] = true,&lt;br /&gt;
	[&#039;translator-link#&#039;] = true,&lt;br /&gt;
	[&#039;translator#-link&#039;] = true,&lt;br /&gt;
	[&#039;translator-mask#&#039;] = true,&lt;br /&gt;
	[&#039;translator#-mask&#039;] = true,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; L I S T _ C O M B I N E &amp;gt;------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
makes one table from a list of tables.  &amp;lt;lists_t&amp;gt; is a sequence of tables to be combined&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function list_combine (lists_t)&lt;br /&gt;
	local out_t = {};&lt;br /&gt;
&lt;br /&gt;
	for _, list_t in ipairs (lists_t) do										-- for each list in &amp;lt;lists_t&amp;gt;&lt;br /&gt;
		for k, v in pairs (list_t) do											-- extract each k/v pair&lt;br /&gt;
			out_t[k] = v;														-- add to &amp;lt;out_t&amp;gt;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return out_t;																-- and done&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; T E M P L A T E _ L I S T _ G E T &amp;gt;--------------------------------------------&lt;br /&gt;
&lt;br /&gt;
gets a list of the templates from table t&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function template_list_get (t)&lt;br /&gt;
	local out_t = {};															-- a table for output&lt;br /&gt;
	for k, _ in pairs (t) do													-- spin through the table and collect the keys&lt;br /&gt;
		table.insert (out_t, k)													-- add each key to the output table&lt;br /&gt;
	end&lt;br /&gt;
	return out_t;																-- and done&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E X P O R T E D   T A B L E S &amp;gt;------------------------------------------------&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	preprint_arguments_t = preprint_arguments_t,&lt;br /&gt;
	preprint_template_list_t = template_list_get (preprint_arguments_t),		-- make a template list from preprint_arguments{} table&lt;br /&gt;
	unique_arguments_t = unique_arguments_t,&lt;br /&gt;
	unique_param_template_list_t = template_list_get (unique_arguments_t),		-- make a template list from unique_arguments{} table&lt;br /&gt;
	&lt;br /&gt;
	document_parameters_t = list_combine ({limited_basic_arguments_t, limited_numbered_arguments_t, document_arguments_t, document_numbered_arguments_t});&lt;br /&gt;
	common_parameters_t = list_combine ({basic_arguments_t, numbered_arguments_t});&lt;br /&gt;
	limited_parameters_t = list_combine ({limited_basic_arguments_t, limited_numbered_arguments_t});&lt;br /&gt;
	};&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Module:Citation/CS1/Utilities&amp;diff=6673</id>
		<title>Module:Citation/CS1/Utilities</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Module:Citation/CS1/Utilities&amp;diff=6673"/>
		<updated>2025-11-01T21:43:11Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;local z = {&lt;br /&gt;
	error_cats_t = {};															-- for categorizing citations that contain errors&lt;br /&gt;
	error_ids_t = {};															-- list of error identifiers; used to prevent duplication of certain errors; local to this module&lt;br /&gt;
	error_msgs_t = {};															-- sequence table of error messages&lt;br /&gt;
	maint_cats_t = {};															-- for categorizing citations that aren&#039;t erroneous per se, but could use a little work&lt;br /&gt;
	prop_cats_t = {};															-- for categorizing citations based on certain properties, language of source for instance&lt;br /&gt;
	prop_keys_t = {};															-- for adding classes to the citation&#039;s &amp;lt;cite&amp;gt; tag&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; F O R W A R D   D E C L A R A T I O N S &amp;gt;--------------------------------------&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local cfg;																		-- table of tables imported from selected Module:Citation/CS1/Configuration&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S _ S E T &amp;gt;------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Returns true if argument is set; false otherwise. Argument is &#039;set&#039; when it exists (not nil) or when it is not an empty string.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function is_set (var)&lt;br /&gt;
	return not (var == nil or var == &#039;&#039;);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I N _ A R R A Y &amp;gt;--------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Whether needle is in haystack&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function in_array (needle, haystack)&lt;br /&gt;
	if needle == nil then&lt;br /&gt;
		return false;&lt;br /&gt;
	end&lt;br /&gt;
	for n, v in ipairs (haystack) do&lt;br /&gt;
		if v == needle then&lt;br /&gt;
			return n;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return false;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; H A S _ A C C E P T _ A S _ W R I T T E N &amp;gt;------------------------------------&lt;br /&gt;
&lt;br /&gt;
When &amp;lt;str&amp;gt; is wholly wrapped in accept-as-written markup, return &amp;lt;str&amp;gt; without markup and true; return &amp;lt;str&amp;gt; and false else&lt;br /&gt;
&lt;br /&gt;
with allow_empty = false, &amp;lt;str&amp;gt; must have at least one character inside the markup&lt;br /&gt;
with allow_empty = true, &amp;lt;str&amp;gt; the markup frame can be empty like (()) to distinguish an empty template parameter from the specific condition &amp;quot;has no applicable value&amp;quot; in citation-context.&lt;br /&gt;
&lt;br /&gt;
After further evaluation the two cases might be merged at a later stage, but should be kept separated for now.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function has_accept_as_written (str, allow_empty)&lt;br /&gt;
	if not is_set (str) then&lt;br /&gt;
		return str, false;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local count;&lt;br /&gt;
&lt;br /&gt;
	if true == allow_empty then&lt;br /&gt;
		str, count = str:gsub (&#039;^%(%((.*)%)%)$&#039;, &#039;%1&#039;); 						-- allows (()) to be an empty set&lt;br /&gt;
	else&lt;br /&gt;
		str, count = str:gsub (&#039;^%(%((.+)%)%)$&#039;, &#039;%1&#039;);&lt;br /&gt;
	end&lt;br /&gt;
	return str, 0 ~= count;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; S U B S T I T U T E &amp;gt;----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Populates numbered arguments in a message string using an argument table. &amp;lt;args&amp;gt; may be a single string or a&lt;br /&gt;
sequence table of multiple strings.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function substitute (msg, args)&lt;br /&gt;
	return args and mw.message.newRawMessage (msg, args):plain() or msg;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E R R O R _ C O M M E N T &amp;gt;----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Wraps error messages with CSS markup according to the state of hidden. &amp;lt;content&amp;gt; may be a single string or a&lt;br /&gt;
sequence table of multiple strings.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function error_comment (content, hidden)&lt;br /&gt;
	return substitute (hidden and cfg.presentation[&#039;hidden-error&#039;] or cfg.presentation[&#039;visible-error&#039;], content);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; H Y P H E N _ T O _ D A S H &amp;gt;--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Converts a hyphen, endash, emdash to endash under certain conditions.  The hyphen/en/em must separate&lt;br /&gt;
like items; unlike items are returned unmodified.  These forms are modified:&lt;br /&gt;
	letter - letter (A-B)&lt;br /&gt;
	digit - digit (4-5)&lt;br /&gt;
	digit separator digit - digit separator digit (4.1-4.5 or 4-1-4-5)&lt;br /&gt;
	letterdigit - letterdigit (A1-A5) (an optional separator between letter and&lt;br /&gt;
		digit is supported – a.1-a.5 or a-1-a-5)&lt;br /&gt;
	digitletter - digitletter (5a-5d) (an optional separator between letter and&lt;br /&gt;
		digit is supported – 5.a-5.d or 5-a-5-d)&lt;br /&gt;
&lt;br /&gt;
any other forms are returned unmodified.&lt;br /&gt;
&lt;br /&gt;
str may be a comma- or semicolon-separated list of page ranges with/without single pages&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function hyphen_to_dash (str)&lt;br /&gt;
	if not is_set (str) then&lt;br /&gt;
		return str;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	str = str:gsub (&amp;quot;(%(%(.-%)%))&amp;quot;, function(m) return m:gsub(&amp;quot;,&amp;quot;, &amp;quot;，&amp;quot;):gsub(&amp;quot;;&amp;quot;, &amp;quot;；&amp;quot;) end) -- replace commas and semicolons in accept-as-written markup with similar unicode characters so they&#039;ll be ignored during the split	&lt;br /&gt;
	str = str:gsub (&#039;&amp;amp;[nm]dash;&#039;, {[&#039;&amp;amp;ndash;&#039;] = &#039;–&#039;, [&#039;&amp;amp;mdash;&#039;] = &#039;—&#039;});		-- replace &amp;amp;mdash; and &amp;amp;ndash; entities with their characters; semicolon mucks up the text.split&lt;br /&gt;
	str = str:gsub (&#039;&amp;amp;#45;&#039;, &#039;-&#039;);												-- replace HTML numeric entity with hyphen character&lt;br /&gt;
	str = str:gsub (&#039;&amp;amp;nbsp;&#039;, &#039; &#039;);												-- replace &amp;amp;nbsp; entity with generic keyboard space character&lt;br /&gt;
	&lt;br /&gt;
	local out = {};&lt;br /&gt;
	local list = mw.text.split (str, &#039;%s*[,;]%s*&#039;);								-- split str at comma or semicolon separators if there are any&lt;br /&gt;
&lt;br /&gt;
	local accept;																-- boolean&lt;br /&gt;
&lt;br /&gt;
	for _, item in ipairs (list) do												-- for each item in the list&lt;br /&gt;
		item, accept = has_accept_as_written (item);							-- remove accept-this-as-written markup when it wraps all of item&lt;br /&gt;
		if not accept and mw.ustring.match (item, &#039;^%w*[%.%-]?%w+%s*[—–-]%s*%w*[%.%-]?%w+$&#039;) then	-- if a hyphenated range or has endash or emdash separators&lt;br /&gt;
			if mw.ustring.match (item, &#039;^%a+[%.%-]?%d+%s*[—–-]%s*%a+[%.%-]?%d+$&#039;) or		-- letterdigit hyphen letterdigit (optional separator between letter and digit)&lt;br /&gt;
				mw.ustring.match (item, &#039;^%d+[%.%-]?%a+%s*[—–-]%s*%d+[%.%-]?%a+$&#039;) or		-- digitletter hyphen digitletter (optional separator between digit and letter)&lt;br /&gt;
				mw.ustring.match (item, &#039;^%d+[%.%-]%d+%s*[—–-]%s*%d+[%.%-]%d+$&#039;) then		-- digit separator digit hyphen digit separator digit&lt;br /&gt;
					item = mw.ustring.gsub (item, &#039;(%w*[%.%-]?%w+)%s*[—–-]%s*(%w*[%.%-]?%w+)&#039;, &#039;&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;%1 –&amp;lt;/span&amp;gt; &amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;%2&amp;lt;/span&amp;gt;&#039;);	-- replace hyphen/dash, with spaced endash&lt;br /&gt;
&lt;br /&gt;
			elseif mw.ustring.match (item, &#039;^%d+%s*[—–-]%s*%d+$&#039;) or			-- digit hyphen digit&lt;br /&gt;
				mw.ustring.match (item, &#039;^%a+%s*[—–-]%s*%a+$&#039;) then				-- letter hyphen letter&lt;br /&gt;
					item = mw.ustring.gsub (item, &#039;(%w+)%s*[—–-]%s*(%w+)&#039;, &#039;&amp;lt;span class=&amp;quot;nowrap&amp;quot;&amp;gt;%1–&amp;lt;/span&amp;gt;%2&#039;);	-- replace hyphen/emdash with endash, remove extraneous space characters&lt;br /&gt;
&lt;br /&gt;
			else&lt;br /&gt;
--				item = mw.ustring.gsub (item, &#039;%s*[—–-]%s*&#039;, &#039;–&#039;);				-- disabled; here when &#039;unlike&#039; items so return &amp;lt;item&amp;gt; as is&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		table.insert (out, item);												-- add the (possibly modified) item to the output table&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local temp_str = &#039;&#039;;														-- concatenate the output table into a comma separated string&lt;br /&gt;
	temp_str, accept = has_accept_as_written (table.concat (out, &#039;, &#039;));		-- remove accept-this-as-written markup when it wraps all of concatenated out&lt;br /&gt;
	if accept then&lt;br /&gt;
		temp_str = has_accept_as_written (str);									-- when global markup removed, return original str; do it this way to suppress boolean second return value&lt;br /&gt;
		return temp_str:gsub(&amp;quot;，&amp;quot;, &amp;quot;,&amp;quot;):gsub(&amp;quot;；&amp;quot;, &amp;quot;;&amp;quot;);&lt;br /&gt;
	else&lt;br /&gt;
		return temp_str:gsub(&amp;quot;，&amp;quot;, &amp;quot;,&amp;quot;):gsub(&amp;quot;；&amp;quot;, &amp;quot;;&amp;quot;);						-- else, return assembled temp_str&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[=[-------------------------&amp;lt; M A K E _ W I K I L I N K &amp;gt;----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Makes a wikilink; when both link and display text is provided, returns a wikilink in the form [[L|D]]; if only&lt;br /&gt;
link is provided (or link and display are the same), returns a wikilink in the form [[L]]; if neither are&lt;br /&gt;
provided or link is omitted, returns an empty string.&lt;br /&gt;
&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
local function make_wikilink (link, display)&lt;br /&gt;
	if not is_set (link) then return &#039;&#039; end&lt;br /&gt;
&lt;br /&gt;
	if is_set (display) and link ~= display then			&lt;br /&gt;
		return table.concat ({&#039;[[&#039;, link, &#039;|&#039;, display, &#039;]]&#039;});			&lt;br /&gt;
	else&lt;br /&gt;
		return table.concat ({&#039;[[&#039;, link, &#039;]]&#039;});&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; S E T _ M E S S A G E &amp;gt;----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Sets an error message using the ~/Configuration error_conditions{} table along with arguments supplied in the function&lt;br /&gt;
call, inserts the resulting message in z.error_msgs_t{} sequence table, and returns the error message.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;error_id&amp;gt; – key value for appropriate error handler in ~/Configuration error_conditions{} table &lt;br /&gt;
&amp;lt;arguments&amp;gt; – may be a single string or a sequence table of multiple strings to be subsititued into error_conditions[error_id].message&lt;br /&gt;
&amp;lt;raw&amp;gt; – boolean&lt;br /&gt;
	true –	causes this function to return the error message not wrapped in visible-error, hidden-error span tag;&lt;br /&gt;
			returns error_conditions[error_id].hidden as a second return value&lt;br /&gt;
			does not add message to z.error_msgs_t sequence table&lt;br /&gt;
	false, nil – adds message wrapped in visible-error, hidden-error span tag to z.error_msgs_t&lt;br /&gt;
			returns the error message wrapped in visible-error, hidden-error span tag; there is no second return value&lt;br /&gt;
&amp;lt;prefix&amp;gt; – string to be prepended to &amp;lt;message&amp;gt;									-- TODO: remove support for these unused(?) arguments?&lt;br /&gt;
&amp;lt;suffix&amp;gt; – string to be appended to &amp;lt;message&amp;gt;&lt;br /&gt;
&lt;br /&gt;
TODO: change z.error_cats_t and z.maint_cats_t to have the form cat_name = true?  this to avoid dups without having to have an extra table&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local added_maint_cats = {}														-- list of maintenance categories that have been added to z.maint_cats_t; TODO: figure out how to delete this table&lt;br /&gt;
&lt;br /&gt;
local function set_message (error_id, arguments, raw, prefix, suffix)&lt;br /&gt;
	local error_state = cfg.error_conditions[error_id];&lt;br /&gt;
	&lt;br /&gt;
	prefix = prefix or &#039;&#039;;&lt;br /&gt;
	suffix = suffix or &#039;&#039;;&lt;br /&gt;
	&lt;br /&gt;
	if error_state == nil then&lt;br /&gt;
		error (cfg.messages[&#039;undefined_error&#039;] .. &#039;: &#039; .. error_id);			-- because missing error handler in Module:Citation/CS1/Configuration&lt;br /&gt;
&lt;br /&gt;
	elseif is_set (error_state.category) then&lt;br /&gt;
		if error_state.message then												-- when error_state.message defined, this is an error message&lt;br /&gt;
			table.insert (z.error_cats_t, error_state.category);&lt;br /&gt;
		else&lt;br /&gt;
			if not added_maint_cats[error_id] then&lt;br /&gt;
				added_maint_cats[error_id] = true;								-- note that we&#039;ve added this category&lt;br /&gt;
				table.insert (z.maint_cats_t, substitute (error_state.category, arguments));	-- make cat name then add to table&lt;br /&gt;
			end&lt;br /&gt;
			return;																-- because no message, nothing more to do&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local message = substitute (error_state.message, arguments);&lt;br /&gt;
&lt;br /&gt;
	message = table.concat (&lt;br /&gt;
		{&lt;br /&gt;
		message,&lt;br /&gt;
		&#039; (&#039;,&lt;br /&gt;
		make_wikilink (&lt;br /&gt;
			table.concat (&lt;br /&gt;
				{&lt;br /&gt;
				cfg.messages[&#039;help page link&#039;],&lt;br /&gt;
				&#039;#&#039;,&lt;br /&gt;
				error_state.anchor&lt;br /&gt;
				}),&lt;br /&gt;
			cfg.messages[&#039;help page label&#039;]),&lt;br /&gt;
		&#039;)&#039;&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
	z.error_ids_t[error_id] = true;&lt;br /&gt;
	if z.error_ids_t[&#039;err_citation_missing_title&#039;] and							-- if missing-title error already noted&lt;br /&gt;
		in_array (error_id, {&#039;err_bare_url_missing_title&#039;, &#039;err_trans_missing_title&#039;}) then		-- and this error is one of these&lt;br /&gt;
			return &#039;&#039;, false;													-- don&#039;t bother because one flavor of missing title is sufficient&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	message = table.concat ({prefix, message, suffix});&lt;br /&gt;
&lt;br /&gt;
	if true == raw then&lt;br /&gt;
		return message, error_state.hidden;										-- return message not wrapped in visible-error, hidden-error span tag&lt;br /&gt;
	end		&lt;br /&gt;
&lt;br /&gt;
	message = error_comment (message, error_state.hidden);						-- wrap message in visible-error, hidden-error span tag&lt;br /&gt;
	table.insert (z.error_msgs_t, message);										-- add it to the messages sequence table&lt;br /&gt;
	return message;																-- and done; return value generally not used but is used as a flag in various functions of ~/Identifiers&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[-------------------------&amp;lt; I S _ A L I A S _ U S E D &amp;gt;-----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
This function is used by select_one() to determine if one of a list of alias parameters is in the argument list&lt;br /&gt;
provided by the template.&lt;br /&gt;
&lt;br /&gt;
Input:&lt;br /&gt;
	args – pointer to the arguments table from calling template&lt;br /&gt;
	alias – one of the list of possible aliases in the aliases lists from Module:Citation/CS1/Configuration&lt;br /&gt;
	index – for enumerated parameters, identifies which one&lt;br /&gt;
	enumerated – true/false flag used to choose how enumerated aliases are examined&lt;br /&gt;
	value – value associated with an alias that has previously been selected; nil if not yet selected&lt;br /&gt;
	selected – the alias that has previously been selected; nil if not yet selected&lt;br /&gt;
	error_list – list of aliases that are duplicates of the alias already selected&lt;br /&gt;
&lt;br /&gt;
Returns:&lt;br /&gt;
	value – value associated with alias we selected or that was previously selected or nil if an alias not yet selected&lt;br /&gt;
	selected – the alias we selected or the alias that was previously selected or nil if an alias not yet selected&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function is_alias_used (args, alias, index, enumerated, value, selected, error_list)&lt;br /&gt;
	if enumerated then															-- is this a test for an enumerated parameters?&lt;br /&gt;
		alias = alias:gsub (&#039;#&#039;, index);										-- replace &#039;#&#039; with the value in index&lt;br /&gt;
	else&lt;br /&gt;
		alias = alias:gsub (&#039;#&#039;, &#039;&#039;);											-- remove &#039;#&#039; if it exists&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if is_set (args[alias]) then												-- alias is in the template&#039;s argument list&lt;br /&gt;
		if value ~= nil and selected ~= alias then								-- if we have already selected one of the aliases&lt;br /&gt;
			local skip;&lt;br /&gt;
			for _, v in ipairs (error_list) do									-- spin through the error list to see if we&#039;ve added this alias&lt;br /&gt;
				if v == alias then&lt;br /&gt;
					skip = true;&lt;br /&gt;
					break;														-- has been added so stop looking &lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if not skip then													-- has not been added so&lt;br /&gt;
				table.insert (error_list, alias);								-- add error alias to the error list&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			value = args[alias];												-- not yet selected an alias, so select this one&lt;br /&gt;
			selected = alias;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return value, selected;														-- return newly selected alias, or previously selected alias&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; A D D _ M A I N T _ C A T &amp;gt;------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Adds a category to z.maint_cats_t using names from the configuration file with additional text if any.&lt;br /&gt;
To prevent duplication, the added_maint_cats table lists the categories by key that have been added to z.maint_cats_t.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function add_maint_cat (key, arguments)&lt;br /&gt;
	if not added_maint_cats [key] then&lt;br /&gt;
		added_maint_cats [key] = true;											-- note that we&#039;ve added this category&lt;br /&gt;
		table.insert (z.maint_cats_t, substitute (cfg.maint_cats [key], arguments));	-- make name then add to table&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; A D D _ P R O P _ C A T &amp;gt;--------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Adds a category to z.prop_cats_t using names from the configuration file with additional text if any.&lt;br /&gt;
&lt;br /&gt;
foreign_lang_source and foreign_lang_source_2 keys have a language code appended to them so that multiple languages&lt;br /&gt;
may be categorized but multiples of the same language are not categorized.&lt;br /&gt;
&lt;br /&gt;
added_prop_cats is a table declared in page scope variables above&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local added_prop_cats = {};														-- list of property categories that have been added to z.prop_cats_t&lt;br /&gt;
&lt;br /&gt;
local function add_prop_cat (key, arguments, key_modifier)&lt;br /&gt;
	local key_modified = key .. ((key_modifier and key_modifier) or &#039;&#039;);		-- modify &amp;lt;key&amp;gt; with &amp;lt;key_modifier&amp;gt; if present and not nil&lt;br /&gt;
	&lt;br /&gt;
	if not added_prop_cats [key_modified] then&lt;br /&gt;
		added_prop_cats [key_modified] = true;									-- note that we&#039;ve added this category&lt;br /&gt;
		table.insert (z.prop_cats_t, substitute (cfg.prop_cats [key], arguments));	-- make name then add to table&lt;br /&gt;
		table.insert (z.prop_keys_t, &#039;cs1-prop-&#039; .. key);						-- convert key to class for use in the citation&#039;s &amp;lt;cite&amp;gt; tag&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; S A F E _ F O R _ I T A L I C S &amp;gt;----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Protects a string that will be wrapped in wiki italic markup &#039;&#039; ... &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Note: We cannot use &amp;lt;i&amp;gt; for italics, as the expected behavior for italics specified by &#039;&#039;...&#039;&#039; in the title is that&lt;br /&gt;
they will be inverted (i.e. unitalicized) in the resulting references.  In addition, &amp;lt;i&amp;gt; and &#039;&#039; tend to interact&lt;br /&gt;
poorly under Mediawiki&#039;s HTML tidy.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function safe_for_italics (str)&lt;br /&gt;
	if not is_set (str) then return str end&lt;br /&gt;
&lt;br /&gt;
	if str:sub (1, 1) == &amp;quot;&#039;&amp;quot; then str = &amp;quot;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;quot; .. str; end&lt;br /&gt;
	if str:sub (-1, -1) == &amp;quot;&#039;&amp;quot; then str = str .. &amp;quot;&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;&amp;quot;; end&lt;br /&gt;
	&lt;br /&gt;
	return str:gsub (&#039;\n&#039;, &#039; &#039;);												-- Remove newlines as they break italics.&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; W R A P _ S T Y L E &amp;gt;----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Applies styling to various parameters.  Supplied string is wrapped using a message_list configuration taking one&lt;br /&gt;
argument; protects italic styled parameters.  Additional text taken from citation_config.presentation - the reason&lt;br /&gt;
this function is similar to but separate from wrap_msg().&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function wrap_style (key, str)&lt;br /&gt;
	if not is_set (str) then&lt;br /&gt;
		return &amp;quot;&amp;quot;;&lt;br /&gt;
	elseif in_array (key, {&#039;italic-title&#039;, &#039;trans-italic-title&#039;}) then&lt;br /&gt;
		str = safe_for_italics (str);&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return substitute (cfg.presentation[key], {str});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; M A K E _ S E P _ L I S T &amp;gt;------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
make a separated list of items using provided separators.&lt;br /&gt;
	&amp;lt;sep_list&amp;gt; - typically &#039;&amp;lt;comma&amp;gt;&amp;lt;space&amp;gt;&#039;&lt;br /&gt;
	&amp;lt;sep_list_pair&amp;gt; - typically &#039;&amp;lt;space&amp;gt;and&amp;lt;space&amp;gt;&#039;&lt;br /&gt;
	&amp;lt;sep_list_end&amp;gt; - typically &#039;&amp;lt;comma&amp;gt;&amp;lt;space&amp;gt;and&amp;lt;space&amp;gt;&#039; or &#039;&amp;lt;comma&amp;gt;&amp;lt;space&amp;gt;&amp;amp;&amp;lt;space&amp;gt;&#039;&lt;br /&gt;
&lt;br /&gt;
defaults to cfg.presentation[&#039;sep_list&#039;], cfg.presentation[&#039;sep_list_pair&#039;], and cfg.presentation[&#039;sep_list_end&#039;]&lt;br /&gt;
if &amp;lt;sep_list_end&amp;gt; is specified, &amp;lt;sep_list&amp;gt; and &amp;lt;sep_list_pair&amp;gt; must also be supplied&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function make_sep_list (count, list_seq, sep_list, sep_list_pair, sep_list_end)&lt;br /&gt;
	local list = &#039;&#039;;&lt;br /&gt;
&lt;br /&gt;
	if not sep_list then														-- set the defaults&lt;br /&gt;
		sep_list = cfg.presentation[&#039;sep_list&#039;];&lt;br /&gt;
		sep_list_pair = cfg.presentation[&#039;sep_list_pair&#039;];&lt;br /&gt;
		sep_list_end = cfg.presentation[&#039;sep_list_end&#039;];&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if 2 &amp;gt;= count then&lt;br /&gt;
		list = table.concat (list_seq, sep_list_pair);							-- insert separator between two items; returns list_seq[1] then only one item&lt;br /&gt;
	elseif 2 &amp;lt; count then&lt;br /&gt;
		list = table.concat (list_seq, sep_list, 1, count - 1);					-- concatenate all but last item with plain list separator&lt;br /&gt;
		list = table.concat ({list, list_seq[count]}, sep_list_end);			-- concatenate last item onto end of &amp;lt;list&amp;gt; with final separator&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return list;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; S E L E C T _ O N E &amp;gt;----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Chooses one matching parameter from a list of parameters to consider.  The list of parameters to consider is just&lt;br /&gt;
names.  For parameters that may be enumerated, the position of the numerator in the parameter name is identified&lt;br /&gt;
by the &#039;#&#039; so |author-last1= and |author1-last= are represented as &#039;author-last#&#039; and &#039;author#-last&#039;.&lt;br /&gt;
&lt;br /&gt;
Because enumerated parameter |&amp;lt;param&amp;gt;1= is an alias of |&amp;lt;param&amp;gt;= we must test for both possibilities.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Generates an error if more than one match is present.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function select_one (args, aliases_list, error_condition, index)&lt;br /&gt;
	local value = nil;															-- the value assigned to the selected parameter&lt;br /&gt;
	local selected = &#039;&#039;;														-- the name of the parameter we have chosen&lt;br /&gt;
	local error_list = {};&lt;br /&gt;
&lt;br /&gt;
	if index ~= nil then index = tostring(index); end&lt;br /&gt;
&lt;br /&gt;
	for _, alias in ipairs (aliases_list) do									-- for each alias in the aliases list&lt;br /&gt;
		if alias:match (&#039;#&#039;) then												-- if this alias can be enumerated&lt;br /&gt;
			if &#039;1&#039; == index then												-- when index is 1 test for enumerated and non-enumerated aliases&lt;br /&gt;
				value, selected = is_alias_used (args, alias, index, false, value, selected, error_list);	-- first test for non-enumerated alias&lt;br /&gt;
			end&lt;br /&gt;
			value, selected = is_alias_used (args, alias, index, true, value, selected, error_list);	-- test for enumerated alias&lt;br /&gt;
		else&lt;br /&gt;
			value, selected = is_alias_used (args, alias, index, false, value, selected, error_list);	-- test for non-enumerated alias&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if #error_list &amp;gt; 0 and &#039;none&#039; ~= error_condition then						-- for cases where this code is used outside of extract_names()&lt;br /&gt;
		for i, v in ipairs (error_list) do&lt;br /&gt;
			error_list[i] = wrap_style (&#039;parameter&#039;, v);&lt;br /&gt;
		end&lt;br /&gt;
		table.insert (error_list, wrap_style (&#039;parameter&#039;, selected));&lt;br /&gt;
		set_message (error_condition, {make_sep_list (#error_list, error_list)});&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return value, selected;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[=[-------------------------&amp;lt; R E M O V E _ W I K I _ L I N K &amp;gt;----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Gets the display text from a wikilink like [[A|B]] or [[B]] gives B&lt;br /&gt;
&lt;br /&gt;
The str:gsub() returns either A|B froma [[A|B]] or B from [[B]] or B from B (no wikilink markup).&lt;br /&gt;
&lt;br /&gt;
In l(), l:gsub() removes the link and pipe (if they exist); the second :gsub() trims whitespace from the label&lt;br /&gt;
if str was wrapped in wikilink markup.  Presumably, this is because without wikimarkup in str, there is no match&lt;br /&gt;
in the initial gsub, the replacement function l() doesn&#039;t get called.&lt;br /&gt;
&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
local function remove_wiki_link (str)&lt;br /&gt;
	return (str:gsub (&amp;quot;%[%[([^%[%]]*)%]%]&amp;quot;, function(l)&lt;br /&gt;
		return l:gsub (&amp;quot;^[^|]*|(.*)$&amp;quot;, &amp;quot;%1&amp;quot; ):gsub (&amp;quot;^%s*(.-)%s*$&amp;quot;, &amp;quot;%1&amp;quot;);&lt;br /&gt;
	end));&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[=[-------------------------&amp;lt; I S _ W I K I L I N K &amp;gt;--------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Determines if str is a wikilink, extracts, and returns the wikilink type, link text, and display text parts.&lt;br /&gt;
If str is a complex wikilink ([[L|D]]):&lt;br /&gt;
	returns wl_type 2 and D and L from [[L|D]];&lt;br /&gt;
if str is a simple wikilink ([[D]])&lt;br /&gt;
	returns wl_type 1 and D from [[D]] and L as empty string;&lt;br /&gt;
if not a wikilink:&lt;br /&gt;
	returns wl_type 0, str as D, and L as empty string.&lt;br /&gt;
&lt;br /&gt;
trims leading and trailing whitespace and pipes from L and D ([[L|]] and [[|D]] are accepted by MediaWiki and&lt;br /&gt;
treated like [[D]]; while [[|D|]] is not accepted by MediaWiki, here, we accept it and return D without the pipes).&lt;br /&gt;
&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
local function is_wikilink (str)&lt;br /&gt;
	local D, L&lt;br /&gt;
	local wl_type = 2;															-- assume that str is a complex wikilink [[L|D]]&lt;br /&gt;
&lt;br /&gt;
	if not str:match (&#039;^%[%[[^%]]+%]%]$&#039;) then									-- is str some sort of a wikilink (must have some sort of content)&lt;br /&gt;
		return 0, str, &#039;&#039;;														-- not a wikilink; return wl_type as 0, str as D, and empty string as L&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	L, D = str:match (&#039;^%[%[([^|]+)|([^%]]+)%]%]$&#039;);							-- get L and D from [[L|D]] &lt;br /&gt;
&lt;br /&gt;
	if not is_set (D) then														-- if no separate display&lt;br /&gt;
		D = str:match (&#039;^%[%[([^%]]*)|*%]%]$&#039;);									-- get D from [[D]] or [[D|]]&lt;br /&gt;
		wl_type = 1; &lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	D = mw.text.trim (D, &#039;%s|&#039;);												-- trim white space and pipe characters &lt;br /&gt;
	return wl_type, D, L or &#039;&#039;;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; S T R I P _ A P O S T R O P H E _ M A R K U P &amp;gt;--------------------------------&lt;br /&gt;
&lt;br /&gt;
Strip wiki italic and bold markup from argument so that it doesn&#039;t contaminate COinS metadata.&lt;br /&gt;
This function strips common patterns of apostrophe markup.  We presume that editors who have taken the time to&lt;br /&gt;
markup a title have, as a result, provided valid markup. When they don&#039;t, some single apostrophes are left behind.&lt;br /&gt;
&lt;br /&gt;
Returns the argument without wiki markup and a number; the number is more-or-less meaningless except as a flag&lt;br /&gt;
to indicate that markup was replaced; do not rely on it as an indicator of how many of any kind of markup was&lt;br /&gt;
removed; returns the argument and nil when no markup removed&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function strip_apostrophe_markup (argument)&lt;br /&gt;
	if not is_set (argument) then&lt;br /&gt;
		return argument, nil;													-- no argument, nothing to do&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if nil == argument:find ( &amp;quot;&#039;&#039;&amp;quot;, 1, true ) then								-- Is there at least one double apostrophe?  If not, exit.&lt;br /&gt;
		return argument, nil;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local flag;&lt;br /&gt;
	while true do&lt;br /&gt;
		if argument:find (&amp;quot;&#039;&#039;&#039;&#039;&#039;&amp;quot;, 1, true) then								-- bold italic (5)&lt;br /&gt;
			argument, flag = argument:gsub (&amp;quot;%&#039;%&#039;%&#039;%&#039;%&#039;&amp;quot;, &amp;quot;&amp;quot;);					-- remove all instances of it&lt;br /&gt;
		elseif argument:find (&amp;quot;&#039;&#039;&#039;&#039;&amp;quot;, 1, true) then								-- italic start and end without content (4)&lt;br /&gt;
			argument, flag=argument:gsub (&amp;quot;%&#039;%&#039;%&#039;%&#039;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
		elseif argument:find (&amp;quot;&#039;&#039;&#039;&amp;quot;, 1, true) then								-- bold (3)&lt;br /&gt;
			argument, flag=argument:gsub (&amp;quot;%&#039;%&#039;%&#039;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
		elseif argument:find (&amp;quot;&#039;&#039;&amp;quot;, 1, true) then								-- italic (2)&lt;br /&gt;
			argument, flag = argument:gsub (&amp;quot;%&#039;%&#039;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
		else&lt;br /&gt;
			break;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return argument, flag;														-- done&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; S E T _ S E L E C T E D _ M O D U L E S &amp;gt;--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Sets local cfg table to same (live or sandbox) as that used by the other modules.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function set_selected_modules (cfg_table_ptr)&lt;br /&gt;
	cfg = cfg_table_ptr;&lt;br /&gt;
	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E X P O R T S &amp;gt;----------------------------------------------------------------&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	add_maint_cat = add_maint_cat,												-- exported functions&lt;br /&gt;
	add_prop_cat = add_prop_cat,&lt;br /&gt;
	error_comment = error_comment,&lt;br /&gt;
	has_accept_as_written = has_accept_as_written,&lt;br /&gt;
	hyphen_to_dash = hyphen_to_dash,&lt;br /&gt;
	in_array = in_array,&lt;br /&gt;
	is_set = is_set,&lt;br /&gt;
	is_wikilink = is_wikilink,&lt;br /&gt;
	make_sep_list = make_sep_list,&lt;br /&gt;
	make_wikilink = make_wikilink,&lt;br /&gt;
	remove_wiki_link = remove_wiki_link,&lt;br /&gt;
	safe_for_italics = safe_for_italics,&lt;br /&gt;
	select_one = select_one,&lt;br /&gt;
	set_message = set_message,&lt;br /&gt;
	set_selected_modules = set_selected_modules,&lt;br /&gt;
	strip_apostrophe_markup = strip_apostrophe_markup,&lt;br /&gt;
	substitute = substitute,&lt;br /&gt;
	wrap_style = wrap_style,&lt;br /&gt;
&lt;br /&gt;
	z = z,																		-- exported table&lt;br /&gt;
	}&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Module:Citation/CS1/Suggestions&amp;diff=6671</id>
		<title>Module:Citation/CS1/Suggestions</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Module:Citation/CS1/Suggestions&amp;diff=6671"/>
		<updated>2025-11-01T21:43:06Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;-- Please insert new suggestions in alphabetical order&lt;br /&gt;
-- The form is [&#039;incorrect&#039;] = &#039;correct&#039;,&lt;br /&gt;
&lt;br /&gt;
suggestions = {&lt;br /&gt;
	[&#039;ASIN-TLD&#039;] = &#039;asin-tld&#039;,													-- old parameter name&lt;br /&gt;
	[&#039;abruf&#039;] = &#039;access-date&#039;,													-- German&lt;br /&gt;
	[&#039;abruf-verborgen&#039;] = &#039;access-date&#039;,										-- German&lt;br /&gt;
	[&#039;accessmonth&#039;] = &#039;access-date&#039;,&lt;br /&gt;
	[&#039;accesso&#039;] = &#039;access-date&#039;,												-- Italian&lt;br /&gt;
	[&#039;accessyear&#039;] = &#039;access-date&#039;,&lt;br /&gt;
	[&#039;acessodata&#039;] = &#039;access-date&#039;,												-- Brazilian Portuguese&lt;br /&gt;
	[&#039;ad&#039;] = &#039;first&#039;,															-- Turkish&lt;br /&gt;
	[&#039;address&#039;] = &#039;location&#039;,&lt;br /&gt;
	[&#039;anno&#039;] = &#039;date&#039;,															-- Italian&lt;br /&gt;
	[&#039;annoaccesso&#039;] = &#039;access-date&#039;,											-- Italian&lt;br /&gt;
	[&#039;annodiaccesso&#039;] = &#039;access-date&#039;,											-- Italian&lt;br /&gt;
	[&#039;annooriginale&#039;] = &#039;orig-date&#039;,											-- Italian&lt;br /&gt;
	[&#039;année&#039;] = &#039;date&#039;,															-- French&lt;br /&gt;
	[&#039;apellido&#039;] = &#039;last&#039;,														-- Spanish&lt;br /&gt;
	[&#039;apellidos&#039;] = &#039;last&#039;,														-- Spanish&lt;br /&gt;
	[&#039;archiv-datum&#039;] = &#039;archive-date&#039;,											-- German&lt;br /&gt;
	[&#039;archiv-url&#039;] = &#039;archive-url&#039;,												-- German&lt;br /&gt;
	[&#039;archive date&#039;] = &#039;archive-date&#039;,                                          -- misspelling&lt;br /&gt;
	[&#039;archive url&#039;] = &#039;archive-url&#039;,											-- misspelling&lt;br /&gt;
	[&#039;archive-link&#039;] = &#039;archive-url&#039;,	                                        -- old parameter name&lt;br /&gt;
    [&#039;archiv-url&#039;] = &#039;archive-url&#039;,												-- German	&lt;br /&gt;
    [&#039;arkivdatum&#039;] = &#039;archive-date&#039;,											-- Swedish, Norwegian&lt;br /&gt;
    [&#039;arkivurl&#039;] = &#039;archive-url&#039;,											    -- Swedish, Norwegian	&lt;br /&gt;
    [&#039;artist&#039;] = &#039;others&#039;,&lt;br /&gt;
	[&#039;arşiv-tarihi&#039;] = &#039;archive-date&#039;,											-- Turkish&lt;br /&gt;
	[&#039;arşiv-url&#039;] = &#039;archive-url&#039;,												-- Turkish&lt;br /&gt;
	[&#039;arşivtarihi&#039;] = &#039;archive-date&#039;,											-- Turkish&lt;br /&gt;
	[&#039;arşivurl&#039;] = &#039;archive-url&#039;,												-- Turkish&lt;br /&gt;
	[&#039;auflage&#039;] = &#039;edition&#039;,													-- German&lt;br /&gt;
	[&#039;auteur&#039;] = &#039;author&#039;,														-- French&lt;br /&gt;
	[&#039;auther&#039;] = &#039;author&#039;,                                                      -- misspelling&lt;br /&gt;
	[&#039;author link&#039;] = &#039;author-link&#039;,											-- Polish&lt;br /&gt;
	[&#039;authorfirst&#039;] = &#039;author-first&#039;,											-- old parameter name&lt;br /&gt;
	[&#039;authorgiven&#039;] = &#039;author-given&#039;,											-- old parameter name&lt;br /&gt;
	[&#039;authorlast&#039;] = &#039;author-last&#039;,												-- old parameter name&lt;br /&gt;
	[&#039;authormask&#039;] = &#039;author-mask&#039;,												-- old parameter name&lt;br /&gt;
	[&#039;authorsurname&#039;] = &#039;author-surname&#039;,										-- old parameter name&lt;br /&gt;
	[&#039;autor&#039;] = &#039;author&#039;,														-- Spanish, German (singular and plural)&lt;br /&gt;
	[&#039;autore&#039;] = &#039;author&#039;,														-- Italian&lt;br /&gt;
	[&#039;autthor&#039;] = &#039;author&#039;,                                                     -- misspelling&lt;br /&gt;
	[&#039;ay&#039;] = &#039;month&#039;,															-- Turkish&lt;br /&gt;
	[&#039;año&#039;] = &#039;date&#039;,															-- Spanish&lt;br /&gt;
	[&#039;año-original&#039;] = &#039;orig-date&#039;,												-- Spanish&lt;br /&gt;
	[&#039;añoacceso&#039;] = &#039;access-date&#039;,												-- Spanish&lt;br /&gt;
	[&#039;añooriginal&#039;] = &#039;orig-date&#039;,												-- Spanish&lt;br /&gt;
	[&#039;band&#039;] = &#039;volume&#039;,														-- German&lt;br /&gt;
	[&#039;bandreihe&#039;] = &#039;volume&#039;,													-- German&lt;br /&gt;
	[&#039;baskı&#039;] = &#039;edition&#039;,														-- Turkish&lt;br /&gt;
	[&#039;başlık&#039;] = &#039;title&#039;,														-- Turkish&lt;br /&gt;
	[&#039;began&#039;] = &#039;date&#039;,															-- old parameter name (cite serial only); or orig-date=&lt;br /&gt;
	[&#039;booktitle&#039;] = &#039;book-title&#039;,												-- old parameter name&lt;br /&gt;
	[&#039;ch&#039;] = &#039;language&#039;,														-- German (as &#039;language=de-CH&#039;)&lt;br /&gt;
	[&#039;chapter_title&#039;] = &#039;chapter&#039;,&lt;br /&gt;
	[&#039;chapterurl&#039;] = &#039;chapter-url&#039;,												-- old parameter name&lt;br /&gt;
	[&#039;cid&#039;] = &#039;ref&#039;,															-- Italian&lt;br /&gt;
	[&#039;cilt&#039;] = &#039;volume&#039;,														-- Turkish&lt;br /&gt;
	[&#039;cita&#039;] = &#039;quote&#039;,															-- Spanish&lt;br /&gt;
	[&#039;citazione&#039;] = &#039;quote&#039;,													-- Italian&lt;br /&gt;
	[&#039;città&#039;] = &#039;location&#039;,														-- Italian&lt;br /&gt;
	[&#039;city&#039;] = &#039;location&#039;,														-- old parameter name (cite serial only)&lt;br /&gt;
	[&#039;coauthor&#039;] = &#039;author&#039;,&lt;br /&gt;
	[&#039;coauthors&#039;] = &#039;author&#039;,&lt;br /&gt;
	[&#039;coautores&#039;] = &#039;author&#039;,													-- Spanish&lt;br /&gt;
	[&#039;coautori&#039;] = &#039;author&#039;,													-- Italian&lt;br /&gt;
	[&#039;cognome&#039;] = &#039;last&#039;,														-- Italian&lt;br /&gt;
	[&#039;conferenceurl&#039;] = &#039;conference-url&#039;,										-- old parameter name&lt;br /&gt;
	[&#039;consulté le&#039;] = &#039;access-date&#039;,											-- French&lt;br /&gt;
	[&#039;contributionurl&#039;] = &#039;contribution-url&#039;,									-- old parameter name&lt;br /&gt;
	[&#039;curatore&#039;] = &#039;publisher&#039;,													-- Italian&lt;br /&gt;
	[&#039;czasopismo&#039;] = &#039;journal&#039;,													-- Polish&lt;br /&gt;
	[&#039;data dostępu&#039;] = &#039;access-date&#039;,											-- Polish&lt;br /&gt;
	[&#039;data&#039;] = &#039;date&#039;,															-- Polish, Italian&lt;br /&gt;
	[&#039;dataaccesso&#039;] = &#039;access-date&#039;,											-- Italian&lt;br /&gt;
	[&#039;dataarchivio&#039;] = &#039;archive-date&#039;,											-- Italian&lt;br /&gt;
	[&#039;datum&#039;] = &#039;date&#039;,															-- German, Swedish&lt;br /&gt;
	[&#039;dead-url&#039;] = &#039;url-status&#039;,												-- old parameter name&lt;br /&gt;
	[&#039;deadlink&#039;] = &#039;url-status&#039;,                                                -- old parameter name&lt;br /&gt;
	[&#039;deadurl&#039;] = &#039;url-status&#039;,													-- old parameter name&lt;br /&gt;
	[&#039;dergi&#039;] = &#039;work&#039;,															-- Turkish&lt;br /&gt;
	[&#039;dil&#039;] = &#039;language&#039;,														-- Turkish&lt;br /&gt;
	[&#039;displayauthors&#039;] = &#039;display-authors&#039;,										-- old parameter name&lt;br /&gt;
	[&#039;displayeditors&#039;] = &#039;display-editors&#039;,										-- old parameter name&lt;br /&gt;
	[&#039;distributor&#039;] = &#039;publisher&#039;,&lt;br /&gt;
	[&#039;dnb&#039;] = &#039;id&#039;,																-- German (as &#039;id={{DNB-IDN|...}}&#039;)&lt;br /&gt;
	[&#039;doi-broken&#039;] = &#039;doi-broken-date&#039;,											-- old parameter alias&lt;br /&gt;
	[&#039;doi-inactive&#039;] = &#039;doi-broken-date&#039;,										-- invalid name found in mainspace&lt;br /&gt;
	[&#039;doi-inactive-date&#039;] = &#039;doi-broken-date&#039;,									-- old parameter alias&lt;br /&gt;
	[&#039;doi_brokendate&#039;] = &#039;doi-broken-date&#039;,										-- old parameter alias&lt;br /&gt;
	[&#039;doi_inactivedate&#039;] = &#039;doi-inactive-date&#039;,									-- old parameter alias&lt;br /&gt;
	[&#039;doibroken&#039;] = &#039;doi-broken-date&#039;,											-- invalid name found in mainspace&lt;br /&gt;
	[&#039;doiinactive&#039;] = &#039;doi-broken-date&#039;,										-- invalid name found in mainspace&lt;br /&gt;
	[&#039;e-print&#039;] = &#039;eprint&#039;,														-- misspelling&lt;br /&gt;
	-- [&#039;ed&#039;] = &#039;edition&#039;,														-- avoid suggestion as in English this could be short for editor or edition&lt;br /&gt;
	-- [&#039;editora&#039;] = &#039;publisher&#039;,												-- can be either editor or publisher&lt;br /&gt;
	-- [&#039;editore&#039;] = &#039;agency&#039;,													-- can be either publisher or agency&lt;br /&gt;
	-- [&#039;editori&#039;] = &#039;editor&#039;,													-- can be either editor or publisher&lt;br /&gt;
	-- [&#039;editorial&#039;] = &#039;publisher&#039;,												-- can be either publisher or work&lt;br /&gt;
	[&#039;editoin&#039;] = &#039;edition&#039;,													-- misspelling&lt;br /&gt;
	[&#039;editon&#039;] = &#039;edition&#039;,														-- misspelling&lt;br /&gt;
	[&#039;editorfirst&#039;] = &#039;editor-first&#039;,											-- old parameter name&lt;br /&gt;
	[&#039;editorgiven&#039;] = &#039;editor-given&#039;,											-- old parameter name&lt;br /&gt;
	[&#039;editorlast&#039;] = &#039;editor-last&#039;,												-- old parameter name&lt;br /&gt;
	[&#039;editorlink&#039;] = &#039;editor-link&#039;,												-- old parameter name&lt;br /&gt;
	[&#039;editormask&#039;] = &#039;editor-mask&#039;,												-- old parameter name&lt;br /&gt;
	[&#039;editors&#039;] = &#039;editor&#039;,														-- old parameter name (can be emulated using multiple singular |editor= params)&lt;br /&gt;
	[&#039;editorsurname&#039;] = &#039;editor-surname&#039;,										-- old parameter name&lt;br /&gt;
	[&#039;edizione&#039;] = &#039;edition&#039;,													-- Italian&lt;br /&gt;
	[&#039;embargo&#039;] = &#039;pmc-embargo-date&#039;,											-- old parameter name&lt;br /&gt;
	[&#039;ended&#039;] = &#039;date&#039;,															-- old parameter name (cite serial only)&lt;br /&gt;
	[&#039;en ligne le&#039;] = &#039;archive-date&#039;,											-- French&lt;br /&gt;
	[&#039;encyclopædia&#039;] = &#039;encyclopedia&#039;,&lt;br /&gt;
	[&#039;enlaceautor&#039;] = &#039;author-link&#039;,											-- Spanish&lt;br /&gt;
	[&#039;enlaceroto&#039;] = &#039;url-status&#039;,												-- Spanish&lt;br /&gt;
	[&#039;episodelink&#039;] = &#039;episode-link&#039;,											-- old parameter name&lt;br /&gt;
	[&#039;erişimtarihi&#039;] = &#039;access-date&#039;,											-- Turkish&lt;br /&gt;
	[&#039;eser&#039;] = &#039;work&#039;,															-- Turkish&lt;br /&gt;
	[&#039;family&#039;] = &#039;surname&#039;,														-- misguess&lt;br /&gt;
	[&#039;fecha&#039;] = &#039;date&#039;,															-- Spanish&lt;br /&gt;
	[&#039;fechaacceso&#039;] = &#039;access-date&#039;,											-- Spanish&lt;br /&gt;
	[&#039;fechaarchivo&#039;] = &#039;archive-date&#039;,											-- Spanish&lt;br /&gt;
	[&#039;filetype&#039;] = &#039;format&#039;,&lt;br /&gt;
	[&#039;foramt&#039;] = &#039;format&#039;,														-- misspelling&lt;br /&gt;
	[&#039;fore-name&#039;] = &#039;given&#039;,													-- misguess/misspelling&lt;br /&gt;
	[&#039;forename&#039;] = &#039;given&#039;,														-- misguess&lt;br /&gt;
	[&#039;författare&#039;] = &#039;author&#039;,                                                  -- Swedish, Norwegian&lt;br /&gt;
    [&#039;formato&#039;] = &#039;format&#039;,														-- Spanish, Italian, Polish&lt;br /&gt;
	[&#039;frist&#039;] = &#039;first&#039;,														-- misspelling&lt;br /&gt;
	[&#039;fundstelle&#039;] = &#039;at&#039;,														-- German&lt;br /&gt;
	[&#039;gazete&#039;] = &#039;work&#039;,														-- Turkish&lt;br /&gt;
	[&#039;giornale&#039;] = &#039;journal&#039;,													-- Italian&lt;br /&gt;
    [&#039;hämtdatum&#039;] = &#039;access-date&#039;,											    -- Swedish	&lt;br /&gt;
    [&#039;herausgeber&#039;] = &#039;editor&#039;,													-- German (singular and plural)&lt;br /&gt;
	[&#039;hrsg&#039;] = &#039;publisher&#039;,														-- German&lt;br /&gt;
	[&#039;hrsgreihe&#039;] = &#039;editor&#039;,													-- German&lt;br /&gt;
	[&#039;idioma&#039;] = &#039;language&#039;,													-- Spanish&lt;br /&gt;
	[&#039;ignore-isbn-error&#039;] = &#039;isbn&#039;,												-- old parameter (can be fully emulated using ((syntax)))&lt;br /&gt;
	[&#039;ignoreisbnerror&#039;] = &#039;isbn&#039;,												-- old parameter alias (suggest |isbn as |ignore-isbn-error is deprecated), not a direct replacement, but can be fully emulated using ((syntax))&lt;br /&gt;
	[&#039;imię&#039;] = &#039;first&#039;,															-- Polish&lt;br /&gt;
	[&#039;in-set&#039;] = &#039;inset&#039;,														-- misspelling&lt;br /&gt;
	[&#039;interviewerlink&#039;] = &#039;interviewer-link&#039;,									-- old parameter alias&lt;br /&gt;
	[&#039;interviewermask&#039;] = &#039;interviewer-mask&#039;,									-- old parameter alias&lt;br /&gt;
	[&#039;isbndefekt&#039;] = &#039;isbn&#039;,													-- German (suggest |isbn as |ignore-isbn-error is deprecated), not a direct replacement, but can be fully emulated using ((syntax))&lt;br /&gt;
	[&#039;isbnformalfalsch&#039;] = &#039;isbn&#039;,												-- German (suggest |isbn as |ignore-isbn-error is deprecated), not a direct replacement, but can be fully emulated using ((syntax))&lt;br /&gt;
	[&#039;isbnistformalfalsch&#039;] = &#039;isbn&#039;,											-- German (suggest |isbn as |ignore-isbn-error is deprecated), not a direct replacement, but can be fully emulated using ((syntax))&lt;br /&gt;
	[&#039;isnb&#039;] = &#039;isbn&#039;,															-- misspelling&lt;br /&gt;
	[&#039;issnformalfalsch&#039;] = &#039;issn&#039;,												-- German (can be fully emulated using ((syntax)))&lt;br /&gt;
	[&#039;jahr&#039;] = &#039;date&#039;,															-- German&lt;br /&gt;
	[&#039;jahrea&#039;] = &#039;orig-date&#039;,													-- German (not a direct replacement, but can be emulated)&lt;br /&gt;
	[&#039;kapitel&#039;] = &#039;chapter&#039;,													-- German&lt;br /&gt;
	[&#039;langauge&#039;] = &#039;language&#039;,													-- misspelling&lt;br /&gt;
	[&#039;langue&#039;] = &#039;language&#039;,													-- French&lt;br /&gt;
	[&#039;last-author-amp&#039;] = &#039;name-list-style&#039;,									-- old parameter name (as |name-list-style=amp)&lt;br /&gt;
	[&#039;lastauthoramp&#039;] = &#039;name-list-style&#039;,										-- old parameter name (as |name-list-style=amp)&lt;br /&gt;
	[&#039;lieu&#039;] = &#039;location&#039;,														-- French&lt;br /&gt;
	[&#039;lingua&#039;] = &#039;language&#039;,													-- Italian&lt;br /&gt;
	[&#039;lire en ligne&#039;] = &#039;url&#039;,													-- French&lt;br /&gt;
	[&#039;lizenznummer&#039;] = &#039;id&#039;,													-- German (as &#039;id=License No. ...&#039;)&lt;br /&gt;
&lt;br /&gt;
	[&#039;loaction&#039;] = &#039;location&#039;,													-- misspelling&lt;br /&gt;
	[&#039;local&#039;] = &#039;location&#039;,														-- Brazilian Portuguese&lt;br /&gt;
	[&#039;locatoin&#039;] = &#039;location&#039;,													-- misspelling&lt;br /&gt;
	[&#039;lugar&#039;] = &#039;location&#039;,														-- Spanish&lt;br /&gt;
	[&#039;mailinglist&#039;] = &#039;mailing-list&#039;,											-- old parameter name&lt;br /&gt;
	[&#039;mapurl&#039;] = &#039;map-url&#039;,														-- old parameter name&lt;br /&gt;
	[&#039;mes&#039;] = &#039;date&#039;,															-- Spanish (not a direct replacement)&lt;br /&gt;
	[&#039;mese&#039;] = &#039;date&#039;,															-- Italian (not a direct replacement)&lt;br /&gt;
	[&#039;miejsce&#039;] = &#039;location&#039;,													-- Polish&lt;br /&gt;
	[&#039;miesiąc&#039;] = &#039;date&#039;,														-- Polish&lt;br /&gt;
	[&#039;mois&#039;] = &#039;date&#039;,															-- French&lt;br /&gt;
	[&#039;monat&#039;] = &#039;date&#039;,															-- German&lt;br /&gt;
--	[&#039;name&#039;] = &#039;author&#039;,														-- &#039;name&#039; is often erroneously used for &#039;title&#039; and &#039;work&#039; as well, so no suggestion is better than a wrong suggestion&lt;br /&gt;
	[&#039;name-list-format&#039;] = &#039;name-list-style&#039;,									-- old parameter name (as |name-list-style=amp)&lt;br /&gt;
	[&#039;nazwisko&#039;] = &#039;last&#039;,														-- Polish&lt;br /&gt;
	[&#039;nespaper&#039;] = &#039;newspaper&#039;,													-- misspelling&lt;br /&gt;
	[&#039;net-work&#039;] = &#039;network&#039;,													-- misspelling&lt;br /&gt;
	[&#039;newpaper&#039;] = &#039;newspaper&#039;,													-- misspelling&lt;br /&gt;
	[&#039;news&#039;] = &#039;newspaper&#039;,&lt;br /&gt;
	[&#039;news-group&#039;] = &#039;newsgroup&#039;,												-- misspelling&lt;br /&gt;
	[&#039;news-paper&#039;] = &#039;newspaper&#039;,												-- misspelling&lt;br /&gt;
	[&#039;no-cat&#039;] = &#039;no-tracking&#039;,													-- old parameter&lt;br /&gt;
	[&#039;nocat&#039;] = &#039;no-tracking&#039;,													-- old parameter&lt;br /&gt;
	[&#039;nom&#039;] = &#039;last&#039;,															-- French&lt;br /&gt;
	[&#039;nombre&#039;] = &#039;first&#039;,														-- Spanish&lt;br /&gt;
	[&#039;nome&#039;] = &#039;first&#039;,															-- Italian&lt;br /&gt;
	[&#039;nopp&#039;] = &#039;no-pp&#039;,															-- old parameter name&lt;br /&gt;
	[&#039;notracking&#039;] = &#039;no-tracking&#039;,												-- old parameter&lt;br /&gt;
	[&#039;numero&#039;] = &#039;number&#039;,														-- Italian, Spanish&lt;br /&gt;
	[&#039;nummer&#039;] = &#039;number&#039;,														-- German&lt;br /&gt;
	[&#039;nummerreihe&#039;] = &#039;number&#039;,													-- German&lt;br /&gt;
	[&#039;obra&#039;] = &#039;work&#039;,															-- Spanish&lt;br /&gt;
	[&#039;odpowiedzialność&#039;] = &#039;agency&#039;,											-- Polish&lt;br /&gt;
	[&#039;offline&#039;] = &#039;url-status&#039;,													-- German (as &#039;url-status=dead&#039;)&lt;br /&gt;
	[&#039;online&#039;] = &#039;url&#039;,															-- German (not a direct replacement, but can be emulated)&lt;br /&gt;
	[&#039;opera&#039;] = &#039;work&#039;,															-- Italian&lt;br /&gt;
	[&#039;opublikowany&#039;] = &#039;agency&#039;,												-- Polish&lt;br /&gt;
	[&#039;origdate&#039;] = &#039;orig-date&#039;,													-- misspelling&lt;br /&gt;
	[&#039;originaljahr&#039;] = &#039;orig-date&#039;,												-- German&lt;br /&gt;
	[&#039;originalort&#039;] = &#039;publication-place&#039;,										-- German&lt;br /&gt;
	[&#039;originalsprache&#039;] = &#039;language&#039;,											-- German&lt;br /&gt;
	[&#039;originaltitel&#039;] = &#039;title&#039;,												-- German (if &#039;originaltitel&#039; is specified, any possible contents of &#039;title&#039; should be put in &#039;trans-title&#039;)&lt;br /&gt;
	[&#039;ort&#039;] = &#039;publication-place&#039;,												-- German&lt;br /&gt;
	[&#039;ortea&#039;] = &#039;publication-place&#039;,											-- German (not a direct replacement, but can be emulated)&lt;br /&gt;
	[&#039;other&#039;] = &#039;others&#039;,&lt;br /&gt;
	[&#039;oznaczenie&#039;] = &#039;agency&#039;,													-- Polish&lt;br /&gt;
	[&#039;pagees&#039;] = &#039;pages&#039;,														-- misspelling&lt;br /&gt;
	[&#039;pagina&#039;] = &#039;page&#039;,														-- Italian&lt;br /&gt;
	[&#039;pagina&#039;] = &#039;pages&#039;,														-- Italian&lt;br /&gt;
	[&#039;pagine&#039;] = &#039;pages&#039;,														-- Italian&lt;br /&gt;
	[&#039;pagine&#039;] = &#039;pages&#039;,														-- Italian&lt;br /&gt;
	[&#039;passage&#039;] = &#039;pages&#039;,														-- French&lt;br /&gt;
	[&#039;periodico&#039;] = &#039;magazine&#039;,													-- Spanish&lt;br /&gt;
	[&#039;plublisher&#039;] = &#039;publisher&#039;,												-- misspelling&lt;br /&gt;
	[&#039;pmcid&#039;] = &#039;pmc&#039;,&lt;br /&gt;
	[&#039;post-script&#039;] = &#039;postscript&#039;,												-- misspelling&lt;br /&gt;
	[&#039;praca&#039;] = &#039;work&#039;,															-- Polish&lt;br /&gt;
	[&#039;primero&#039;] = &#039;first&#039;,														-- Spanish&lt;br /&gt;
	[&#039;prénom&#039;] = &#039;first&#039;,														-- French&lt;br /&gt;
	[&#039;prénom1&#039;] = &#039;first1&#039;,														-- French&lt;br /&gt;
	[&#039;ps&#039;] = &#039;postscript&#039;,&lt;br /&gt;
	[&#039;pub&#039;] = &#039;publisher&#039;,&lt;br /&gt;
	-- [&#039;pubblicazione&#039;] = &#039;magazine&#039;,											-- could be any kind of work&lt;br /&gt;
	-- [&#039;publicación&#039;] = &#039;journal&#039;,												-- could be any kind of work&lt;br /&gt;
	[&#039;publicationdate&#039;] = &#039;publication-date&#039;,									-- old parameter name&lt;br /&gt;
	-- [&#039;published&#039;] = &#039;publisher&#039;,												-- could be date, location, or name of publisher&lt;br /&gt;
	[&#039;publicationplace&#039;] = &#039;publication-place&#039;,									-- old parameter name&lt;br /&gt;
	[&#039;pulbication-place&#039;] = &#039;publication-place&#039;,								-- misspelling&lt;br /&gt;
	[&#039;página&#039;] = &#039;page&#039;,														-- Spanish&lt;br /&gt;
	[&#039;páginas&#039;] = &#039;pages&#039;,														-- Spanish&lt;br /&gt;
	[&#039;périodique&#039;] = &#039;publisher&#039;,												-- French&lt;br /&gt;
	[&#039;registration&#039;] = &#039;url-access&#039;,											-- old parameter name&lt;br /&gt;
	[&#039;reihe&#039;] = &#039;series&#039;,														-- German&lt;br /&gt;
	[&#039;retrieved&#039;] = &#039;access-date&#039;,                                              -- old parameter name&lt;br /&gt;
	[&#039;richiestasottoscrizione&#039;] = &#039;url-access&#039;,									-- Italian (as |url-access=subscription)&lt;br /&gt;
	[&#039;rivista&#039;] = &#039;magazine&#039;,                                                   -- Italian&lt;br /&gt;
    [&#039;rok&#039;] = &#039;date&#039;,															-- Polish&lt;br /&gt;
	[&#039;rubrik&#039;] = &#039;title&#039;,                                                       -- Swedish&lt;br /&gt;
    [&#039;sammelwerk&#039;] = &#039;work&#039;,													-- German&lt;br /&gt;
	[&#039;sayfa&#039;] = &#039;page&#039;,															-- Turkish&lt;br /&gt;
	[&#039;sayfalar&#039;] = &#039;pages&#039;,														-- Turkish&lt;br /&gt;
	[&#039;sayı&#039;] = &#039;issue&#039;,															-- Turkish&lt;br /&gt;
	[&#039;script-post&#039;] = &#039;postscript&#039;,												-- misspelling&lt;br /&gt;
	[&#039;script-trans&#039;] = &#039;transcript&#039;,											-- misspelling&lt;br /&gt;
	[&#039;season&#039;] = &#039;date&#039;,														-- old parameter name (cite serial only)&lt;br /&gt;
	[&#039;sectionurl&#039;] = &#039;section-url&#039;,												-- old parameter name&lt;br /&gt;
	[&#039;seiten&#039;] = &#039;pages&#039;,														-- German&lt;br /&gt;
	[&#039;seria&#039;] = &#039;series&#039;,														-- Spanish, Polish&lt;br /&gt;
	[&#039;serie&#039;] = &#039;series&#039;,														-- Italian&lt;br /&gt;
	[&#039;série&#039;] = &#039;series&#039;,														-- French&lt;br /&gt;
	[&#039;serieslink&#039;] = &#039;series-link&#039;,												-- old parameter name&lt;br /&gt;
	[&#039;seriesno&#039;] = &#039;series-number&#039;,												-- old parameter name&lt;br /&gt;
	[&#039;service&#039;] = &#039;agency&#039;,&lt;br /&gt;
	[&#039;sitioweb&#039;] = &#039;website&#039;,													-- Spanish&lt;br /&gt;
	[&#039;sito&#039;] = &#039;website&#039;,														-- Italian&lt;br /&gt;
	[&#039;soyadı&#039;] = &#039;last&#039;,														-- Turkish&lt;br /&gt;
	[&#039;spalten&#039;] = &#039;at&#039;,															-- German (not a direct replacement, but can be emulated)&lt;br /&gt;
	[&#039;sprache&#039;] = &#039;language&#039;,													-- German&lt;br /&gt;
	[&#039;språk&#039;] = &#039;language&#039;,                                                     -- Swedish, Norwegian&lt;br /&gt;
    [&#039;stron&#039;] = &#039;page&#039;,															-- Polish&lt;br /&gt;
	[&#039;strony&#039;] = &#039;pages&#039;,														-- Polish&lt;br /&gt;
	[&#039;subjectlink&#039;] = &#039;subject-link&#039;,											-- old parameter name&lt;br /&gt;
	[&#039;subscription&#039;] = &#039;url-access&#039;,											-- old parameter name (emulated as |url-access=subscription)&lt;br /&gt;
	[&#039;sur-name&#039;] = &#039;surname&#039;,													-- misspelling&lt;br /&gt;
	[&#039;suscripción&#039;] = &#039;url-access&#039;,												-- Spanish, Polish (as |url-access=subscription)&lt;br /&gt;
	[&#039;tag&#039;] = &#039;date&#039;,															-- German&lt;br /&gt;
	[&#039;tarih&#039;] = &#039;date&#039;,															-- Turkish&lt;br /&gt;
	[&#039;template doc demo&#039;] = &#039;no-tracking&#039;,										-- old parameter alias&lt;br /&gt;
	[&#039;tidning&#039;] = &#039;work&#039;,                                                       -- Swedish&lt;br /&gt;
    [&#039;tile&#039;] = &#039;title&#039;,															-- misspelling&lt;br /&gt;
	[&#039;timecaption&#039;] = &#039;time-caption&#039;,											-- old parameter name&lt;br /&gt;
	[&#039;titlelink&#039;] = &#039;title-link&#039;,												-- old parameter name&lt;br /&gt;
	[&#039;tipo&#039;] = &#039;type&#039;,															-- Italian&lt;br /&gt;
	[&#039;tite&#039;] = &#039;title&#039;,															-- misspelling&lt;br /&gt;
	[&#039;titel&#039;] = &#039;title&#039;,														-- German&lt;br /&gt;
	[&#039;titel-p&#039;] = &#039;title&#039;,														-- German (&#039;postscript=none&#039; should be added as well)&lt;br /&gt;
	[&#039;titelerg&#039;] = &#039;contribution&#039;,												-- German (not a direct replacement, but can be emulated)&lt;br /&gt;
	[&#039;titled&#039;] = &#039;title&#039;,														-- Brazilian Portuguese&lt;br /&gt;
	[&#039;titolo&#039;] = &#039;title&#039;,														-- Italian&lt;br /&gt;
	[&#039;titre&#039;] = &#039;title&#039;,														-- French&lt;br /&gt;
	[&#039;trans-script&#039;] = &#039;transcript&#039;,											-- misspelling&lt;br /&gt;
	[&#039;trans_chapter&#039;] = &#039;trans-chapter&#039;,										-- old parameter alias&lt;br /&gt;
	[&#039;trans_title&#039;] = &#039;trans-title&#039;,											-- old parameter alias&lt;br /&gt;
	[&#039;transchapter&#039;] = &#039;trans-chapter&#039;,&lt;br /&gt;
	[&#039;transcripturl&#039;] = &#039;transcript-url&#039;,										-- old parameter name&lt;br /&gt;
	[&#039;transscript&#039;] = &#039;transcript&#039;,												-- misspelling&lt;br /&gt;
	[&#039;transscript-format&#039;] = &#039;transcript-format&#039;,								-- misspelling&lt;br /&gt;
	[&#039;transscript-url&#039;] = &#039;transcript-url&#039;,										-- misspelling&lt;br /&gt;
	[&#039;transscripturl&#039;] = &#039;transcript-url&#039;,										-- misspelling&lt;br /&gt;
	[&#039;transtitle&#039;] = &#039;trans-title&#039;,&lt;br /&gt;
	[&#039;typ&#039;] = &#039;author-mask&#039;,													-- German (not a direct replacement, but the only valid argument &#039;typ=wl&#039; can be emulated using &#039;author-mask&#039;)&lt;br /&gt;
	[&#039;tytuł&#039;] = &#039;title&#039;,														-- Polish&lt;br /&gt;
	[&#039;títle&#039;] = &#039;title&#039;,&lt;br /&gt;
	[&#039;título&#039;] = &#039;title&#039;,														-- Spanish&lt;br /&gt;
	[&#039;ubicación&#039;] = &#039;location&#039;,													-- Spanish&lt;br /&gt;
	[&#039;urlarchivio&#039;] = &#039;archive-url&#039;,											-- Italian&lt;br /&gt;
	[&#039;urlarchivo&#039;] = &#039;archive-url&#039;,												-- Spanish&lt;br /&gt;
	[&#039;urlmorto&#039;] = &#039;url-status&#039;,												-- Italian&lt;br /&gt;
	[&#039;urn&#039;] = &#039;id&#039;,																-- German (as &#039;id={{URN|...}}&#039;)&lt;br /&gt;
	[&#039;v-authors&#039;] = &#039;vauthors&#039;,													-- misspelling&lt;br /&gt;
	[&#039;v-editors&#039;] = &#039;veditors&#039;,													-- misspelling&lt;br /&gt;
	[&#039;verlag&#039;] = &#039;publisher&#039;,													-- German&lt;br /&gt;
	[&#039;verlagea&#039;] = &#039;publisher&#039;,													-- German (not a direct replacement, but can be emulated)&lt;br /&gt;
	[&#039;vol&#039;] = &#039;volume&#039;,&lt;br /&gt;
	[&#039;volumen&#039;] = &#039;volume&#039;,														-- Spanish&lt;br /&gt;
	[&#039;werk&#039;] = &#039;work&#039;,															-- German&lt;br /&gt;
	[&#039;werkerg&#039;] = &#039;contribution&#039;,												-- German (not a direct replacement, but can be emulated)&lt;br /&gt;
	[&#039;wkautore&#039;] = &#039;author-link&#039;,												-- Italian&lt;br /&gt;
	[&#039;wolumin&#039;] = &#039;volume&#039;,														-- Polish&lt;br /&gt;
	[&#039;wydanie&#039;] = &#039;number&#039;,														-- Polish&lt;br /&gt;
	[&#039;wydawca&#039;] = &#039;publisher&#039;,													-- French&lt;br /&gt;
	[&#039;yardımcıyazarlar&#039;] = &#039;author&#039;,											-- Turkish&lt;br /&gt;
	[&#039;yayımcı&#039;] = &#039;publisher&#039;,													-- Turkish&lt;br /&gt;
	[&#039;yayıncı&#039;] = &#039;publisher&#039;,													-- Turkish&lt;br /&gt;
	[&#039;yazar&#039;] = &#039;author&#039;,														-- Turkish&lt;br /&gt;
	[&#039;yazarbağı&#039;] = &#039;author-link&#039;,												-- Turkish&lt;br /&gt;
	[&#039;yer&#039;] = &#039;location&#039;,														-- Turkish&lt;br /&gt;
	[&#039;yıl&#039;] = &#039;date&#039;,															-- Turkish&lt;br /&gt;
	[&#039;zaprezentowany&#039;] = &#039;publisher&#039;,											-- French&lt;br /&gt;
	[&#039;zdb&#039;] = &#039;id&#039;,																-- German (as &#039;id={{ZDB|...}}&#039;)&lt;br /&gt;
	[&#039;zitat&#039;] = &#039;quote&#039;,														-- German&lt;br /&gt;
	[&#039;zugriff&#039;] = &#039;access-date&#039;,												-- German&lt;br /&gt;
	[&#039;éditeur&#039;] = &#039;editor&#039;,														-- French&lt;br /&gt;
	[&#039;ölüurl&#039;] = &#039;url-status&#039;,													-- Turkish&lt;br /&gt;
	[&#039;übersetzer&#039;] = &#039;translator&#039;,												-- German (singular and plural)&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; P A T T E R N S &amp;gt;--------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Here we use Lua patterns to make suggestions.  The form is&lt;br /&gt;
&lt;br /&gt;
	[&#039;pattern&#039;] = &#039;correct&#039;,&lt;br /&gt;
&lt;br /&gt;
Lua patterns are not REGEX though they are similar.  The escape character is &#039;%&#039;, not &#039;\&#039;.&lt;br /&gt;
For more information about Lua patterns, see: Extension:Scribunto/Lua_reference_manual#Patterns&lt;br /&gt;
&lt;br /&gt;
Patterns should probably always include the &#039;^&#039; and &#039;$&#039; anchor assertions to prevent a partial&lt;br /&gt;
match from incorrectly suggesting the wrong parameter name.  For instance, the pattern &#039;a[utho]+r&#039;&lt;br /&gt;
matches &#039;author&#039; in the no-longer-supported parameter |author-separator= so the code suggests&lt;br /&gt;
&#039;|author=&#039;; the same pattern also matches the no-longer-supported parameter |separator= (returning &#039;ator&#039;)&lt;br /&gt;
so again, the code suggests &#039;|author=&#039;.&lt;br /&gt;
&lt;br /&gt;
One capture is supported, typically the enumerator from an enumerated parameter (the &#039;6&#039; in |author6=, etc.)&lt;br /&gt;
The value from the capture replaces $1 in the &#039;correct&#039; value.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local patterns = {&lt;br /&gt;
	[&#039;^ac+es+ ?d?a?t?e?$&#039;] = &#039;access-date&#039;,										-- misspelling&lt;br /&gt;
	[&#039;^apellido[s]?(%d+)$&#039;] = &#039;last$1&#039;,											-- Spanish, enumerated&lt;br /&gt;
	[&#039;^a[utho]+r$&#039;] = &#039;author&#039;,													-- misspelling&lt;br /&gt;
	[&#039;^a[utho]+r(%d+)$&#039;] = &#039;author$1&#039;,											-- misspelling, enumerated&lt;br /&gt;
	[&#039;^author link(%d+)$&#039;] = &#039;author-link$1&#039;,									-- Polish, enumerated&lt;br /&gt;
	[&#039;^autor[e]?(%d+)$&#039;] = &#039;author$1&#039;,											-- Italian/Spanish/German, enumerated&lt;br /&gt;
	[&#039;^authorfirst(%d+)$&#039;] = &#039;author-first$1&#039;,									-- old parameter name, enumerated&lt;br /&gt;
	[&#039;^author(%d+)first$&#039;] = &#039;author-first$1&#039;,									-- old parameter name, enumerated&lt;br /&gt;
	[&#039;^authorgiven(%d+)$&#039;] = &#039;author-given$1&#039;,									-- old parameter name, enumerated&lt;br /&gt;
	[&#039;^author(%d+)given$&#039;] = &#039;author-given$1&#039;,									-- old parameter name, enumerated&lt;br /&gt;
	[&#039;^authorlast(%d+)$&#039;] = &#039;author-last$1&#039;,									-- old parameter name, enumerated&lt;br /&gt;
	[&#039;^author(%d+)last$&#039;] = &#039;author-last$1&#039;,									-- old parameter name, enumerated&lt;br /&gt;
	[&#039;^authormask(%d+)$&#039;] = &#039;author-mask$1&#039;,									-- old parameter name, enumerated&lt;br /&gt;
	[&#039;^author(%d+)mask$&#039;] = &#039;author-mask$1&#039;,									-- old parameter name, enumerated&lt;br /&gt;
	[&#039;^authorsurname(%d+)$&#039;] = &#039;author-surname$1&#039;,								-- old parameter name, enumerated&lt;br /&gt;
	[&#039;^author(%d+)surname$&#039;] = &#039;author-surname$1&#039;,								-- old parameter name, enumerated&lt;br /&gt;
	[&#039;^cognome(%d+)$&#039;] = &#039;last$1&#039;,												-- Italian, enumerated&lt;br /&gt;
	[&#039;^editorfirst(%d+)$&#039;] = &#039;editor-first$1&#039;,									-- old parameter name, enumerated&lt;br /&gt;
	[&#039;^editor(%d+)first$&#039;] = &#039;editor-first$1&#039;,									-- old parameter name, enumerated&lt;br /&gt;
	[&#039;^editorgiven(%d+)$&#039;] = &#039;editor-given$1&#039;,									-- old parameter name, enumerated&lt;br /&gt;
	[&#039;^editor(%d+)given$&#039;] = &#039;editor-given$1&#039;,									-- old parameter name, enumerated&lt;br /&gt;
	[&#039;^editorlast(%d+)$&#039;] = &#039;editor-last$1&#039;,									-- old parameter name, enumerated&lt;br /&gt;
	[&#039;^editor(%d+)last$&#039;] = &#039;editor-last$1&#039;,									-- old parameter name, enumerated&lt;br /&gt;
	[&#039;^editorlink(%d+)$&#039;] = &#039;editor-link$1&#039;,									-- old parameter name, enumerated&lt;br /&gt;
	[&#039;^editor(%d+)link$&#039;] = &#039;editor-link$1&#039;,									-- old parameter name, enumerated&lt;br /&gt;
	[&#039;^editormask(%d+)$&#039;] = &#039;editor-mask$1&#039;,									-- old parameter name, enumerated&lt;br /&gt;
	[&#039;^editor(%d+)mask$&#039;] = &#039;editor-mask$1&#039;,									-- old parameter name, enumerated&lt;br /&gt;
	[&#039;^editorsurname(%d+)$&#039;] = &#039;editor-surname$1&#039;,								-- old parameter name, enumerated&lt;br /&gt;
	[&#039;^editor(%d+)surname$&#039;] = &#039;editor-surname$1&#039;,								-- old parameter name, enumerated&lt;br /&gt;
	[&#039;^enlaceautore(%d+)$&#039;] = &#039;author-link$1&#039;,									-- Spanish, enumerated&lt;br /&gt;
	[&#039;^first (%d+)$&#039;] = &#039;first$1&#039;,												-- enumerated&lt;br /&gt;
	[&#039;^last (%d+)$&#039;] = &#039;last$1&#039;,												-- enumerated&lt;br /&gt;
	[&#039;^nom[e]?(%d+)$&#039;] = &#039;last$1&#039;,												-- Italian/French, enumerated&lt;br /&gt;
	[&#039;^nombre(%d+)$&#039;] = &#039;first$1&#039;,												-- Spanish, enumerated&lt;br /&gt;
	[&#039;^primero(%d+)$&#039;] = &#039;first$1&#039;,												-- Spanish, enumerated&lt;br /&gt;
	[&#039;^pu[blish]+ers?$&#039;] = &#039;publisher&#039;,											-- misspelling&lt;br /&gt;
	[&#039;^subjectlink(%d+)$&#039;] = &#039;subject-link$1&#039;,									-- old parameter name, enumerated&lt;br /&gt;
	[&#039;^subject(%d+)link$&#039;] = &#039;subject-link$1&#039;,									-- old parameter name, enumerated&lt;br /&gt;
	[&#039;^wkautore(%d+)$&#039;] = &#039;author-link$1&#039;,										-- Italian, enumerated&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
return {suggestions = suggestions, patterns=patterns};&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Module:Citation/CS1/Date_validation&amp;diff=6669</id>
		<title>Module:Citation/CS1/Date validation</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Module:Citation/CS1/Date_validation&amp;diff=6669"/>
		<updated>2025-11-01T21:42:59Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[--------------------------&amp;lt; F O R W A R D   D E C L A R A T I O N S &amp;gt;--------------------------------------&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local add_prop_cat, is_set, in_array, set_message, substitute, wrap_style;		-- imported functions from selected Module:Citation/CS1/Utilities&lt;br /&gt;
local cfg;																		-- table of tables imported from selected Module:Citation/CS1/Configuration&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; F I L E - S C O P E   D E C L A R A T I O N S &amp;gt;--------------------------------&lt;br /&gt;
&lt;br /&gt;
File-scope variables are declared here&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local lang_object = mw.getContentLanguage();									-- used by is_valid_accessdate(), is_valid_year(), date_name_xlate(); TODO: move to ~/Configuration?&lt;br /&gt;
local year_limit;																-- used by is_valid_year()&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[=[-------------------------&amp;lt; I S _ V A L I D _ A C C E S S D A T E &amp;gt;----------------------------------------&lt;br /&gt;
&lt;br /&gt;
returns true if:&lt;br /&gt;
	Wikipedia start date &amp;lt;= accessdate &amp;lt; today + 2 days&lt;br /&gt;
&lt;br /&gt;
Wikipedia start date is 2001-01-15T00:00:00 UTC which is 979516800 seconds after 1970-01-01T00:00:00 UTC (the start of Unix time)&lt;br /&gt;
accessdate is the date provided in |access-date= at time 00:00:00 UTC&lt;br /&gt;
today is the current date at time 00:00:00 UTC plus 48 hours&lt;br /&gt;
	if today is 2015-01-01T00:00:00 then&lt;br /&gt;
		adding 24 hours gives 2015-01-02T00:00:00 – one second more than today&lt;br /&gt;
		adding 24 hours gives 2015-01-03T00:00:00 – one second more than tomorrow&lt;br /&gt;
&lt;br /&gt;
This function does not work if it is fed month names for languages other than English.  Wikimedia #time: parser&lt;br /&gt;
apparently doesn&#039;t understand non-English date month names. This function will always return false when the date&lt;br /&gt;
contains a non-English month name because good1 is false after the call to lang.formatDate().  To get around that&lt;br /&gt;
call this function with YYYY-MM-DD format dates.&lt;br /&gt;
&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
local function is_valid_accessdate (accessdate)&lt;br /&gt;
	local good1, good2;&lt;br /&gt;
	local access_ts, tomorrow_ts;												-- to hold Unix time stamps representing the dates&lt;br /&gt;
&lt;br /&gt;
	good1, access_ts = pcall (lang_object.formatDate, lang_object, &#039;U&#039;, accessdate );			-- convert accessdate value to Unix timestamp &lt;br /&gt;
	good2, tomorrow_ts = pcall (lang_object.formatDate, lang_object, &#039;U&#039;, &#039;today + 2 days&#039; );	-- today midnight + 2 days is one second more than all day tomorrow&lt;br /&gt;
	&lt;br /&gt;
	if good1 and good2 then														-- lang.formatDate() returns a timestamp in the local script which which tonumber() may not understand&lt;br /&gt;
		access_ts = tonumber (access_ts) or lang_object:parseFormattedNumber (access_ts);		-- convert to numbers for the comparison;&lt;br /&gt;
		tomorrow_ts = tonumber (tomorrow_ts) or lang_object:parseFormattedNumber (tomorrow_ts);&lt;br /&gt;
	else&lt;br /&gt;
		return false;															-- one or both failed to convert to Unix time stamp&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if 979516800 &amp;lt;= access_ts and access_ts &amp;lt; tomorrow_ts then					-- Wikipedia start date &amp;lt;= accessdate &amp;lt; tomorrow&#039;s date&lt;br /&gt;
		return true;&lt;br /&gt;
	else&lt;br /&gt;
		return false;															-- accessdate out of range&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; G E T _ M O N T H _ N U M B E R &amp;gt;----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
returns a number according to the month in a date: 1 for January, etc.  Capitalization and spelling must be correct.&lt;br /&gt;
If not a valid month, returns 0&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function get_month_number (month)&lt;br /&gt;
	return cfg.date_names[&#039;local&#039;].long[month] or cfg.date_names[&#039;local&#039;].short[month] or	-- look for local names first&lt;br /&gt;
			cfg.date_names[&#039;en&#039;].long[month] or	cfg.date_names[&#039;en&#039;].short[month] or		-- failing that, look for English names&lt;br /&gt;
			0;																				-- not a recognized month name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; G E T _ S E A S O N _ N U M B E R &amp;gt;--------------------------------------------&lt;br /&gt;
&lt;br /&gt;
returns a number according to the sequence of seasons in a year: 21 for Spring, etc.  Capitalization and spelling&lt;br /&gt;
must be correct. If not a valid season, returns 0.&lt;br /&gt;
	21-24 = Spring, Summer, Autumn, Winter, independent of “Hemisphere”&lt;br /&gt;
&lt;br /&gt;
returns 0 when &amp;lt;param&amp;gt; is not |date=&lt;br /&gt;
&lt;br /&gt;
Season numbering is defined by Extended Date/Time Format (EDTF) specification (https://www.loc.gov/standards/datetime/)&lt;br /&gt;
which became part of ISO 8601 in 2019.  See &#039;§Sub-year groupings&#039;.  The standard defines various divisions using&lt;br /&gt;
numbers 21-41.  cs1|2 only supports generic seasons.  EDTF does support the distinction between north and south&lt;br /&gt;
hemisphere seasons but cs1|2 has no way to make that distinction.&lt;br /&gt;
&lt;br /&gt;
These additional divisions not currently supported:&lt;br /&gt;
	25-28 = Spring - Northern Hemisphere, Summer- Northern Hemisphere, Autumn - Northern Hemisphere, Winter - Northern Hemisphere&lt;br /&gt;
	29-32 = Spring – Southern Hemisphere, Summer– Southern Hemisphere, Autumn – Southern Hemisphere, Winter - Southern Hemisphere&lt;br /&gt;
	33-36 = Quarter 1, Quarter 2, Quarter 3, Quarter 4 (3 months each)&lt;br /&gt;
	37-39 = Quadrimester 1, Quadrimester 2, Quadrimester 3 (4 months each)&lt;br /&gt;
	40-41 = Semestral 1, Semestral-2 (6 months each)&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function get_season_number (season, param)&lt;br /&gt;
	if &#039;date&#039; ~= param then&lt;br /&gt;
		return 0;																-- season dates only supported by |date=&lt;br /&gt;
	end&lt;br /&gt;
	return cfg.date_names[&#039;local&#039;].season[season] or							-- look for local names first&lt;br /&gt;
			cfg.date_names[&#039;en&#039;].season[season] or								-- failing that, look for English names&lt;br /&gt;
			0;																	-- not a recognized season name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; G E T _ Q U A R T E R _ N U M B E R &amp;gt;------------------------------------------&lt;br /&gt;
&lt;br /&gt;
returns a number according to the sequence of quarters in a year: 33 for first quarter, etc.  Capitalization and spelling&lt;br /&gt;
must be correct. If not a valid quarter, returns 0.&lt;br /&gt;
	33-36 = Quarter 1, Quarter 2, Quarter 3, Quarter 4 (3 months each)&lt;br /&gt;
&lt;br /&gt;
returns 0 when &amp;lt;param&amp;gt; is not |date=&lt;br /&gt;
&lt;br /&gt;
Quarter numbering is defined by Extended Date/Time Format (EDTF) specification (https://www.loc.gov/standards/datetime/)&lt;br /&gt;
which became part of ISO 8601 in 2019.  See &#039;§Sub-year groupings&#039;.  The standard defines various divisions using&lt;br /&gt;
numbers 21-41.  cs1|2 only supports generic seasons and quarters.&lt;br /&gt;
&lt;br /&gt;
These additional divisions not currently supported:&lt;br /&gt;
	37-39 = Quadrimester 1, Quadrimester 2, Quadrimester 3 (4 months each)&lt;br /&gt;
	40-41 = Semestral 1, Semestral-2 (6 months each)&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function get_quarter_number (quarter, param)&lt;br /&gt;
	if &#039;date&#039; ~= param then&lt;br /&gt;
		return 0;																-- quarter dates only supported by |date=&lt;br /&gt;
	end&lt;br /&gt;
	quarter = mw.ustring.gsub (quarter, &#039; +&#039;, &#039; &#039;);								-- special case replace multiple space chars with a single space char&lt;br /&gt;
	return cfg.date_names[&#039;local&#039;].quarter[quarter] or							-- look for local names first&lt;br /&gt;
			cfg.date_names[&#039;en&#039;].quarter[quarter] or							-- failing that, look for English names&lt;br /&gt;
			0;																	-- not a recognized quarter name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; G E T _ P R O P E R _ N A M E _ N U M B E R &amp;gt;----------------------------------&lt;br /&gt;
&lt;br /&gt;
returns a non-zero number if date contains a recognized proper-name.  Capitalization and spelling must be correct.&lt;br /&gt;
&lt;br /&gt;
returns 0 when &amp;lt;param&amp;gt; is not |date=&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function get_proper_name_number (name, param)&lt;br /&gt;
	if &#039;date&#039; ~= param then&lt;br /&gt;
		return 0;																-- proper-name dates only supported by |date=&lt;br /&gt;
	end&lt;br /&gt;
	return cfg.date_names[&#039;local&#039;].named[name] or								-- look for local names dates first&lt;br /&gt;
			cfg.date_names[&#039;en&#039;].named[name] or									-- failing that, look for English names&lt;br /&gt;
			0;																	-- not a recognized named date&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; G E T _ E L E M E N T _ N U M B E R &amp;lt;------------------------------------------&lt;br /&gt;
&lt;br /&gt;
returns true if month or season or quarter or proper name is valid (properly spelled, capitalized, abbreviated)&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function get_element_number (element, param)&lt;br /&gt;
	local num;&lt;br /&gt;
	&lt;br /&gt;
	local funcs = {get_month_number, get_season_number, get_quarter_number, get_proper_name_number};	-- list of functions to execute in order&lt;br /&gt;
	&lt;br /&gt;
	for _, func in ipairs (funcs) do											-- spin through the function list&lt;br /&gt;
		num = func (element, param);											-- call the function and get the returned number&lt;br /&gt;
		if 0 ~= num then														-- non-zero when valid month season quarter &lt;br /&gt;
			return num;															-- return that number&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return nil;																	-- not valid&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S _ V A L I D _ Y E A R &amp;gt;----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Function gets current year from the server and compares it to year from a citation parameter.  Years more than one&lt;br /&gt;
year in the future are not acceptable.&lt;br /&gt;
&lt;br /&gt;
Special case for |pmc-embargo-date=: years more than two years in the future are not acceptable&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function is_valid_year (year, param)&lt;br /&gt;
	if not is_set (year_limit) then&lt;br /&gt;
		year_limit = tonumber(os.date(&amp;quot;%Y&amp;quot;))+1;									-- global variable so we only have to fetch it once&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	year = tonumber (year) or lang_object:parseFormattedNumber (year);			-- convert to number for the comparison&lt;br /&gt;
	if year and (100 &amp;gt; year) then												-- years less than 100 not supported&lt;br /&gt;
		return false;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if &#039;pmc-embargo-date&#039; == param then											-- special case for |pmc-embargo-date=&lt;br /&gt;
		return year and (year &amp;lt;= tonumber(os.date(&amp;quot;%Y&amp;quot;))+2) or false;			-- years more than two years in the future are not accepted&lt;br /&gt;
	end	&lt;br /&gt;
	return year and (year &amp;lt;= year_limit) or false;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S _ V A L I D _ D A T E &amp;gt;----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Returns true if day is less than or equal to the number of days in month and year is no farther into the future&lt;br /&gt;
than next year; else returns false.&lt;br /&gt;
&lt;br /&gt;
Assumes Julian calendar prior to year 1582 and Gregorian calendar thereafter. Accounts for Julian calendar leap&lt;br /&gt;
years before 1582 and Gregorian leap years after 1582. Where the two calendars overlap (1582 to approximately&lt;br /&gt;
1923) dates are assumed to be Gregorian.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function is_valid_date (year, month, day, param)&lt;br /&gt;
local days_in_month = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};&lt;br /&gt;
local month_length;&lt;br /&gt;
	if not is_valid_year (year, param) then										-- no farther into the future than next year except |pmc-embargo-date= no more than two years in the future&lt;br /&gt;
		return false;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	month = tonumber (month);													-- required for YYYY-MM-DD dates&lt;br /&gt;
	&lt;br /&gt;
	if (2 == month) then														-- if February&lt;br /&gt;
		month_length = 28;														-- then 28 days unless&lt;br /&gt;
		if 1582 &amp;gt; tonumber(year) then											-- Julian calendar&lt;br /&gt;
			if 0 == (year%4) then												-- is a leap year?&lt;br /&gt;
				month_length = 29;												-- if leap year then 29 days in February&lt;br /&gt;
			end&lt;br /&gt;
		else																	-- Gregorian calendar&lt;br /&gt;
			if (0 == (year%4) and (0 ~= (year%100) or 0 == (year%400))) then	-- is a leap year?&lt;br /&gt;
				month_length = 29;												-- if leap year then 29 days in February&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		month_length = days_in_month[month];&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if tonumber (day) &amp;gt; month_length then&lt;br /&gt;
		return false;&lt;br /&gt;
	end&lt;br /&gt;
	return true;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S _ V A L I D _ M O N T H _ R A N G E _ S T Y L E &amp;gt;--------------------------&lt;br /&gt;
&lt;br /&gt;
Months in a range are expected to have the same style: Jan–Mar or October–December but not February–Mar or Jul–August. &lt;br /&gt;
This function looks in cfg.date_names{} to see if both month names are listed in the long subtable or both are&lt;br /&gt;
listed in the short subtable.  When both have the same style (both are listed in the same table), returns true; false else&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function is_valid_month_range_style (month1, month2)&lt;br /&gt;
	if (cfg.date_names.en.long[month1] and cfg.date_names.en.long[month2]) or					-- are both English names listed in the long subtable?&lt;br /&gt;
		(cfg.date_names.en.short[month1] and cfg.date_names.en.short[month2]) or				-- are both English names listed in the short subtable?&lt;br /&gt;
		(cfg.date_names[&#039;local&#039;].long[month1] and cfg.date_names[&#039;local&#039;].long[month2]) or		-- are both local names listed in the long subtable?&lt;br /&gt;
		(cfg.date_names[&#039;local&#039;].short[month1] and cfg.date_names[&#039;local&#039;].short[month2]) then	-- are both local names listed in the short subtable?&lt;br /&gt;
			return true;&lt;br /&gt;
	end&lt;br /&gt;
	return false;																-- names are mixed&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S _ V A L I D _ M O N T H _ S E A S O N _ R A N G E &amp;gt;------------------------&lt;br /&gt;
&lt;br /&gt;
Check a pair of months or seasons to see if both are valid members of a month or season pair.&lt;br /&gt;
&lt;br /&gt;
Month pairs are expected to be left to right, earliest to latest in time.&lt;br /&gt;
&lt;br /&gt;
All season ranges are accepted as valid because there are publishers out there who have published a Summer–Spring YYYY issue, hence treat as ok&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function is_valid_month_season_range(range_start, range_end, param)&lt;br /&gt;
	local range_start_number = get_month_number (range_start);&lt;br /&gt;
	local range_end_number;&lt;br /&gt;
&lt;br /&gt;
	if 0 == range_start_number then												-- is this a month range?&lt;br /&gt;
		range_start_number = get_season_number (range_start, param);			-- not a month; is it a season? get start season number&lt;br /&gt;
		range_end_number = get_season_number (range_end, param);				-- get end season number&lt;br /&gt;
&lt;br /&gt;
		if (0 ~= range_start_number) and (0 ~= range_end_number) and (range_start_number ~= range_end_number) then&lt;br /&gt;
			return true;														-- any season pairing is accepted except when both are the same&lt;br /&gt;
		end&lt;br /&gt;
		return false;															-- range_start and/or range_end is not a season&lt;br /&gt;
	end&lt;br /&gt;
																				-- here when range_start is a month&lt;br /&gt;
	range_end_number = get_month_number (range_end);							-- get end month number&lt;br /&gt;
	if range_start_number &amp;lt; range_end_number and								-- range_start is a month; does range_start precede range_end?&lt;br /&gt;
		is_valid_month_range_style (range_start, range_end) then				-- do months have the same style?&lt;br /&gt;
			return true;														-- proper order and same style&lt;br /&gt;
	end&lt;br /&gt;
	return false;																-- range_start month number is greater than or equal to range end number; or range end isn&#039;t a month&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; M A K E _ C O I N S _ D A T E &amp;gt;------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
This function receives a table of date parts for one or two dates and an empty table reference declared in&lt;br /&gt;
Module:Citation/CS1.  The function is called only for |date= parameters and only if the |date=&amp;lt;value&amp;gt; is &lt;br /&gt;
determined to be a valid date format.  The question of what to do with invalid date formats is not answered here.&lt;br /&gt;
&lt;br /&gt;
The date parts in the input table are converted to an ISO 8601 conforming date string:&lt;br /&gt;
	single whole dates:		yyyy-mm-dd&lt;br /&gt;
	month and year dates:	yyyy-mm&lt;br /&gt;
	year dates:				yyyy&lt;br /&gt;
	ranges:					yyyy-mm-dd/yyyy-mm-dd&lt;br /&gt;
							yyyy-mm/yyyy-mm&lt;br /&gt;
							yyyy/yyyy&lt;br /&gt;
&lt;br /&gt;
Dates in the Julian calendar are reduced to year or year/year so that we don&#039;t have to do calendar conversion from&lt;br /&gt;
Julian to Proleptic Gregorian.&lt;br /&gt;
&lt;br /&gt;
The input table has:&lt;br /&gt;
	year, year2 – always present; if before 1582, ignore months and days if present&lt;br /&gt;
	month, month2 – 0 if not provided, 1-12 for months, 21-24 for seasons; 99 Christmas&lt;br /&gt;
	day, day2 –  0 if not provided, 1-31 for days&lt;br /&gt;
	&lt;br /&gt;
the output table receives:&lt;br /&gt;
	rftdate:	an ISO 8601 formatted date&lt;br /&gt;
	rftchron:	a free-form version of the date, usually without year which is in rftdate (season ranges and proper-name dates)&lt;br /&gt;
	rftssn:		one of four season keywords: winter, spring, summer, fall (lowercase)&lt;br /&gt;
	rftquarter:	one of four values: 1, 2, 3, 4&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function make_COinS_date (input, tCOinS_date)&lt;br /&gt;
	local date;																	-- one date or first date in a range&lt;br /&gt;
	local date2 = &#039;&#039;;															-- end of range date&lt;br /&gt;
	input.year = tonumber (input.year) or lang_object:parseFormattedNumber (input.year);	-- language-aware tonumber()&lt;br /&gt;
	input.year2 = tonumber (input.year2) or lang_object:parseFormattedNumber (input.year2);	-- COinS dates are pseudo-ISO 8601 so convert to Arabic numerals&lt;br /&gt;
&lt;br /&gt;
	if ((1582 == input.year) and (10 &amp;gt; tonumber(input.month))) or (1582 &amp;gt; input.year) then	-- if a Julian calendar date&lt;br /&gt;
		tCOinS_date.rftdate = tostring (input.year);							-- &amp;amp;rft.date gets year only&lt;br /&gt;
		return;																	-- done&lt;br /&gt;
	end&lt;br /&gt;
																				-- here for all forms of Gregorian dates&lt;br /&gt;
	if 20 &amp;lt; tonumber (input.month) then											-- if season, quarter, or proper-name date&lt;br /&gt;
		date = input.year;														-- &amp;amp;rft.date gets year only&lt;br /&gt;
		if 0 ~= input.year2 and input.year ~= input.year2 then					-- if a range, only the second year portion when not the same as range start year&lt;br /&gt;
			date = string.format (&#039;%.4d/%.4d&#039;, input.year, input.year2)			-- assemble the date range&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		local season = {[24] = &#039;winter&#039;, [21] = &#039;spring&#039;, [22] = &#039;summer&#039;, [23] = &#039;fall&#039;, [33] = &#039;1&#039;, [34] = &#039;2&#039;, [35] = &#039;3&#039;, [36] = &#039;4&#039;, [98] = &#039;Easter&#039;, [99] = &#039;Christmas&#039;};	-- seasons lowercase, no autumn; proper-names use title case&lt;br /&gt;
		if 0 == input.month2 then												-- single season, quarter, or proper-name date&lt;br /&gt;
			if 40 &amp;lt; tonumber(input.month) then&lt;br /&gt;
				tCOinS_date.rftchron = season[input.month];						-- proper-name date; used in journal metadata only&lt;br /&gt;
			elseif 30 &amp;lt; tonumber(input.month) then&lt;br /&gt;
				tCOinS_date.rftquarter = season[input.month];					-- quarter date; used in journal metadata only&lt;br /&gt;
			else&lt;br /&gt;
				tCOinS_date.rftssn = season[input.month];						-- season date; used in journal metadata only&lt;br /&gt;
			end&lt;br /&gt;
		else																	-- season ranges are lumped into &amp;amp;rft.chron; &amp;amp;rft.ssn and &amp;amp;rft.quarter are left blank&lt;br /&gt;
			if input.year ~= input.year2 then									-- season year – season year range or season year–year&lt;br /&gt;
				if 0 ~= input.month2 then&lt;br /&gt;
					tCOinS_date.rftchron = string.format (&#039;%s %s – %s %s&#039;, season[input.month], input.year, season[input.month2], input.year2);	-- used in journal metadata only&lt;br /&gt;
				end&lt;br /&gt;
			else																-- season–season year range&lt;br /&gt;
				tCOinS_date.rftchron = season[input.month] .. &#039;–&#039; .. season[input.month2];	-- season–season year range; used in journal metadata only&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		tCOinS_date.rftdate = tostring (date);&lt;br /&gt;
		return;																	-- done&lt;br /&gt;
	end&lt;br /&gt;
																				-- here for gregorian calendar dates&lt;br /&gt;
	if 0 ~= input.day then&lt;br /&gt;
		date = string.format (&#039;%s-%.2d-%.2d&#039;, input.year, tonumber(input.month), tonumber(input.day));	-- whole date&lt;br /&gt;
	elseif 0 ~= input.month then&lt;br /&gt;
		date = string.format (&#039;%s-%.2d&#039;, input.year, tonumber(input.month));	-- year and month&lt;br /&gt;
	else&lt;br /&gt;
		date = string.format (&#039;%s&#039;, input.year);								-- just year&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if 0 ~= input.year2 then&lt;br /&gt;
		if 0 ~= input.day2 then&lt;br /&gt;
			date2 = string.format (&#039;/%s-%.2d-%.2d&#039;, input.year2, tonumber(input.month2), tonumber(input.day2));		-- whole date&lt;br /&gt;
		elseif 0 ~= input.month2 then&lt;br /&gt;
			date2 = string.format (&#039;/%s-%.2d&#039;, input.year2, tonumber(input.month2));	-- year and month&lt;br /&gt;
		else&lt;br /&gt;
			date2 = string.format (&#039;/%s&#039;, input.year2);							-- just year&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	tCOinS_date.rftdate = date .. date2;										-- date2 has the &#039;/&#039; separator&lt;br /&gt;
	return;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; P A T T E R N S _ T &amp;gt;----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
this is the list of patterns for date formats that this module recognizes.  Approximately the first half of these&lt;br /&gt;
patterns represent formats that might be reformatted into another format.  Those that might be reformatted have&lt;br /&gt;
&#039;indicator&#039; letters that identify the content of the matching capture: &#039;d&#039; (day), &#039;m&#039; (month), &#039;a&#039; (anchor year),&lt;br /&gt;
&#039;y&#039; (year); second day, month, year have a &#039;2&#039; suffix.&lt;br /&gt;
&lt;br /&gt;
These patterns are used for both date validation and for reformatting.  This table should not be moved to ~/Configuration&lt;br /&gt;
because changes to this table require changes to check_date() and to reformatter() and reformat_date()&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local patterns_t = {&lt;br /&gt;
	 																			-- year-initial numerical year-month-day&lt;br /&gt;
	[&#039;ymd&#039;] = {&#039;^([1-9]%d%d%d)%-(%d%d)%-(%d%d)$&#039;, &#039;y&#039;, &#039;m&#039;, &#039;d&#039;},					&lt;br /&gt;
																				-- month-initial: month day, year&lt;br /&gt;
	[&#039;Mdy&#039;] = {&#039;^(%D-) +([1-9]%d?), +(([1-9]%d%d%d?)%a?)$&#039;, &#039;m&#039;, &#039;d&#039;, &#039;a&#039;, &#039;y&#039;},&lt;br /&gt;
																				-- month-initial day range: month day–day, year; days are separated by endash&lt;br /&gt;
	[&#039;Md-dy&#039;] = {&#039;^(%D-) +([1-9]%d?)[%-–]([1-9]%d?), +(([1-9]%d%d%d?)%a?)$&#039;, &#039;m&#039;, &#039;d&#039;, &#039;d2&#039;, &#039;a&#039;, &#039;y&#039;},&lt;br /&gt;
																				-- day-initial: day month year&lt;br /&gt;
	[&#039;dMy&#039;] = {&#039;^([1-9]%d?) +(%D-) +(([1-9]%d%d%d?)%a?)$&#039;, &#039;d&#039;, &#039;m&#039;, &#039;a&#039;, &#039;y&#039;},&lt;br /&gt;
																				-- year-initial: year month day; day: 1 or 2 two digits, leading zero allowed; not supported at en.wiki&lt;br /&gt;
	--	[&#039;yMd&#039;] = {&#039;^(([1-9]%d%d%d?)%a?) +(%D-) +(%d%d?)$&#039;, &#039;a&#039;, &#039;y&#039;, &#039;m&#039;, &#039;d&#039;},&lt;br /&gt;
																				-- day-range-initial: day–day month year; days are separated by endash&lt;br /&gt;
	[&#039;d-dMy&#039;] = {&#039;^([1-9]%d?)[%-–]([1-9]%d?) +(%D-) +(([1-9]%d%d%d?)%a?)$&#039;, &#039;d&#039;, &#039;d2&#039;, &#039;m&#039;, &#039;a&#039;, &#039;y&#039;},&lt;br /&gt;
																				-- day initial month-day-range: day month - day month year; uses spaced endash&lt;br /&gt;
	[&#039;dM-dMy&#039;] = {&#039;^([1-9]%d?) +(%D-) +[%-–] +([1-9]%d?) +(%D-) +(([1-9]%d%d%d?)%a?)$&#039;, &#039;d&#039;, &#039;m&#039;, &#039;d2&#039;, &#039;m2&#039;, &#039;a&#039;, &#039;y&#039;},&lt;br /&gt;
																				-- month initial month-day-range: month day – month day, year;  uses spaced endash&lt;br /&gt;
	[&#039;Md-Mdy&#039;] = {&#039;^(%D-) +([1-9]%d?) +[%-–] +(%D-) +([1-9]%d?), +(([1-9]%d%d%d?)%a?)$&#039;,&#039;m&#039;, &#039;d&#039;, &#039;m2&#039;, &#039;d2&#039;, &#039;a&#039;, &#039;y&#039;},&lt;br /&gt;
																				-- day initial month-day-year-range: day month year - day month year; uses spaced endash&lt;br /&gt;
	[&#039;dMy-dMy&#039;] = {&#039;^([1-9]%d?) +(%D-) +([1-9]%d%d%d?) +[%-–] +([1-9]%d?) +(%D-) +(([1-9]%d%d%d?)%a?)$&#039;, &#039;d&#039;, &#039;m&#039;, &#039;y&#039;, &#039;d2&#039;, &#039;m2&#039;, &#039;a&#039;, &#039;y2&#039;},&lt;br /&gt;
																				-- month initial month-day-year-range: month day, year – month day, year;  uses spaced endash&lt;br /&gt;
	[&#039;Mdy-Mdy&#039;] = {&#039;^(%D-) +([1-9]%d?), +([1-9]%d%d%d?) +[%-–] +(%D-) +([1-9]%d?), +(([1-9]%d%d%d?)%a?)$&#039;, &#039;m&#039;, &#039;d&#039;, &#039;y&#039;, &#039;m2&#039;, &#039;d2&#039;, &#039;a&#039;, &#039;y2&#039;},&lt;br /&gt;
&lt;br /&gt;
																				-- these date formats cannot be converted, per se, but month name can be rendered short or long&lt;br /&gt;
																				-- month/season year - month/season year; separated by spaced endash&lt;br /&gt;
	[&#039;My-My&#039;] = {&#039;^(%D-) +([1-9]%d%d%d?) +[%-–] +(%D-) +(([1-9]%d%d%d?)%a?)$&#039;, &#039;m&#039;, &#039;y&#039;, &#039;m2&#039;, &#039;a&#039;, &#039;y2&#039;},&lt;br /&gt;
																				-- month/season range year; months separated by endash&lt;br /&gt;
	[&#039;M-My&#039;] = {&#039;^(%D-)[%-–](%D-) +(([1-9]%d%d%d?)%a?)$&#039;, &#039;m&#039;, &#039;m2&#039;, &#039;a&#039;, &#039;y&#039;},&lt;br /&gt;
																				-- month/season year or proper-name year; quarter year when First Quarter YYYY etc.&lt;br /&gt;
	[&#039;My&#039;] = {&#039;^([^%d–]-) +(([1-9]%d%d%d?)%a?)$&#039;, &#039;m&#039;, &#039;a&#039;, &#039;y&#039;},					-- this way because endash is a member of %D; %D- will match January–March 2019 when it shouldn&#039;t&lt;br /&gt;
&lt;br /&gt;
																				-- these date formats cannot be converted&lt;br /&gt;
	[&#039;Sy4-y2&#039;] = {&#039;^(%D-) +(([1-9]%d)%d%d)[%-–]((%d%d)%a?)$&#039;},						-- special case Winter/Summer year-year (YYYY-YY); year separated with unspaced endash&lt;br /&gt;
	[&#039;Sy-y&#039;] = {&#039;^(%D-) +([1-9]%d%d%d?)[%-–](([1-9]%d%d%d?)%a?)$&#039;},					-- special case Winter/Summer year-year; year separated with unspaced endash&lt;br /&gt;
	[&#039;y-y&#039;] = {&#039;^([1-9]%d%d%d?)[%-–](([1-9]%d%d%d?)%a?)$&#039;},							-- year range: YYY-YYY or YYY-YYYY or YYYY–YYYY; separated by unspaced endash; 100-9999&lt;br /&gt;
	[&#039;y4-y2&#039;] = {&#039;^(([1-9]%d)%d%d)[%-–]((%d%d)%a?)$&#039;},								-- year range: YYYY–YY; separated by unspaced endash&lt;br /&gt;
	[&#039;y&#039;] = {&#039;^(([1-9]%d%d%d?)%a?)$&#039;},												-- year; here accept either YYY or YYYY&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S _ V A L I D _ E M B A R G O _ D A T E &amp;gt;------------------------------------&lt;br /&gt;
&lt;br /&gt;
returns true and date value if that value has proper dmy, mdy, ymd format.&lt;br /&gt;
&lt;br /&gt;
returns false and 9999 (embargoed forever) when date value is not proper format; assumes that when |pmc-embargo-date= is&lt;br /&gt;
set, the editor intended to embargo a PMC but |pmc-embargo-date= does not hold a single date.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function is_valid_embargo_date (v)&lt;br /&gt;
	if v:match (patterns_t[&#039;ymd&#039;][1]) or										-- ymd&lt;br /&gt;
		v:match (patterns_t[&#039;Mdy&#039;][1]) or										-- dmy&lt;br /&gt;
		v:match (patterns_t[&#039;dMy&#039;][1]) then										-- mdy&lt;br /&gt;
			return true, v;&lt;br /&gt;
	end&lt;br /&gt;
	return false, &#039;9999&#039;;														-- if here not good date so return false and set embargo date to long time in future&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; C H E C K _ D A T E &amp;gt;----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Check date format to see that it is one of the formats approved by WP:DATESNO or WP:DATERANGE. Exception: only&lt;br /&gt;
allowed range separator is endash.  Additionally, check the date to see that it is a real date: no 31 in 30-day&lt;br /&gt;
months; no 29 February when not a leap year.  Months, both long-form and three character abbreviations, and seasons&lt;br /&gt;
must be spelled correctly.  Future years beyond next year are not allowed.&lt;br /&gt;
&lt;br /&gt;
If the date fails the format tests, this function returns false and does not return values for anchor_year and&lt;br /&gt;
COinS_date.  When this happens, the date parameter is (DEBUG: not?) used in the COinS metadata and the CITEREF identifier gets&lt;br /&gt;
its year from the year parameter if present otherwise CITEREF does not get a date value.&lt;br /&gt;
&lt;br /&gt;
Inputs:&lt;br /&gt;
	date_string - date string from date-holding parameters (date, year, publication-date, access-date, pmc-embargo-date, archive-date, lay-date)&lt;br /&gt;
&lt;br /&gt;
Returns:&lt;br /&gt;
	false if date string is not a real date; else&lt;br /&gt;
	true, anchor_year, COinS_date&lt;br /&gt;
		anchor_year can be used in CITEREF anchors&lt;br /&gt;
		COinS_date is ISO 8601 format date; see make_COInS_date()&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function check_date (date_string, param, tCOinS_date)&lt;br /&gt;
	local year;																	-- assume that year2, months, and days are not used;&lt;br /&gt;
	local year2 = 0;															-- second year in a year range&lt;br /&gt;
	local month = 0;&lt;br /&gt;
	local month2 = 0;															-- second month in a month range&lt;br /&gt;
	local day = 0;&lt;br /&gt;
	local day2 = 0;																-- second day in a day range&lt;br /&gt;
	local anchor_year;&lt;br /&gt;
	local coins_date;&lt;br /&gt;
&lt;br /&gt;
	if date_string:match (patterns_t[&#039;ymd&#039;][1]) then							-- year-initial numerical year month day format&lt;br /&gt;
		year, month, day = date_string:match (patterns_t[&#039;ymd&#039;][1]);&lt;br /&gt;
		if 12 &amp;lt; tonumber(month) or 1 &amp;gt; tonumber(month) or 1582 &amp;gt; tonumber(year) or 0 == tonumber(day) then return false; end	-- month or day number not valid or not Gregorian calendar&lt;br /&gt;
		anchor_year = year;&lt;br /&gt;
	&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;Mdy&#039;][1]) then				-- month-initial: month day, year&lt;br /&gt;
		month, day, anchor_year, year = mw.ustring.match(date_string, patterns_t[&#039;Mdy&#039;][1]);&lt;br /&gt;
		month = get_month_number (month);&lt;br /&gt;
		if 0 == month then return false; end									-- return false if month text isn&#039;t one of the twelve months&lt;br /&gt;
				&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;Md-dy&#039;][1]) then			-- month-initial day range: month day–day, year; days are separated by endash&lt;br /&gt;
		month, day, day2, anchor_year, year = mw.ustring.match(date_string, patterns_t[&#039;Md-dy&#039;][1]);&lt;br /&gt;
		if tonumber(day) &amp;gt;= tonumber(day2) then return false; end				-- date range order is left to right: earlier to later; dates may not be the same;&lt;br /&gt;
		month = get_month_number (month);&lt;br /&gt;
		if 0 == month then return false; end									-- return false if month text isn&#039;t one of the twelve months&lt;br /&gt;
		month2=month;															-- for metadata&lt;br /&gt;
		year2 = year;&lt;br /&gt;
&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;dMy&#039;][1]) then				-- day-initial: day month year&lt;br /&gt;
		day, month, anchor_year, year = mw.ustring.match(date_string, patterns_t[&#039;dMy&#039;][1]);&lt;br /&gt;
		month = get_month_number (month);&lt;br /&gt;
		if 0 == month then return false; end									-- return false if month text isn&#039;t one of the twelve months&lt;br /&gt;
&lt;br /&gt;
--[[ NOT supported at en.wiki&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;yMd&#039;][1]) then				-- year-initial: year month day; day: 1 or 2 two digits, leading zero allowed&lt;br /&gt;
		anchor_year, year, month, day = mw.ustring.match(date_string, patterns_t[&#039;yMd&#039;][1]);&lt;br /&gt;
		month = get_month_number (month);&lt;br /&gt;
		if 0 == month then return false; end									-- return false if month text isn&#039;t one of the twelve months&lt;br /&gt;
-- end NOT supported at en.wiki ]]&lt;br /&gt;
&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;d-dMy&#039;][1]) then			-- day-range-initial: day–day month year; days are separated by endash&lt;br /&gt;
		day, day2, month, anchor_year, year = mw.ustring.match(date_string, patterns_t[&#039;d-dMy&#039;][1]);&lt;br /&gt;
		if tonumber(day) &amp;gt;= tonumber(day2) then return false; end				-- date range order is left to right: earlier to later; dates may not be the same;&lt;br /&gt;
		month = get_month_number (month);&lt;br /&gt;
		if 0 == month then return false; end									-- return false if month text isn&#039;t one of the twelve months&lt;br /&gt;
		month2 = month;															-- for metadata&lt;br /&gt;
		year2 = year;&lt;br /&gt;
&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;dM-dMy&#039;][1]) then			-- day initial month-day-range: day month - day month year; uses spaced endash&lt;br /&gt;
		day, month, day2, month2, anchor_year, year = mw.ustring.match(date_string, patterns_t[&#039;dM-dMy&#039;][1]);&lt;br /&gt;
		if (not is_valid_month_season_range(month, month2)) or not is_valid_year(year) then return false; end	-- date range order is left to right: earlier to later;&lt;br /&gt;
		month = get_month_number (month);										-- for metadata&lt;br /&gt;
		month2 = get_month_number (month2);&lt;br /&gt;
		year2 = year;&lt;br /&gt;
&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;Md-Mdy&#039;][1]) then			-- month initial month-day-range: month day – month day, year; uses spaced endash&lt;br /&gt;
		month, day, month2, day2, anchor_year, year = mw.ustring.match(date_string, patterns_t[&#039;Md-Mdy&#039;][1]);&lt;br /&gt;
		if (not is_valid_month_season_range(month, month2, param)) or not is_valid_year(year) then return false; end&lt;br /&gt;
		month = get_month_number (month);										-- for metadata&lt;br /&gt;
		month2 = get_month_number (month2);&lt;br /&gt;
		year2 = year;&lt;br /&gt;
&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;dMy-dMy&#039;][1]) then			-- day initial month-day-year-range: day month year - day month year; uses spaced endash&lt;br /&gt;
		day, month, year, day2, month2, anchor_year, year2 = mw.ustring.match(date_string, patterns_t[&#039;dMy-dMy&#039;][1]);&lt;br /&gt;
		if tonumber(year2) &amp;lt;= tonumber(year) then return false; end				-- must be sequential years, left to right, earlier to later&lt;br /&gt;
		if not is_valid_year(year2) or not is_valid_month_range_style(month, month2) then return false; end		-- year2 no more than one year in the future; months same style&lt;br /&gt;
		month = get_month_number (month);										-- for metadata&lt;br /&gt;
		month2 = get_month_number (month2);&lt;br /&gt;
		if 0 == month or 0 == month2 then return false; end						-- both must be valid&lt;br /&gt;
&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;Mdy-Mdy&#039;][1]) then			-- month initial month-day-year-range: month day, year – month day, year; uses spaced endash&lt;br /&gt;
		month, day, year, month2, day2, anchor_year, year2 = mw.ustring.match(date_string, patterns_t[&#039;Mdy-Mdy&#039;][1]);&lt;br /&gt;
		if tonumber(year2) &amp;lt;= tonumber(year) then return false; end				-- must be sequential years, left to right, earlier to later&lt;br /&gt;
		if not is_valid_year(year2) or not is_valid_month_range_style(month, month2) then return false; end		-- year2 no more than one year in the future; months same style&lt;br /&gt;
		month = get_month_number (month);										-- for metadata&lt;br /&gt;
		month2 = get_month_number(month2);&lt;br /&gt;
		if 0 == month or 0 == month2 then return false; end						-- both must be valid&lt;br /&gt;
&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;Sy4-y2&#039;][1]) then			-- special case Winter/Summer year-year (YYYY-YY); year separated with unspaced endash&lt;br /&gt;
		local century;&lt;br /&gt;
		month, year, century, anchor_year, year2 = mw.ustring.match(date_string, patterns_t[&#039;Sy4-y2&#039;][1]);&lt;br /&gt;
		if &#039;Winter&#039; ~= month and &#039;Summer&#039; ~= month then return false end;		-- &#039;month&#039; can only be Winter or Summer&lt;br /&gt;
		anchor_year = year .. &#039;–&#039; .. anchor_year;								-- assemble anchor_year from both years&lt;br /&gt;
		year2 = century..year2;													-- add the century to year2 for comparisons&lt;br /&gt;
		if 1 ~= tonumber(year2) - tonumber(year) then return false; end			-- must be sequential years, left to right, earlier to later&lt;br /&gt;
		if not is_valid_year(year2) then return false; end						-- no year farther in the future than next year&lt;br /&gt;
		month = get_season_number(month, param);&lt;br /&gt;
&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;Sy-y&#039;][1]) then			-- special case Winter/Summer year-year; year separated with unspaced endash&lt;br /&gt;
		month, year, anchor_year, year2 = mw.ustring.match(date_string, patterns_t[&#039;Sy-y&#039;][1]);&lt;br /&gt;
		month = get_season_number (month, param);								-- &amp;lt;month&amp;gt; can only be winter or summer; also for metadata&lt;br /&gt;
		if (month ~= cfg.date_names[&#039;en&#039;].season[&#039;Winter&#039;]) and (month ~= cfg.date_names[&#039;en&#039;].season[&#039;Summer&#039;]) then&lt;br /&gt;
			return false;														-- not Summer or Winter; abandon&lt;br /&gt;
		end&lt;br /&gt;
		anchor_year = year .. &#039;–&#039; .. anchor_year;								-- assemble anchor_year from both years&lt;br /&gt;
		if 1 ~= tonumber(year2) - tonumber(year) then return false; end			-- must be sequential years, left to right, earlier to later&lt;br /&gt;
		if not is_valid_year(year2) then return false; end						-- no year farther in the future than next year&lt;br /&gt;
&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;My-My&#039;][1]) then			-- month/season year - month/season year; separated by spaced endash&lt;br /&gt;
		month, year, month2, anchor_year, year2 = mw.ustring.match(date_string, patterns_t[&#039;My-My&#039;][1]);&lt;br /&gt;
		anchor_year = year .. &#039;–&#039; .. anchor_year;								-- assemble anchor_year from both years&lt;br /&gt;
		if tonumber(year) &amp;gt;= tonumber(year2) then return false; end				-- left to right, earlier to later, not the same&lt;br /&gt;
		if not is_valid_year(year2) then return false; end						-- no year farther in the future than next year&lt;br /&gt;
		if 0 ~= get_month_number(month) and 0 ~= get_month_number(month2) and is_valid_month_range_style(month, month2) then 	-- both must be month year, same month style&lt;br /&gt;
			month = get_month_number(month);&lt;br /&gt;
			month2 = get_month_number(month2);&lt;br /&gt;
		elseif 0 ~= get_season_number(month, param) and 0 ~= get_season_number(month2, param) then	-- both must be season year, not mixed&lt;br /&gt;
			month = get_season_number(month, param);&lt;br /&gt;
			month2 = get_season_number(month2, param);&lt;br /&gt;
		else&lt;br /&gt;
			 return false;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;M-My&#039;][1]) then			-- month/season range year; months separated by endash &lt;br /&gt;
		month, month2, anchor_year, year = mw.ustring.match(date_string, patterns_t[&#039;M-My&#039;][1]);&lt;br /&gt;
		if (not is_valid_month_season_range(month, month2, param)) or (not is_valid_year(year)) then return false; end&lt;br /&gt;
		if 0 ~= get_month_number(month) then									-- determined to be a valid range so just check this one to know if month or season&lt;br /&gt;
			month = get_month_number(month);&lt;br /&gt;
			month2 = get_month_number(month2);&lt;br /&gt;
			if 0 == month or 0 == month2 then return false; end&lt;br /&gt;
		else&lt;br /&gt;
			month = get_season_number(month, param);&lt;br /&gt;
			month2 = get_season_number(month2, param);&lt;br /&gt;
		end&lt;br /&gt;
		year2 = year;&lt;br /&gt;
		&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;My&#039;][1]) then				-- month/season/quarter/proper-name year&lt;br /&gt;
		month, anchor_year, year = mw.ustring.match(date_string, patterns_t[&#039;My&#039;][1]);&lt;br /&gt;
		if not is_valid_year(year) then return false; end&lt;br /&gt;
		month = get_element_number(month, param);								-- get month season quarter proper-name number or nil&lt;br /&gt;
		if not month then return false; end										-- not valid whatever it is&lt;br /&gt;
&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;y-y&#039;][1]) then				-- Year range: YYY-YYY or YYY-YYYY or YYYY–YYYY; separated by unspaced endash; 100-9999&lt;br /&gt;
		year, anchor_year, year2 = mw.ustring.match(date_string, patterns_t[&#039;y-y&#039;][1]);&lt;br /&gt;
		anchor_year = year .. &#039;–&#039; .. anchor_year;								-- assemble anchor year from both years&lt;br /&gt;
		if tonumber(year) &amp;gt;= tonumber(year2) then return false; end				-- left to right, earlier to later, not the same&lt;br /&gt;
		if not is_valid_year(year2) then return false; end						-- no year farther in the future than next year&lt;br /&gt;
&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;y4-y2&#039;][1]) then			-- Year range: YYYY–YY; separated by unspaced endash&lt;br /&gt;
		local century;&lt;br /&gt;
		year, century, anchor_year, year2 = mw.ustring.match(date_string, patterns_t[&#039;y4-y2&#039;][1]);&lt;br /&gt;
		anchor_year = year .. &#039;–&#039; .. anchor_year;								-- assemble anchor year from both years&lt;br /&gt;
&lt;br /&gt;
		if 13 &amp;gt; tonumber(year2) then return false; end							-- don&#039;t allow 2003-05 which might be May 2003&lt;br /&gt;
		year2 = century .. year2;												-- add the century to year2 for comparisons&lt;br /&gt;
		if tonumber(year) &amp;gt;= tonumber(year2) then return false; end				-- left to right, earlier to later, not the same&lt;br /&gt;
		if not is_valid_year(year2) then return false; end						-- no year farther in the future than next year&lt;br /&gt;
&lt;br /&gt;
		if in_array (param, {&#039;date&#039;, &#039;publication-date&#039;, &#039;year&#039;}) then			-- here when &#039;valid&#039; abbreviated year range; if one of these parameters&lt;br /&gt;
			add_prop_cat (&#039;year-range-abbreviated&#039;);							-- add properties cat&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	elseif mw.ustring.match(date_string, patterns_t[&#039;y&#039;][1]) then				-- year; here accept either YYY or YYYY&lt;br /&gt;
		anchor_year, year = mw.ustring.match(date_string, patterns_t[&#039;y&#039;][1]);&lt;br /&gt;
		if false == is_valid_year(year) then&lt;br /&gt;
			return false;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	else&lt;br /&gt;
		return false;															-- date format not one of the MOS:DATE approved formats&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if param ~= &#039;date&#039; then														-- CITEREF disambiguation only allowed in |date=; |year= &amp;amp; |publication-date= promote to date&lt;br /&gt;
		if anchor_year:match (&#039;%l$&#039;) then&lt;br /&gt;
			return false;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if &#039;access-date&#039; == param then												-- test access-date here because we have numerical date parts&lt;br /&gt;
		if 0 ~= year and 0 ~= month and 0 ~= day and 							-- all parts of a single date required&lt;br /&gt;
			0 == year2 and 0 == month2 and 0 == day2 then						-- none of these; access-date must not be a range&lt;br /&gt;
				if not is_valid_accessdate(year .. &#039;-&#039; .. month .. &#039;-&#039; .. day) then	&lt;br /&gt;
					return false;												-- return false when access-date out of bounds&lt;br /&gt;
				end&lt;br /&gt;
		else&lt;br /&gt;
			return false;														-- return false when access-date is a range of two dates&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if &#039;archive-date&#039; == param then												-- test archive-date here because we have numerical date parts&lt;br /&gt;
		if not (0 ~= year and 0 ~= month and 0 ~= day and						-- all parts of a single date required&lt;br /&gt;
			0 == year2 and 0 == month2 and 0 == day2) then						-- none of these; archive-date must not be a range&lt;br /&gt;
				return false;													-- return false when archive-date is a range of two dates&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local result=true;															-- check whole dates for validity; assume true because not all dates will go through this test&lt;br /&gt;
	if 0 ~= year and 0 ~= month and 0 ~= day and 0 == year2 and 0 == month2 and 0 == day2 then		-- YMD (simple whole date)&lt;br /&gt;
		result = is_valid_date (year, month, day, param);						-- &amp;lt;param&amp;gt; for |pmc-embargo-date=&lt;br /&gt;
&lt;br /&gt;
	elseif 0 ~= year and 0 ~= month and 0 ~= day and 0 == year2 and 0 == month2 and 0 ~= day2 then	-- YMD-d (day range)&lt;br /&gt;
		result = is_valid_date (year, month, day);&lt;br /&gt;
		result = result and is_valid_date (year, month, day2);&lt;br /&gt;
&lt;br /&gt;
	elseif 0 ~= year and 0 ~= month and 0 ~= day and 0 == year2 and 0 ~= month2 and 0 ~= day2 then	-- YMD-md (day month range)&lt;br /&gt;
		result = is_valid_date (year, month, day);&lt;br /&gt;
		result = result and is_valid_date (year, month2, day2);&lt;br /&gt;
&lt;br /&gt;
	elseif 0 ~= year and 0 ~= month and 0 ~= day and 0 ~= year2 and 0 ~= month2 and 0 ~= day2 then	-- YMD-ymd (day month year range)&lt;br /&gt;
		result = is_valid_date(year, month, day);&lt;br /&gt;
		result = result and is_valid_date(year2, month2, day2);&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if false == result then return false; end&lt;br /&gt;
&lt;br /&gt;
	if nil ~= tCOinS_date then													-- this table only passed into this function when testing |date= parameter values&lt;br /&gt;
		make_COinS_date ({year = year, month = month, day = day, year2 = year2, month2 = month2, day2 = day2}, tCOinS_date);	-- make an ISO 8601 date string for COinS&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return true, anchor_year;													-- format is good and date string represents a real date&lt;br /&gt;
end	&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; D A T E S &amp;gt;--------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Cycle the date-holding parameters in passed table date_parameters_list through check_date() to check compliance with MOS:DATE. For all valid dates, check_date() returns&lt;br /&gt;
true. The |date= parameter test is unique, it is the only date holding parameter from which values for anchor_year (used in CITEREF identifiers) and COinS_date (used in&lt;br /&gt;
the COinS metadata) are derived.  The |date= parameter is the only date-holding parameter that is allowed to contain the no-date keywords &amp;quot;n.d.&amp;quot; or &amp;quot;nd&amp;quot; (without quotes).&lt;br /&gt;
&lt;br /&gt;
Unlike most error messages created in this module, only one error message is created by this function. Because all of the date holding parameters are processed serially,&lt;br /&gt;
parameters with errors are added to the &amp;lt;error_list&amp;gt; sequence table as the dates are tested.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function dates(date_parameters_list, tCOinS_date, error_list)&lt;br /&gt;
	local anchor_year;															-- will return as nil if the date being tested is not |date=&lt;br /&gt;
	local COinS_date;															-- will return as nil if the date being tested is not |date=&lt;br /&gt;
	local embargo_date;															-- if embargo date is a good dmy, mdy, ymd date then holds original value else reset to 9999&lt;br /&gt;
	local good_date = false;&lt;br /&gt;
&lt;br /&gt;
	for k, v in pairs(date_parameters_list) do									-- for each date-holding parameter in the list&lt;br /&gt;
		if is_set(v.val) then													-- if the parameter has a value&lt;br /&gt;
			v.val = mw.ustring.gsub(v.val, &#039;%d&#039;, cfg.date_names.local_digits);	-- translate &#039;local&#039; digits to Western 0-9&lt;br /&gt;
			if v.val:match(&amp;quot;^c%. [1-9]%d%d%d?%a?$&amp;quot;) then						-- special case for c. year or with or without CITEREF disambiguator - only |date= and |year=&lt;br /&gt;
				local year = v.val:match(&amp;quot;c%. ([1-9]%d%d%d?)%a?&amp;quot;);				-- get the year portion so it can be tested&lt;br /&gt;
				if &#039;date&#039; == k then&lt;br /&gt;
					anchor_year, COinS_date = v.val:match(&amp;quot;((c%. [1-9]%d%d%d?)%a?)&amp;quot;);	-- anchor year and COinS_date only from |date= parameter&lt;br /&gt;
					good_date = is_valid_year(year);&lt;br /&gt;
				elseif &#039;year&#039; == k then&lt;br /&gt;
					good_date = is_valid_year(year);&lt;br /&gt;
				end&lt;br /&gt;
			elseif &#039;date&#039; == k then												-- if the parameter is |date=&lt;br /&gt;
				if v.val:match(&amp;quot;^n%.d%.%a?$&amp;quot;) then -- ToDo: I18N								-- if |date=n.d. with or without a CITEREF disambiguator&lt;br /&gt;
					good_date, anchor_year, COinS_date = true, v.val:match(&amp;quot;((n%.d%.)%a?)&amp;quot;); -- ToDo: I18N	-- &amp;quot;n.d.&amp;quot;; no error when date parameter is set to no date&lt;br /&gt;
				elseif v.val:match(&amp;quot;^nd%a?$&amp;quot;) then -- ToDo: I18N								-- if |date=nd with or without a CITEREF disambiguator&lt;br /&gt;
					good_date, anchor_year, COinS_date = true, v.val:match(&amp;quot;((nd)%a?)&amp;quot;); -- ToDo: I18N	-- &amp;quot;nd&amp;quot;;	no error when date parameter is set to no date&lt;br /&gt;
				else&lt;br /&gt;
					good_date, anchor_year, COinS_date = check_date (v.val, k, tCOinS_date);	-- go test the date&lt;br /&gt;
				end&lt;br /&gt;
			elseif &#039;year&#039; == k then												-- if the parameter is |year= it should hold only a year value&lt;br /&gt;
				if v.val:match(&amp;quot;^[1-9]%d%d%d?%a?$&amp;quot;) then						-- if |year = 3 or 4 digits only with or without a CITEREF disambiguator&lt;br /&gt;
					good_date, anchor_year, COinS_date = true, v.val:match(&amp;quot;((%d+)%a?)&amp;quot;);&lt;br /&gt;
				end&lt;br /&gt;
			elseif &#039;pmc-embargo-date&#039; == k then									-- if the parameter is |pmc-embargo-date=&lt;br /&gt;
				good_date = check_date (v.val, k);								-- go test the date&lt;br /&gt;
				if true == good_date then										-- if the date is a valid date&lt;br /&gt;
					good_date, embargo_date = is_valid_embargo_date (v.val);	-- is |pmc-embargo-date= date a single dmy, mdy, or ymd formatted date? yes: returns embargo date; no: returns 9999&lt;br /&gt;
				end&lt;br /&gt;
			else																-- any other date-holding parameter&lt;br /&gt;
				good_date = check_date (v.val, k);								-- go test the date&lt;br /&gt;
			end&lt;br /&gt;
			if false == good_date then											-- assemble one error message so we don&#039;t add the tracking category multiple times&lt;br /&gt;
				table.insert (error_list, wrap_style (&#039;parameter&#039;, v.name));	-- make parameter name suitable for error message list&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return anchor_year, embargo_date;											-- and done&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; Y E A R _ C H E C K &amp;gt;----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Temporary function to test |year= for acceptable values:&lt;br /&gt;
	YYY, YYYY, year-only ranges, their circa forms, with or without CITEREF disambiguators.&lt;br /&gt;
&lt;br /&gt;
When |year= holds some form of date that is not one of these year-only dates, emit a maintenance message.&lt;br /&gt;
&lt;br /&gt;
This function necessary because many non-cs1|2 templates have a |year= parameter so cirrus searches are more-or-&lt;br /&gt;
less useless&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function year_check (year)&lt;br /&gt;
	year = year:gsub (&#039;c%. *&#039;, &#039;&#039;);												-- remove circa annotation (if present) before testing &amp;lt;year&amp;gt;&lt;br /&gt;
	&lt;br /&gt;
	for _, index in ipairs ({&#039;y-y&#039;, &#039;y4-y2&#039;, &#039;y&#039;}) do							-- spin through these indexes into patterns_t&lt;br /&gt;
		if mw.ustring.match (year, patterns_t[index][1]) then&lt;br /&gt;
			return;																-- if a match then |year= holds a valid &#039;year&#039;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	set_message (&#039;maint_year&#039;);													-- if here, |year= value is not an accepted value; add a maint cat&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; Y E A R _ D A T E _ C H E C K &amp;gt;------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Compare the value provided in |year= with the year value(s) provided in |date=.  This function sets a local numeric value:&lt;br /&gt;
	0 - year value does not match the year value in date&lt;br /&gt;
	1 - (default) year value matches the year value in date or one of the year values when date contains two years&lt;br /&gt;
	2 - year value matches the year value in date when date is in the form YYYY-MM-DD and year is disambiguated (|year=YYYYx)&lt;br /&gt;
&lt;br /&gt;
the numeric value in &amp;lt;result&amp;gt; determines the &#039;output&#039; if any from this function:&lt;br /&gt;
	0 – adds error message to error_list sequence table&lt;br /&gt;
	1 – adds maint cat&lt;br /&gt;
	2 – does nothing&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function year_date_check (year_string, year_origin, date_string, date_origin, error_list)&lt;br /&gt;
	local year;&lt;br /&gt;
	local date1;&lt;br /&gt;
	local date2;&lt;br /&gt;
	local result = 1;															-- result of the test; assume that the test passes&lt;br /&gt;
&lt;br /&gt;
	year = year_string:match (&#039;(%d%d%d%d?)&#039;);&lt;br /&gt;
&lt;br /&gt;
	if date_string:match (&#039;%d%d%d%d%-%d%d%-%d%d&#039;) then							--special case where both date and year are required YYYY-MM-DD and YYYYx&lt;br /&gt;
		date1 = date_string:match (&#039;(%d%d%d%d)&#039;);&lt;br /&gt;
		year = year_string:match (&#039;(%d%d%d%d)&#039;);&lt;br /&gt;
		if year ~= date1 then&lt;br /&gt;
			result = 0;															-- years don&#039;t match&lt;br /&gt;
		elseif year_string:match (&#039;%d%d%d%d%a&#039;) then&lt;br /&gt;
			result = 2;															-- years match; but because disambiguated, don&#039;t add to maint cat&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
	elseif date_string:match (&amp;quot;%d%d%d%d?.-%d%d%d%d?&amp;quot;) then						-- any of the standard range formats of date with two three- or four-digit years&lt;br /&gt;
		date1, date2 = date_string:match (&amp;quot;(%d%d%d%d?).-(%d%d%d%d?)&amp;quot;);&lt;br /&gt;
		if year ~= date1 and year ~= date2 then&lt;br /&gt;
			result = 0;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	elseif mw.ustring.match(date_string, &amp;quot;%d%d%d%d[%-–]%d%d&amp;quot;) then				-- YYYY-YY date ranges&lt;br /&gt;
		local century;&lt;br /&gt;
		date1, century, date2 = mw.ustring.match(date_string, &amp;quot;((%d%d)%d%d)[%-–]+(%d%d)&amp;quot;);&lt;br /&gt;
		date2 = century..date2;													-- convert YY to YYYY&lt;br /&gt;
		if year ~= date1 and year ~= date2 then&lt;br /&gt;
			result = 0;&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	elseif date_string:match (&amp;quot;%d%d%d%d?&amp;quot;) then									-- any of the standard formats of date with one year&lt;br /&gt;
		date1 = date_string:match (&amp;quot;(%d%d%d%d?)&amp;quot;);&lt;br /&gt;
		if year ~= date1 then&lt;br /&gt;
			result = 0;&lt;br /&gt;
		end&lt;br /&gt;
	else																		-- should never get here; this function called only when no other date errors&lt;br /&gt;
		result = 0;																-- no recognizable year in date&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if 0 == result then															-- year / date mismatch&lt;br /&gt;
		table.insert (error_list, substitute (cfg.messages[&#039;mismatch&#039;], {year_origin, date_origin}));	-- add error message to error_list sequence table&lt;br /&gt;
	elseif 1 == result then														-- redundant year / date&lt;br /&gt;
		set_message (&#039;maint_date_year&#039;);										-- add a maint cat&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; R E F O R M A T T E R &amp;gt;--------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
reformat &#039;date&#039; into new format specified by format_param if pattern_idx (the current format of &#039;date&#039;) can be&lt;br /&gt;
reformatted.  Does the grunt work for reformat_dates().&lt;br /&gt;
&lt;br /&gt;
The table re_formats maps pattern_idx (current format) and format_param (desired format) to a table that holds:&lt;br /&gt;
	format string used by string.format()&lt;br /&gt;
	identifier letters (&#039;d&#039;, &#039;m&#039;, &#039;y&#039;, &#039;d2&#039;, &#039;m2&#039;, &#039;y2&#039;) that serve as indexes into a table t{} that holds captures&lt;br /&gt;
		from mw.ustring.match() for the various date parts specified by  patterns_t[pattern_idx][1]&lt;br /&gt;
&lt;br /&gt;
Items in patterns_t{} have the general form:&lt;br /&gt;
	[&#039;ymd&#039;] = {&#039;^(%d%d%d%d)%-(%d%d)%-(%d%d)$&#039;, &#039;y&#039;, &#039;m&#039;, &#039;d&#039;}, where:&lt;br /&gt;
		[&#039;ymd&#039;] is pattern_idx&lt;br /&gt;
		patterns_t[&#039;ymd&#039;][1] is the match pattern with captures for mw.ustring.match()&lt;br /&gt;
		patterns_t[&#039;ymd&#039;][2] is an indicator letter identifying the content of the first capture&lt;br /&gt;
		patterns_t[&#039;ymd&#039;][3] ... the second capture etc.&lt;br /&gt;
&lt;br /&gt;
when a pattern matches a date, the captures are loaded into table t{} in capture order using the idemtifier&lt;br /&gt;
characters as indexes into t{}  For the above, a ymd date is in t{} as:&lt;br /&gt;
	t.y = first capture (year), t.m = second capture (month), t.d = third capture (day)&lt;br /&gt;
&lt;br /&gt;
To reformat, this function is called with the pattern_idx that matches the current format of the date and with&lt;br /&gt;
format_param set to the desired format.  This function loads table t{} as described and then calls string.format()&lt;br /&gt;
with the format string specified by re_format[pattern_idx][format_param][1] using values taken from t{} according&lt;br /&gt;
to the capture identifier letters specified by patterns_t[pattern_idx][format_param][n] where n is 2..&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local re_formats = {&lt;br /&gt;
	[&#039;ymd&#039;] = {																	-- date format is ymd; reformat to:&lt;br /&gt;
		[&#039;mdy&#039;] = {&#039;%s %s, %s&#039;, &#039;m&#039;, &#039;d&#039;, &#039;y&#039;},									-- |df=mdy&lt;br /&gt;
		[&#039;dmy&#039;] = {&#039;%s %s %s&#039;, &#039;d&#039;, &#039;m&#039;, &#039;y&#039;},									-- |df=dmy&lt;br /&gt;
	--		[&#039;yMd&#039;] = {&#039;%s %s %s&#039;, &#039;y&#039;, &#039;m&#039;, &#039;d&#039;},								-- |df=yMd; not supported at en.wiki&lt;br /&gt;
		},&lt;br /&gt;
	[&#039;Mdy&#039;] = {																	-- date format is Mdy; reformat to:&lt;br /&gt;
		[&#039;mdy&#039;] = {&#039;%s %s, %s&#039;, &#039;m&#039;, &#039;d&#039;, &#039;y&#039;},									-- for long/short reformatting&lt;br /&gt;
		[&#039;dmy&#039;] = {&#039;%s %s %s&#039;, &#039;d&#039;, &#039;m&#039;, &#039;y&#039;},									-- |df=dmy&lt;br /&gt;
		[&#039;ymd&#039;] = {&#039;%s-%s-%s&#039;, &#039;y&#039;, &#039;m&#039;, &#039;d&#039;},									-- |df=ymd&lt;br /&gt;
	--		[&#039;yMd&#039;] = {&#039;%s %s %s&#039;, &#039;y&#039;, &#039;m&#039;, &#039;d&#039;},								-- |df=yMd; not supported at en.wiki&lt;br /&gt;
		},&lt;br /&gt;
	[&#039;dMy&#039;] = {																	-- date format is dMy; reformat to:&lt;br /&gt;
		[&#039;dmy&#039;] = {&#039;%s %s %s&#039;, &#039;d&#039;, &#039;m&#039;, &#039;y&#039;},									-- for long/short reformatting&lt;br /&gt;
		[&#039;mdy&#039;] = {&#039;%s %s, %s&#039;, &#039;m&#039;, &#039;d&#039;, &#039;y&#039;},									-- |df=mdy&lt;br /&gt;
		[&#039;ymd&#039;] = {&#039;%s-%s-%s&#039;, &#039;y&#039;, &#039;m&#039;, &#039;d&#039;},									-- |df=ymd&lt;br /&gt;
	--		[&#039;yMd&#039;] = {&#039;%s %s %s&#039;, &#039;y&#039;, &#039;m&#039;, &#039;d&#039;},								-- |df=yMd; not supported at en.wiki&lt;br /&gt;
		},&lt;br /&gt;
	[&#039;Md-dy&#039;] = {																-- date format is Md-dy; reformat to:&lt;br /&gt;
		[&#039;mdy&#039;] = {&#039;%s %s–%s, %s&#039;, &#039;m&#039;, &#039;d&#039;, &#039;d2&#039;, &#039;y&#039;},						-- for long/short reformatting&lt;br /&gt;
		[&#039;dmy&#039;] = {&#039;%s–%s %s %s&#039;, &#039;d&#039;, &#039;d2&#039;, &#039;m&#039;, &#039;y&#039;},							-- |df=dmy -&amp;gt; d-dMy &lt;br /&gt;
		},&lt;br /&gt;
	[&#039;d-dMy&#039;] = {																-- date format is d-d&amp;gt;y; reformat to:&lt;br /&gt;
		[&#039;dmy&#039;] = {&#039;%s–%s %s %s&#039;, &#039;d&#039;, &#039;d2&#039;, &#039;m&#039;, &#039;y&#039;},							-- for long/short reformatting&lt;br /&gt;
		[&#039;mdy&#039;] = {&#039;%s %s–%s, %s&#039;, &#039;m&#039;, &#039;d&#039;, &#039;d2&#039;, &#039;y&#039;},						-- |df=mdy -&amp;gt; Md-dy &lt;br /&gt;
		},&lt;br /&gt;
	[&#039;dM-dMy&#039;] = {																-- date format is dM-dMy; reformat to:&lt;br /&gt;
		[&#039;dmy&#039;] = {&#039;%s %s – %s %s %s&#039;, &#039;d&#039;, &#039;m&#039;, &#039;d2&#039;, &#039;m2&#039;, &#039;y&#039;},				-- for long/short reformatting&lt;br /&gt;
		[&#039;mdy&#039;] = {&#039;%s %s – %s %s, %s&#039;, &#039;m&#039;, &#039;d&#039;, &#039;m2&#039;, &#039;d2&#039;, &#039;y&#039;},				-- |df=mdy -&amp;gt; Md-Mdy &lt;br /&gt;
		},&lt;br /&gt;
	[&#039;Md-Mdy&#039;] = {																-- date format is Md-Mdy; reformat to:&lt;br /&gt;
		[&#039;mdy&#039;] = {&#039;%s %s – %s %s, %s&#039;, &#039;m&#039;, &#039;d&#039;,  &#039;m2&#039;, &#039;d2&#039;, &#039;y&#039;},			-- for long/short reformatting&lt;br /&gt;
		[&#039;dmy&#039;] = {&#039;%s %s – %s %s %s&#039;, &#039;d&#039;, &#039;m&#039;, &#039;d2&#039;, &#039;m2&#039;, &#039;y&#039;},				-- |df=dmy -&amp;gt; dM-dMy &lt;br /&gt;
		},&lt;br /&gt;
	[&#039;dMy-dMy&#039;] = {																-- date format is dMy-dMy; reformat to:&lt;br /&gt;
		[&#039;dmy&#039;] = {&#039;%s %s %s – %s %s %s&#039;, &#039;d&#039;, &#039;m&#039;, &#039;y&#039;, &#039;d2&#039;, &#039;m2&#039;, &#039;y2&#039;},		-- for long/short reformatting&lt;br /&gt;
		[&#039;mdy&#039;] = {&#039;%s %s, %s – %s %s, %s&#039;, &#039;m&#039;, &#039;d&#039;, &#039;y&#039;, &#039;m2&#039;, &#039;d2&#039;, &#039;y2&#039;},	-- |df=mdy -&amp;gt; Mdy-Mdy &lt;br /&gt;
		},&lt;br /&gt;
	[&#039;Mdy-Mdy&#039;] = {																-- date format is Mdy-Mdy; reformat to:&lt;br /&gt;
		[&#039;mdy&#039;] = {&#039;%s %s, %s – %s %s, %s&#039;, &#039;m&#039;, &#039;d&#039;, &#039;y&#039;, &#039;m2&#039;, &#039;d2&#039;, &#039;y2&#039;},	-- for long/short reformatting&lt;br /&gt;
		[&#039;dmy&#039;] = {&#039;%s %s %s – %s %s %s&#039;, &#039;d&#039;, &#039;m&#039;, &#039;y&#039;, &#039;d2&#039;, &#039;m2&#039;, &#039;y2&#039;},		-- |df=dmy -&amp;gt; dMy-dMy &lt;br /&gt;
		},&lt;br /&gt;
	[&#039;My-My&#039;] = {																-- these for long/short reformatting&lt;br /&gt;
		[&#039;any&#039;] = {&#039;%s %s – %s %s&#039;, &#039;m&#039;, &#039;y&#039;, &#039;m2&#039;, &#039;y2&#039;},						-- dmy/mdy agnostic&lt;br /&gt;
		},&lt;br /&gt;
	[&#039;M-My&#039;] = {																-- these for long/short reformatting&lt;br /&gt;
		[&#039;any&#039;] = {&#039;%s–%s %s&#039;, &#039;m&#039;, &#039;m2&#039;, &#039;y&#039;},									-- dmy/mdy agnostic&lt;br /&gt;
		},&lt;br /&gt;
	[&#039;My&#039;] = {																	-- these for long/short reformatting&lt;br /&gt;
		[&#039;any&#039;] = {&#039;%s %s&#039;, &#039;m&#039;, &#039;y&#039;},											-- dmy/mdy agnostic&lt;br /&gt;
		},&lt;br /&gt;
	--	[&#039;yMd&#039;] = {																-- not supported at en.wiki&lt;br /&gt;
	--		[&#039;mdy&#039;] = {&#039;%s %s, %s&#039;, &#039;m&#039;, &#039;d&#039;, &#039;y&#039;},								-- |df=mdy&lt;br /&gt;
	--		[&#039;dmy&#039;] = {&#039;%s %s %s&#039;, &#039;d&#039;, &#039;m&#039;, &#039;y&#039;},								-- |df=dmy&lt;br /&gt;
	--		[&#039;ymd&#039;] = {&#039;%s-%s-%s&#039;, &#039;y&#039;, &#039;m&#039;, &#039;d&#039;},								-- |df=ymd&lt;br /&gt;
	--		},&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function reformatter (date, pattern_idx, format_param, mon_len)&lt;br /&gt;
	if not in_array (pattern_idx, {&#039;ymd&#039;, &#039;Mdy&#039;, &#039;Md-dy&#039;, &#039;dMy&#039;, &#039;yMd&#039;, &#039;d-dMy&#039;, &#039;dM-dMy&#039;, &#039;Md-Mdy&#039;, &#039;dMy-dMy&#039;, &#039;Mdy-Mdy&#039;, &#039;My-My&#039;, &#039;M-My&#039;, &#039;My&#039;}) then&lt;br /&gt;
		return;																	-- not in this set of date format patterns_t then not a reformattable date&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if &#039;ymd&#039; == format_param and in_array (pattern_idx, {&#039;ymd&#039;, &#039;Md-dy&#039;, &#039;d-dMy&#039;, &#039;dM-dMy&#039;, &#039;Md-Mdy&#039;, &#039;dMy-dMy&#039;, &#039;Mdy-Mdy&#039;, &#039;My-My&#039;, &#039;M-My&#039;, &#039;My&#039;}) then&lt;br /&gt;
		return;																	-- ymd date ranges not supported at en.wiki; no point in reformatting ymd to ymd&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if in_array (pattern_idx, {&#039;My&#039;, &#039;M-My&#039;, &#039;My-My&#039;}) then						-- these are not dmy/mdy so can&#039;t be &#039;reformatted&#039; into either&lt;br /&gt;
		format_param = &#039;any&#039;;													-- so format-agnostic &lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
																				-- yMd is not supported at en.wiki; when yMd is supported at your wiki, uncomment the next line&lt;br /&gt;
	--	if &#039;yMd&#039; == format_param and in_array (pattern_idx, {&#039;yMd&#039;, &#039;Md-dy&#039;, &#039;d-dMy&#039;, &#039;dM-dMy&#039;, &#039;Md-Mdy&#039;, &#039;dMy-dMy&#039;, &#039;Mdy-Mdy&#039;}) then	-- these formats not convertable; yMd not supported at en.wiki&lt;br /&gt;
	if &#039;yMd&#039; == format_param then												-- yMd not supported at en.wiki; when yMd is supported at your wiki, remove or comment-out this line&lt;br /&gt;
		return;																	-- not a reformattable date&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local c1, c2, c3, c4, c5, c6, c7;											-- these hold the captures specified in patterns_t[pattern_idx][1]&lt;br /&gt;
	c1, c2, c3, c4, c5, c6, c7 = mw.ustring.match (date, patterns_t[pattern_idx][1]);	-- get the captures&lt;br /&gt;
&lt;br /&gt;
	local t = {																	-- table that holds k/v pairs of date parts from the captures and patterns_t[pattern_idx][2..]&lt;br /&gt;
		[patterns_t[pattern_idx][2]] = c1;										-- at minimum there is always one capture with a matching indicator letter&lt;br /&gt;
		[patterns_t[pattern_idx][3] or &#039;x&#039;] = c2;								-- patterns_t can have a variable number of captures; each capture requires an indicator letter;&lt;br /&gt;
		[patterns_t[pattern_idx][4] or &#039;x&#039;] = c3;								-- where there is no capture, there is no indicator letter so n in patterns_t[pattern_idx][n] will be nil;&lt;br /&gt;
		[patterns_t[pattern_idx][5] or &#039;x&#039;] = c4;								-- the &#039;x&#039; here spoofs an indicator letter to prevent &#039;table index is nil&#039; error&lt;br /&gt;
		[patterns_t[pattern_idx][6] or &#039;x&#039;] = c5;&lt;br /&gt;
		[patterns_t[pattern_idx][7] or &#039;x&#039;] = c6;&lt;br /&gt;
		[patterns_t[pattern_idx][8] or &#039;x&#039;] = c7;&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
	if t.a then																	-- if this date has an anchor year capture (all convertable date formats except ymd)&lt;br /&gt;
		if t.y2 then															-- for year range date formats														&lt;br /&gt;
			t.y2 = t.a;															-- use the anchor year capture when reassembling the date&lt;br /&gt;
		else																	-- here for single date formats (except ymd)&lt;br /&gt;
			t.y = t.a;															-- use the anchor year capture when reassembling the date&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if tonumber(t.m) then														-- if raw month is a number (converting from ymd)&lt;br /&gt;
		if &#039;s&#039; == mon_len then													-- if we are to use abbreviated month names&lt;br /&gt;
			t.m = cfg.date_names[&#039;inv_local_short&#039;][tonumber(t.m)];					-- convert it to a month name&lt;br /&gt;
		else&lt;br /&gt;
			t.m = cfg.date_names[&#039;inv_local_long&#039;][tonumber(t.m)];					-- convert it to a month name&lt;br /&gt;
		end&lt;br /&gt;
		t.d = t.d:gsub (&#039;0(%d)&#039;, &#039;%1&#039;);											-- strip leading &#039;0&#039; from day if present&lt;br /&gt;
	elseif &#039;ymd&#039; == format_param then											-- when converting to ymd&lt;br /&gt;
		t.y = t.y:gsub (&#039;%a&#039;, &#039;&#039;);												-- strip CITREF disambiguator if present; anchor year already known so process can proceed; TODO: maint message?&lt;br /&gt;
		if 1582 &amp;gt; tonumber (t.y) then											-- ymd format dates not allowed before 1582&lt;br /&gt;
			return;&lt;br /&gt;
		end&lt;br /&gt;
		t.m = string.format (&#039;%02d&#039;, get_month_number (t.m));					-- make sure that month and day are two digits&lt;br /&gt;
		t.d = string.format (&#039;%02d&#039;, t.d);&lt;br /&gt;
	elseif mon_len then															-- if mon_len is set to either &#039;short&#039; or &#039;long&#039;&lt;br /&gt;
		for _, mon in ipairs ({&#039;m&#039;, &#039;m2&#039;}) do									-- because there can be two month names, check both &lt;br /&gt;
			if t[mon] then&lt;br /&gt;
				t[mon] = get_month_number (t[mon]);								-- get the month number for this month (is length agnostic)&lt;br /&gt;
				if 0 == t[mon] then return; end									-- seasons and named dates can&#039;t be converted&lt;br /&gt;
				t[mon] = ((&#039;s&#039; == mon_len) and cfg.date_names[&#039;inv_local_short&#039;][t[mon]]) or cfg.date_names[&#039;inv_local_long&#039;][t[mon]];	-- fetch month name according to length&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local new_date = string.format (re_formats[pattern_idx][format_param][1],	-- format string&lt;br /&gt;
		t[re_formats[pattern_idx][format_param][2]],							-- named captures from t{}&lt;br /&gt;
		t[re_formats[pattern_idx][format_param][3]],&lt;br /&gt;
		t[re_formats[pattern_idx][format_param][4]],&lt;br /&gt;
		t[re_formats[pattern_idx][format_param][5]],&lt;br /&gt;
		t[re_formats[pattern_idx][format_param][6]],&lt;br /&gt;
		t[re_formats[pattern_idx][format_param][7]],&lt;br /&gt;
		t[re_formats[pattern_idx][format_param][8]]&lt;br /&gt;
		);&lt;br /&gt;
&lt;br /&gt;
	return new_date;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[-------------------------&amp;lt; R E F O R M A T _ D A T E S &amp;gt;--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Reformats existing dates into the format specified by format.&lt;br /&gt;
&lt;br /&gt;
format is one of several manual keywords: dmy, dmy-all, mdy, mdy-all, ymd, ymd-all.  The -all version includes&lt;br /&gt;
access- and archive-dates; otherwise these dates are not reformatted.&lt;br /&gt;
&lt;br /&gt;
This function allows automatic date formatting.  In ~/Configuration, the article source is searched for one of&lt;br /&gt;
the {{use xxx dates}} templates.  If found, xxx becomes the global date format as xxx-all.  If |cs1-dates= in&lt;br /&gt;
{{use xxx dates}} has legitimate value then that value determines how cs1|2 dates will be rendered.  Legitimate&lt;br /&gt;
values for |cs1-dates= are:&lt;br /&gt;
	l - all dates are rendered with long month names&lt;br /&gt;
	ls - publication dates use long month names; access-/archive-dates use abbreviated month names&lt;br /&gt;
	ly - publication dates use long month names; access-/archive-dates rendered in ymd format&lt;br /&gt;
	s - all dates are rendered with abbreviated (short) month names&lt;br /&gt;
	sy - publication dates use abbreviated month names; access-/archive-dates rendered in ymd format&lt;br /&gt;
	y - all dates are rendered in ymd format&lt;br /&gt;
&lt;br /&gt;
the format argument for automatic date formatting will be the format specified by {{use xxx dates}} with the&lt;br /&gt;
value supplied by |cs1-dates so one of: xxx-l, xxx-ls, xxx-ly, xxx-s, xxx-sy, xxx-y, or simply xxx (|cs1-dates=&lt;br /&gt;
empty, omitted, or invalid) where xxx shall be either of dmy or mdy.&lt;br /&gt;
&lt;br /&gt;
dates are extracted from date_parameters_list, reformatted (if appropriate), and then written back into the&lt;br /&gt;
list in the new format.  Dates in date_parameters_list are presumed here to be valid (no errors).  This function&lt;br /&gt;
returns true when a date has been reformatted, false else.  Actual reformatting is done by reformatter().&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function reformat_dates (date_parameters_list, format)&lt;br /&gt;
	local all = false;															-- set to false to skip access- and archive-dates&lt;br /&gt;
	local len_p = &#039;l&#039;;															-- default publication date length shall be long&lt;br /&gt;
	local len_a = &#039;l&#039;;															-- default access-/archive-date length shall be long&lt;br /&gt;
	local result = false;&lt;br /&gt;
	local new_date;																&lt;br /&gt;
	&lt;br /&gt;
	if format:match(&#039;%a+%-all&#039;) then											-- manual df keyword; auto df keyword when length not specified in {{use xxx dates}}; &lt;br /&gt;
		format = format:match(&#039;(%a+)%-all&#039;);									-- extract the format&lt;br /&gt;
		all = true;																-- all dates are long format dates because this keyword doesn&#039;t specify length&lt;br /&gt;
	elseif format:match(&#039;%a+%-[lsy][sy]?&#039;) then									-- auto df keywords; internal only&lt;br /&gt;
		all = true;																-- auto df applies to all dates; use length specified by capture len_p for all dates&lt;br /&gt;
		format, len_p, len_a = format:match(&#039;(%a+)%-([lsy])([sy]?)&#039;);			-- extract the format and length keywords&lt;br /&gt;
		if &#039;y&#039; == len_p then													-- because allowed by MOS:DATEUNIFY (sort of) range dates and My dates not reformatted&lt;br /&gt;
			format = &#039;ymd&#039;;														-- override {{use xxx dates}}&lt;br /&gt;
		elseif (not is_set(len_a)) or (len_p == len_a) then						-- no access-/archive-date length specified or same length as publication dates then&lt;br /&gt;
			len_a = len_p;														-- in case len_a not set&lt;br /&gt;
		end&lt;br /&gt;
	end																			-- else only publication dates and they are long&lt;br /&gt;
&lt;br /&gt;
	for param_name, param_val in pairs (date_parameters_list) do				-- for each date-holding parameter in the list&lt;br /&gt;
		if is_set (param_val.val) then											-- if the parameter has a value&lt;br /&gt;
			if not (not all and in_array (param_name, {&#039;access-date&#039;, &#039;archive-date&#039;})) then	-- skip access- or archive-date unless format is xxx-all; yeah, ugly; TODO: find a better way&lt;br /&gt;
				for pattern_idx, pattern in pairs (patterns_t) do&lt;br /&gt;
					if mw.ustring.match (param_val.val, pattern[1]) then&lt;br /&gt;
						if all and in_array (param_name, {&#039;access-date&#039;, &#039;archive-date&#039;}) then	-- if this date is an access- or archive-date&lt;br /&gt;
							new_date = reformatter (param_val.val, pattern_idx, ((&#039;y&#039; == len_a) and &#039;ymd&#039;) or format, len_a);	-- choose ymd or dmy/mdy according to len_a setting&lt;br /&gt;
						else													-- all other dates&lt;br /&gt;
							new_date = reformatter (param_val.val, pattern_idx, format, len_p);&lt;br /&gt;
						end&lt;br /&gt;
						&lt;br /&gt;
						if new_date then										-- set when date was reformatted&lt;br /&gt;
							date_parameters_list[param_name].val = new_date;	-- update date in date list&lt;br /&gt;
							result = true;										-- and announce that changes have been made&lt;br /&gt;
							break;&lt;br /&gt;
						end&lt;br /&gt;
					end	-- if&lt;br /&gt;
				end		-- for&lt;br /&gt;
			end			-- if&lt;br /&gt;
		end				-- if&lt;br /&gt;
	end					-- for&lt;br /&gt;
	return result;																-- declare boolean result and done&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; D A T E _ H Y P H E N _ T O _ D A S H &amp;gt;----------------------------------------&lt;br /&gt;
&lt;br /&gt;
Loops through the list of date-holding parameters and converts any hyphen to an ndash.  Not called if the cs1|2&lt;br /&gt;
template has any date errors.&lt;br /&gt;
&lt;br /&gt;
Modifies the date_parameters_list and returns true if hyphens are replaced, else returns false.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function date_hyphen_to_dash (date_parameters_list)&lt;br /&gt;
	local result = false;&lt;br /&gt;
	local n;&lt;br /&gt;
	for param_name, param_val in pairs(date_parameters_list) do					-- for each date-holding parameter in the list&lt;br /&gt;
		if is_set (param_val.val) and&lt;br /&gt;
			not mw.ustring.match (param_val.val, patterns_t.ymd[1]) then		-- for those that are not ymd dates (ustring because here digits may not be Western)&lt;br /&gt;
				param_val.val, n = param_val.val:gsub (&#039;%-&#039;, &#039;–&#039;);				-- replace any hyphen with ndash&lt;br /&gt;
				if 0 ~= n then&lt;br /&gt;
					date_parameters_list[param_name].val = param_val.val;		-- update the list&lt;br /&gt;
					result = true;&lt;br /&gt;
				end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return result;																-- so we know if any hyphens were replaced&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[-------------------------&amp;lt; D A T E _ N A M E _ X L A T E &amp;gt;------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Attempts to translate English date names to local-language date names using names supplied by MediaWiki&#039;s&lt;br /&gt;
date parser function.  This is simple name-for-name replacement and may not work for all languages.&lt;br /&gt;
&lt;br /&gt;
if xlat_dig is true, this function will also translate Western (English) digits to the local language&#039;s digits.&lt;br /&gt;
This will also translate ymd dates.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function date_name_xlate (date_parameters_list, xlt_dig)&lt;br /&gt;
	local xlate;&lt;br /&gt;
	local mode;																	-- long or short month names&lt;br /&gt;
	local modified = false;&lt;br /&gt;
	local date;&lt;br /&gt;
	&lt;br /&gt;
	local sources_t = {&lt;br /&gt;
		{cfg.date_names.en.long, cfg.date_names.inv_local_long},				-- for translating long English month names to long local month names&lt;br /&gt;
		{cfg.date_names.en.short, cfg.date_names.inv_local_short},				-- short month names&lt;br /&gt;
		{cfg.date_names.en.quarter, cfg.date_names.inv_local_quarter},			-- quarter date names&lt;br /&gt;
		{cfg.date_names.en.season, cfg.date_names.inv_local_season},			-- season date nam&lt;br /&gt;
		{cfg.date_names.en.named, cfg.date_names.inv_local_named},				-- named dates&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	local function is_xlateable (month)											-- local function to get local date name that replaces existing English-language date name&lt;br /&gt;
		for _, date_names_t in ipairs (sources_t) do							-- for each sequence table in date_names_t&lt;br /&gt;
			if date_names_t[1][month] then										-- if date name is English month (long or short), quarter, season or named and&lt;br /&gt;
				if date_names_t[2][date_names_t[1][month]] then					-- if there is a matching local date name&lt;br /&gt;
					return date_names_t[2][date_names_t[1][month]];				-- return the local date name&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for param_name, param_val in pairs(date_parameters_list) do					-- for each date-holding parameter in the list&lt;br /&gt;
		if is_set(param_val.val) then											-- if the parameter has a value&lt;br /&gt;
			date = param_val.val;&lt;br /&gt;
			for month in mw.ustring.gmatch (date, &#039;[%a ]+&#039;) do					-- iterate through all date names in the date (single date or date range)&lt;br /&gt;
				month = mw.text.trim (month);									-- this because quarterly dates contain whitespace&lt;br /&gt;
				xlate = is_xlateable (month);									-- get translate &amp;lt;month&amp;gt;; returns translation or nil&lt;br /&gt;
				&lt;br /&gt;
				if xlate then		&lt;br /&gt;
					date = mw.ustring.gsub (date, month, xlate);				-- replace the English with the translation&lt;br /&gt;
					date_parameters_list[param_name].val = date;				-- save the translated date&lt;br /&gt;
					modified = true;&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			if xlt_dig then														-- shall we also translate digits?&lt;br /&gt;
				date = date:gsub (&#039;%d&#039;, cfg.date_names.xlate_digits);			-- translate digits from Western to &#039;local digits&#039;&lt;br /&gt;
				date_parameters_list[param_name].val = date;					-- save the translated date&lt;br /&gt;
				modified = true;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return modified;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; S E T _ S E L E C T E D _ M O D U L E S &amp;gt;--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Sets local imported functions table to same (live or sandbox) as that used by the other modules.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function set_selected_modules (cfg_table_ptr, utilities_page_ptr)&lt;br /&gt;
	add_prop_cat = utilities_page_ptr.add_prop_cat ;							-- import functions from selected Module:Citation/CS1/Utilities module&lt;br /&gt;
	is_set = utilities_page_ptr.is_set;&lt;br /&gt;
	in_array = utilities_page_ptr.in_array;&lt;br /&gt;
	set_message = utilities_page_ptr.set_message;&lt;br /&gt;
	substitute = utilities_page_ptr.substitute;&lt;br /&gt;
	wrap_style = utilities_page_ptr.wrap_style;&lt;br /&gt;
&lt;br /&gt;
	cfg = cfg_table_ptr;														-- import tables from selected Module:Citation/CS1/Configuration&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; A R C H I V E _ D A T E _ C H E C K &amp;gt;------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Compare value in |archive-date= with the timestamp in Wayback machine urls.  Emits an error message with suggested&lt;br /&gt;
date from the |archive-url= timestamp in an appropriate format when the value in |archive-date= does not match&lt;br /&gt;
the timestamp.&lt;br /&gt;
&lt;br /&gt;
this function never called when any date in a cs1|2 template has errors&lt;br /&gt;
&lt;br /&gt;
error message suggests new |archive-date= value in an appropriate format specified by &amp;lt;df&amp;gt;.  &amp;lt;df&amp;gt; is either &lt;br /&gt;
|df= or cfg.global_df in that order.  If &amp;lt;df&amp;gt; is nil, suggested date has format from |archive-date=.  There is&lt;br /&gt;
a caveat: when |df=dmy or |df=mdy, the reformatter leaves |access-date= and |archive-date= formats as they are.&lt;br /&gt;
The error message suggested date is passed to the formatter as YYYY-MM-DD so when |df=dmy or |df=mdy, the format&lt;br /&gt;
is not changed.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function archive_date_check (archive_date, archive_url_timestamp, df)&lt;br /&gt;
	local archive_date_format = &#039;dmy-y&#039;;										-- holds the date format of date in |archive-date; default to ymd; &#039;dmy&#039; used here to spoof reformat_dates() &lt;br /&gt;
	&lt;br /&gt;
	for _, v_t in ipairs ({{&#039;dMy&#039;, &#039;dmy-all&#039;}, {&#039;Mdy&#039;, &#039;mdy-all&#039;}}) do			-- is |archive-date= format dmy or mdy?&lt;br /&gt;
		if archive_date:match (patterns_t[v_t[1]][1]) then						-- does the pattern match?&lt;br /&gt;
			archive_date_format = cfg.keywords_xlate[v_t[2]];					-- get appropriate |df= supported keyword from the i18n translator table&lt;br /&gt;
			break;&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local dates_t = {};&lt;br /&gt;
	dates_t[&#039;archive-date&#039;] = {val=archive_date, name=&#039;&#039;};						-- setup to call reformat_dates(); never called when errors so &amp;lt;name&amp;gt; unset as not needed&lt;br /&gt;
	reformat_dates (dates_t, &#039;dmy-y&#039;);											-- reformat |archive-date= to ymd; &#039;dmy&#039; used here to spoof reformat_dates()&lt;br /&gt;
	local archive_url_date = archive_url_timestamp:gsub (&#039;(%d%d%d%d)(%d%d)(%d%d)%d*&#039;, &#039;%1-%2-%3&#039;);	-- make ymd format date from timestamp&lt;br /&gt;
&lt;br /&gt;
	if dates_t[&#039;archive-date&#039;].val == archive_url_date then						-- are the two dates the same&lt;br /&gt;
		return;																	-- yes, done&lt;br /&gt;
	else&lt;br /&gt;
		dates_t[&#039;archive-date&#039;] = {val=archive_url_date, name=&#039;&#039;};				-- setup to call reformat_dates() with the timestamp date&lt;br /&gt;
		reformat_dates (dates_t, df or archive_date_format);					-- reformat timestamp to format specified by &amp;lt;df&amp;gt; or format used in |archive-date= &lt;br /&gt;
		archive_url_date = dates_t[&#039;archive-date&#039;].val;&lt;br /&gt;
		set_message (&#039;err_archive_date_url_ts_mismatch&#039;, archive_url_date);		-- emit an error message&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E X P O R T E D   F U N C T I O N S &amp;gt;------------------------------------------&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
return {																		-- return exported functions&lt;br /&gt;
	archive_date_check = archive_date_check,&lt;br /&gt;
	date_hyphen_to_dash = date_hyphen_to_dash,&lt;br /&gt;
	date_name_xlate = date_name_xlate,&lt;br /&gt;
	dates = dates,&lt;br /&gt;
	reformat_dates = reformat_dates,&lt;br /&gt;
	set_selected_modules = set_selected_modules,&lt;br /&gt;
	year_check = year_check,&lt;br /&gt;
	year_date_check = year_date_check,&lt;br /&gt;
	}&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Module:Citation/CS1/Configuration&amp;diff=6665</id>
		<title>Module:Citation/CS1/Configuration</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Module:Citation/CS1/Configuration&amp;diff=6665"/>
		<updated>2025-11-01T21:42:48Z</updated>

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

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[--------------------------&amp;lt; F O R W A R D   D E C L A R A T I O N S &amp;gt;--------------------------------------&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local has_accept_as_written, is_set, in_array, remove_wiki_link, strip_apostrophe_markup;	-- functions in Module:Citation/CS1/Utilities&lt;br /&gt;
&lt;br /&gt;
local cfg;																		-- table of configuration tables that are defined in Module:Citation/CS1/Configuration&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; M A K E _ C O I N S _ T I T L E &amp;gt;----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Makes a title for COinS from Title and / or ScriptTitle (or any other name-script pairs)&lt;br /&gt;
&lt;br /&gt;
Apostrophe markup (bold, italics) is stripped from each value so that the COinS metadata isn&#039;t corrupted with strings&lt;br /&gt;
of %27%27...&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function make_coins_title (title, script)&lt;br /&gt;
	title = has_accept_as_written (title);&lt;br /&gt;
	if is_set (title) then&lt;br /&gt;
		title = strip_apostrophe_markup (title);								-- strip any apostrophe markup&lt;br /&gt;
	else&lt;br /&gt;
		title = &#039;&#039;;																-- if not set, make sure title is an empty string&lt;br /&gt;
	end&lt;br /&gt;
	if is_set (script) then&lt;br /&gt;
		script = script:gsub (&#039;^%l%l%s*:%s*&#039;, &#039;&#039;);								-- remove language prefix if present (script value may now be empty string)&lt;br /&gt;
		script = strip_apostrophe_markup (script);								-- strip any apostrophe markup&lt;br /&gt;
	else&lt;br /&gt;
		script = &#039;&#039;;															-- if not set, make sure script is an empty string&lt;br /&gt;
	end&lt;br /&gt;
	if is_set (title) and is_set (script) then&lt;br /&gt;
		script = &#039; &#039; .. script;													-- add a space before we concatenate&lt;br /&gt;
	end&lt;br /&gt;
	return title .. script;														-- return the concatenation&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E S C A P E _ L U A _ M A G I C _ C H A R S &amp;gt;----------------------------------&lt;br /&gt;
&lt;br /&gt;
Returns a string where all of Lua&#039;s magic characters have been escaped.  This is important because functions like&lt;br /&gt;
string.gsub() treat their pattern and replace strings as patterns, not literal strings.&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function escape_lua_magic_chars (argument)&lt;br /&gt;
	argument = argument:gsub(&amp;quot;%%&amp;quot;, &amp;quot;%%%%&amp;quot;);										-- replace % with %%&lt;br /&gt;
	argument = argument:gsub(&amp;quot;([%^%$%(%)%.%[%]%*%+%-%?])&amp;quot;, &amp;quot;%%%1&amp;quot;);				-- replace all other Lua magic pattern characters&lt;br /&gt;
	return argument;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; G E T _ C O I N S _ P A G E S &amp;gt;------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Extract page numbers from external wikilinks in any of the |page=, |pages=, or |at= parameters for use in COinS.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function get_coins_pages (pages)&lt;br /&gt;
	local pattern;&lt;br /&gt;
	if not is_set (pages) then return pages; end								-- if no page numbers then we&#039;re done&lt;br /&gt;
	&lt;br /&gt;
	while true do&lt;br /&gt;
		pattern = pages:match(&amp;quot;%[(%w*:?//[^ ]+%s+)[%w%d].*%]&amp;quot;);					-- pattern is the opening bracket, the URL and following space(s): &amp;quot;[url &amp;quot;&lt;br /&gt;
		if nil == pattern then break; end										-- no more URLs&lt;br /&gt;
		pattern = escape_lua_magic_chars (pattern);								-- pattern is not a literal string; escape Lua&#039;s magic pattern characters&lt;br /&gt;
		pages = pages:gsub(pattern, &amp;quot;&amp;quot;);										-- remove as many instances of pattern as possible&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	pages = pages:gsub(&amp;quot;[%[%]]&amp;quot;, &amp;quot;&amp;quot;);											-- remove the brackets&lt;br /&gt;
	pages = pages:gsub(&amp;quot;–&amp;quot;, &amp;quot;-&amp;quot; );												-- replace endashes with hyphens&lt;br /&gt;
	pages = pages:gsub(&amp;quot;&amp;amp;%w+;&amp;quot;, &amp;quot;-&amp;quot; );											-- and replace HTML entities (&amp;amp;ndash; etc.) with hyphens; do we need to replace numerical entities like &amp;amp;#32; and the like?&lt;br /&gt;
	pages = pages:gsub (&#039;%b&amp;lt;&amp;gt;&#039;, &#039;&#039;);											-- remove html-like tags; spans are added to &amp;lt;Pages&amp;gt; by utilities.hyphen_to_dash() which should not appear in COinS metadata&lt;br /&gt;
	return pages;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[=[-------------------------&amp;lt; C O I N S _ R E P L A C E _ M A T H _ S T R I P M A R K E R &amp;gt;------------------&lt;br /&gt;
&lt;br /&gt;
There are three options for math markup rendering that depend on the editor&#039;s math preference settings.  These&lt;br /&gt;
settings are at [[Special:Preferences#mw-prefsection-rendering]] and are&lt;br /&gt;
	PNG images&lt;br /&gt;
	TeX source&lt;br /&gt;
	MathML with SVG or PNG fallback&lt;br /&gt;
&lt;br /&gt;
All three are heavy with HTML and CSS which doesn&#039;t belong in the metadata.&lt;br /&gt;
&lt;br /&gt;
Without this function, the metadata saved in the raw wikitext contained the rendering determined by the settings&lt;br /&gt;
of the last editor to save the page.&lt;br /&gt;
&lt;br /&gt;
This function gets the rendered form of an equation according to the editor&#039;s preference before the page is saved.  It&lt;br /&gt;
then searches the rendering for the text equivalent of the rendered equation and replaces the rendering with that so&lt;br /&gt;
that the page is saved without extraneous HTML/CSS markup and with a reasonably readable text form of the equation.&lt;br /&gt;
&lt;br /&gt;
When a replacement is made, this function returns true and the value with replacement; otherwise false and the initial&lt;br /&gt;
value.  To replace multipe equations it is necessary to call this function from within a loop.&lt;br /&gt;
&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
local function coins_replace_math_stripmarker (value)&lt;br /&gt;
	local stripmarker = cfg.stripmarkers[&#039;math&#039;];&lt;br /&gt;
	local rendering = value:match (stripmarker);								-- is there a math stripmarker&lt;br /&gt;
&lt;br /&gt;
	if not rendering then														-- when value doesn&#039;t have a math stripmarker, abandon this test&lt;br /&gt;
		return false, value;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	rendering = mw.text.unstripNoWiki (rendering);								-- convert stripmarker into rendered value (or nil? &#039;&#039;? when math render error)&lt;br /&gt;
	&lt;br /&gt;
	if rendering:match (&#039;alt=&amp;quot;[^&amp;quot;]+&amp;quot;&#039;) then										-- if PNG math option&lt;br /&gt;
		rendering = rendering:match (&#039;alt=&amp;quot;([^&amp;quot;]+)&amp;quot;&#039;);							-- extract just the math text&lt;br /&gt;
	elseif rendering:match (&#039;$%s+.+%s+%$&#039;) then									-- if TeX math option; $ is legit character that is escapes as \$&lt;br /&gt;
		rendering = rendering:match (&#039;$%s+(.+)%s+%$&#039;)							-- extract just the math text&lt;br /&gt;
	elseif rendering:match (&#039;&amp;lt;annotation[^&amp;gt;]+&amp;gt;.+&amp;lt;/annotation&amp;gt;&#039;) then			-- if MathML math option&lt;br /&gt;
		rendering = rendering:match (&#039;&amp;lt;annotation[^&amp;gt;]+&amp;gt;(.+)&amp;lt;/annotation&amp;gt;&#039;)		-- extract just the math text&lt;br /&gt;
	else&lt;br /&gt;
		return false, value;													-- had math stripmarker but not one of the three defined forms&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return true, value:gsub (stripmarker, rendering, 1);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; C O I N S _ C L E A N U P &amp;gt;----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Cleanup parameter values for the metadata by removing or replacing invisible characters and certain HTML entities.&lt;br /&gt;
&lt;br /&gt;
2015-12-10: there is a bug in mw.text.unstripNoWiki ().  It replaces math stripmarkers with the appropriate content&lt;br /&gt;
when it shouldn&#039;t.  See https://phabricator.wikimedia.org/T121085 and Wikipedia_talk:Lua#stripmarkers_and_mw.text.unstripNoWiki.28.29&lt;br /&gt;
&lt;br /&gt;
TODO: move the replacement patterns and replacement values into a table in /Configuration similar to the invisible&lt;br /&gt;
characters table?&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function coins_cleanup (value)&lt;br /&gt;
	local replaced = true;														-- default state to get the do loop running&lt;br /&gt;
&lt;br /&gt;
	while replaced do															-- loop until all math stripmarkers replaced&lt;br /&gt;
		replaced, value = coins_replace_math_stripmarker (value);				-- replace math stripmarker with text representation of the equation&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	value = value:gsub (cfg.stripmarkers[&#039;math&#039;], &amp;quot;MATH RENDER ERROR&amp;quot;);			-- one or more couldn&#039;t be replaced; insert vague error message&lt;br /&gt;
	&lt;br /&gt;
	value = mw.text.unstripNoWiki (value);										-- replace nowiki stripmarkers with their content&lt;br /&gt;
	value = value:gsub (&#039;&amp;lt;span class=&amp;quot;nowrap&amp;quot; style=&amp;quot;padding%-left:0%.1em;&amp;quot;&amp;gt;&amp;amp;#39;(s?)&amp;lt;/span&amp;gt;&#039;, &amp;quot;&#039;%1&amp;quot;);	-- replace {{&#039;}} or {{&#039;s}} with simple apostrophe or apostrophe-s&lt;br /&gt;
	value = value:gsub (&#039;&amp;amp;nbsp;&#039;, &#039; &#039;);											-- replace &amp;amp;nbsp; entity with plain space&lt;br /&gt;
	value = value:gsub (&#039;\226\128\138&#039;, &#039; &#039;);									-- replace hair space with plain space&lt;br /&gt;
	if not mw.ustring.find (value, cfg.indic_script) then						-- don&#039;t remove zero-width joiner characters from indic script&lt;br /&gt;
		value = value:gsub (&#039;&amp;amp;zwj;&#039;, &#039;&#039;);										-- remove &amp;amp;zwj; entities&lt;br /&gt;
		value = mw.ustring.gsub (value, &#039;[\226\128\141\226\128\139\194\173]&#039;, &#039;&#039;);	-- remove zero-width joiner, zero-width space, soft hyphen&lt;br /&gt;
	end&lt;br /&gt;
	value = value:gsub (&#039;[\009\010\013 ]+&#039;, &#039; &#039;);								-- replace horizontal tab, line feed, carriage return with plain space&lt;br /&gt;
	return value;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; C O I N S &amp;gt;--------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
COinS metadata (see &amp;lt;http://ocoins.info/&amp;gt;) allows automated tools to parse the citation information.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function COinS(data, class)&lt;br /&gt;
	if &#039;table&#039; ~= type(data) or nil == next(data) then&lt;br /&gt;
		return &#039;&#039;;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for k, v in pairs (data) do													-- spin through all of the metadata parameter values&lt;br /&gt;
		if &#039;ID_list&#039; ~= k and &#039;Authors&#039; ~= k then								-- except the ID_list and Author tables (author nowiki stripmarker done when Author table processed)&lt;br /&gt;
			data[k] = coins_cleanup (v);&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local ctx_ver = &amp;quot;Z39.88-2004&amp;quot;;&lt;br /&gt;
	&lt;br /&gt;
	-- treat table strictly as an array with only set values.&lt;br /&gt;
	local OCinSoutput = setmetatable( {}, {&lt;br /&gt;
		__newindex = function(self, key, value)&lt;br /&gt;
			if is_set(value) then&lt;br /&gt;
				rawset( self, #self+1, table.concat{ key, &#039;=&#039;, mw.uri.encode( remove_wiki_link( value ) ) } );&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	});&lt;br /&gt;
	&lt;br /&gt;
	if in_array (class, {&#039;arxiv&#039;, &#039;biorxiv&#039;, &#039;citeseerx&#039;, &#039;medrxiv&#039;, &#039;ssrn&#039;, &#039;journal&#039;, &#039;news&#039;, &#039;magazine&#039;}) or&lt;br /&gt;
		(in_array (class, {&#039;conference&#039;, &#039;interview&#039;, &#039;map&#039;, &#039;press release&#039;, &#039;web&#039;}) and is_set(data.Periodical)) or&lt;br /&gt;
		(&#039;citation&#039; == class and is_set(data.Periodical) and not is_set (data.Encyclopedia)) then&lt;br /&gt;
			OCinSoutput.rft_val_fmt = &amp;quot;info:ofi/fmt:kev:mtx:journal&amp;quot;;			-- journal metadata identifier&lt;br /&gt;
			if in_array (class, {&#039;arxiv&#039;, &#039;biorxiv&#039;, &#039;citeseerx&#039;, &#039;medrxiv&#039;, &#039;ssrn&#039;}) then	-- set genre according to the type of citation template we are rendering&lt;br /&gt;
				OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &amp;quot;preprint&amp;quot;;							-- cite arxiv, cite biorxiv, cite citeseerx, cite medrxiv, cite ssrn&lt;br /&gt;
			elseif &#039;conference&#039; == class then&lt;br /&gt;
				OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &amp;quot;conference&amp;quot;;						-- cite conference (when Periodical set)&lt;br /&gt;
			elseif &#039;web&#039; == class then&lt;br /&gt;
				OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &amp;quot;unknown&amp;quot;;							-- cite web (when Periodical set)&lt;br /&gt;
			else&lt;br /&gt;
				OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &amp;quot;article&amp;quot;;							-- journal and other &#039;periodical&#039; articles&lt;br /&gt;
			end&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.jtitle&amp;quot;] = data.Periodical;						-- journal only&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.atitle&amp;quot;] = data.Title;								-- &#039;periodical&#039; article titles&lt;br /&gt;
&lt;br /&gt;
																				-- these used only for periodicals&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.ssn&amp;quot;] = data.Season;								-- keywords: winter, spring, summer, fall&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.quarter&amp;quot;] = data.Quarter;							-- single digits 1-&amp;gt;first quarter, etc.&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.chron&amp;quot;] = data.Chron;								-- free-form date components&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.volume&amp;quot;] = data.Volume;							-- does not apply to books&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.issue&amp;quot;] = data.Issue;&lt;br /&gt;
			OCinSoutput[&#039;rft.artnum&#039;] = data.ArticleNumber;						-- {{cite journal}} only&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.pages&amp;quot;] = data.Pages;								-- also used in book metadata&lt;br /&gt;
&lt;br /&gt;
	elseif &#039;thesis&#039; ~= class then												-- all others except cite thesis are treated as &#039;book&#039; metadata; genre distinguishes&lt;br /&gt;
		OCinSoutput.rft_val_fmt = &amp;quot;info:ofi/fmt:kev:mtx:book&amp;quot;;					-- book metadata identifier&lt;br /&gt;
		if &#039;report&#039; == class or &#039;techreport&#039; == class then						-- cite report and cite techreport&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &amp;quot;report&amp;quot;;&lt;br /&gt;
		elseif &#039;conference&#039; == class then										-- cite conference when Periodical not set&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &amp;quot;conference&amp;quot;;&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.atitle&amp;quot;] = data.Chapter;							-- conference paper as chapter in proceedings (book)&lt;br /&gt;
		elseif in_array (class, {&#039;book&#039;, &#039;citation&#039;, &#039;encyclopaedia&#039;, &#039;interview&#039;, &#039;map&#039;}) then&lt;br /&gt;
			if is_set (data.Chapter) then&lt;br /&gt;
				OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &amp;quot;bookitem&amp;quot;;&lt;br /&gt;
				OCinSoutput[&amp;quot;rft.atitle&amp;quot;] = data.Chapter;						-- book chapter, encyclopedia article, interview in a book, or map title&lt;br /&gt;
			else&lt;br /&gt;
				if &#039;map&#039; == class or &#039;interview&#039; == class then&lt;br /&gt;
					OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &#039;unknown&#039;;						-- standalone map or interview&lt;br /&gt;
				else&lt;br /&gt;
					OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &#039;book&#039;;							-- book and encyclopedia&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else	-- {&#039;audio-visual&#039;, &#039;AV-media-notes&#039;, &#039;DVD-notes&#039;, &#039;episode&#039;, &#039;interview&#039;, &#039;mailinglist&#039;, &#039;map&#039;, &#039;newsgroup&#039;, &#039;podcast&#039;, &#039;press release&#039;, &#039;serial&#039;, &#039;sign&#039;, &#039;speech&#039;, &#039;web&#039;}&lt;br /&gt;
			OCinSoutput[&amp;quot;rft.genre&amp;quot;] = &amp;quot;unknown&amp;quot;;&lt;br /&gt;
		end&lt;br /&gt;
		OCinSoutput[&amp;quot;rft.btitle&amp;quot;] = data.Title;									-- book only&lt;br /&gt;
		OCinSoutput[&amp;quot;rft.place&amp;quot;] = data.PublicationPlace;						-- book only&lt;br /&gt;
		OCinSoutput[&amp;quot;rft.series&amp;quot;] = data.Series;								-- book only&lt;br /&gt;
		OCinSoutput[&amp;quot;rft.pages&amp;quot;] = data.Pages;									-- book, journal&lt;br /&gt;
		OCinSoutput[&amp;quot;rft.edition&amp;quot;] = data.Edition;								-- book only&lt;br /&gt;
		OCinSoutput[&amp;quot;rft.pub&amp;quot;] = data.PublisherName;							-- book and dissertation&lt;br /&gt;
		&lt;br /&gt;
	else																		-- cite thesis&lt;br /&gt;
		OCinSoutput.rft_val_fmt = &amp;quot;info:ofi/fmt:kev:mtx:dissertation&amp;quot;;			-- dissertation metadata identifier&lt;br /&gt;
		OCinSoutput[&amp;quot;rft.title&amp;quot;] = data.Title;									-- dissertation (also patent but that is not yet supported)&lt;br /&gt;
		OCinSoutput[&amp;quot;rft.degree&amp;quot;] = data.Degree;								-- dissertation only&lt;br /&gt;
		OCinSoutput[&#039;rft.inst&#039;] = data.PublisherName;							-- book and dissertation&lt;br /&gt;
	end&lt;br /&gt;
	-- NB. Not currently supported are &amp;quot;info:ofi/fmt:kev:mtx:patent&amp;quot;, &amp;quot;info:ofi/fmt:kev:mtx:dc&amp;quot;, &amp;quot;info:ofi/fmt:kev:mtx:sch_svc&amp;quot;, &amp;quot;info:ofi/fmt:kev:mtx:ctx&amp;quot;&lt;br /&gt;
																				-- and now common parameters (as much as possible)&lt;br /&gt;
	OCinSoutput[&amp;quot;rft.date&amp;quot;] = data.Date;										-- book, journal, dissertation&lt;br /&gt;
&lt;br /&gt;
	for k, v in pairs( data.ID_list ) do										-- what to do about these? For now assume that they are common to all?&lt;br /&gt;
		if k == &#039;ISBN&#039; then v = v:gsub( &amp;quot;[^-0-9X]&amp;quot;, &amp;quot;&amp;quot; ); end&lt;br /&gt;
		local id = cfg.id_handlers[k].COinS;&lt;br /&gt;
		if string.sub( id or &amp;quot;&amp;quot;, 1, 4 ) == &#039;info&#039; then							-- for ids that are in the info:registry&lt;br /&gt;
			OCinSoutput[&amp;quot;rft_id&amp;quot;] = table.concat{ id, &amp;quot;/&amp;quot;, v };&lt;br /&gt;
		elseif string.sub (id or &amp;quot;&amp;quot;, 1, 3 ) == &#039;rft&#039; then						-- for isbn, issn, eissn, etc. that have defined COinS keywords&lt;br /&gt;
			OCinSoutput[ id ] = v;&lt;br /&gt;
		elseif &#039;url&#039; == id then													-- for urls that are assembled in ~/Identifiers; |asin= and |ol=&lt;br /&gt;
			OCinSoutput[&amp;quot;rft_id&amp;quot;] = table.concat ({data.ID_list[k], &amp;quot;#id-name=&amp;quot;, cfg.id_handlers[k].label});&lt;br /&gt;
		elseif id then															-- when cfg.id_handlers[k].COinS is not nil so urls created here&lt;br /&gt;
			OCinSoutput[&amp;quot;rft_id&amp;quot;] = table.concat{ cfg.id_handlers[k].prefix, v, cfg.id_handlers[k].suffix or &#039;&#039;, &amp;quot;#id-name=&amp;quot;, cfg.id_handlers[k].label };	-- others; provide a URL and indicate identifier name as #fragment (human-readable, but transparent to browsers)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local last, first;&lt;br /&gt;
	for k, v in ipairs( data.Authors ) do&lt;br /&gt;
		last, first = coins_cleanup (v.last), coins_cleanup (v.first or &#039;&#039;);	-- replace any nowiki stripmarkers, non-printing or invisible characters&lt;br /&gt;
		if k == 1 then															-- for the first author name only&lt;br /&gt;
			if is_set(last) and is_set(first) then								-- set these COinS values if |first= and |last= specify the first author name&lt;br /&gt;
				OCinSoutput[&amp;quot;rft.aulast&amp;quot;] = last;								-- book, journal, dissertation&lt;br /&gt;
				OCinSoutput[&amp;quot;rft.aufirst&amp;quot;] = first;								-- book, journal, dissertation&lt;br /&gt;
			elseif is_set(last) then &lt;br /&gt;
				OCinSoutput[&amp;quot;rft.au&amp;quot;] = last;									-- book, journal, dissertation -- otherwise use this form for the first name&lt;br /&gt;
			end&lt;br /&gt;
		else																	-- for all other authors&lt;br /&gt;
			if is_set(last) and is_set(first) then&lt;br /&gt;
				OCinSoutput[&amp;quot;rft.au&amp;quot;] = table.concat{ last, &amp;quot;, &amp;quot;, first };		-- book, journal, dissertation&lt;br /&gt;
			elseif is_set(last) then&lt;br /&gt;
				OCinSoutput[&amp;quot;rft.au&amp;quot;] = last;									-- book, journal, dissertation&lt;br /&gt;
			end&lt;br /&gt;
			-- TODO: At present we do not report &amp;quot;et al.&amp;quot;. Add anything special if this condition applies?&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	OCinSoutput.rft_id = data.URL;&lt;br /&gt;
	OCinSoutput.rfr_id = table.concat{ &amp;quot;info:sid/&amp;quot;, mw.site.server:match( &amp;quot;[^/]*$&amp;quot; ), &amp;quot;:&amp;quot;, data.RawPage };&lt;br /&gt;
&lt;br /&gt;
	-- TODO: Add optional extra info:&lt;br /&gt;
	-- rfr_dat=#REVISION&amp;lt;version&amp;gt; (referrer private data)&lt;br /&gt;
	-- ctx_id=&amp;lt;data.RawPage&amp;gt;#&amp;lt;ref&amp;gt; (identifier for the context object)&lt;br /&gt;
	-- ctx_tim=&amp;lt;ts&amp;gt; (timestamp in format yyyy-mm-ddThh:mm:ssTZD or yyyy-mm-dd)&lt;br /&gt;
	-- ctx_enc=info:ofi/enc:UTF-8 (character encoding)&lt;br /&gt;
	&lt;br /&gt;
	OCinSoutput = setmetatable( OCinSoutput, nil );&lt;br /&gt;
&lt;br /&gt;
	-- sort with version string always first, and combine.&lt;br /&gt;
	-- table.sort( OCinSoutput );&lt;br /&gt;
	table.insert( OCinSoutput, 1, &amp;quot;ctx_ver=&amp;quot; .. ctx_ver ); -- such as &amp;quot;Z39.88-2004&amp;quot;&lt;br /&gt;
	return table.concat(OCinSoutput, &amp;quot;&amp;amp;&amp;quot;);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; S E T _ S E L E C T E D _ M O D U L E S &amp;gt;--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Sets local cfg table and imported functions table to same (live or sandbox) as that used by the other modules.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function set_selected_modules (cfg_table_ptr, utilities_page_ptr)&lt;br /&gt;
	cfg = cfg_table_ptr;&lt;br /&gt;
&lt;br /&gt;
	has_accept_as_written = utilities_page_ptr.has_accept_as_written;			-- import functions from selected Module:Citation/CS1/Utilities module&lt;br /&gt;
	is_set = utilities_page_ptr.is_set;&lt;br /&gt;
	in_array = utilities_page_ptr.in_array;&lt;br /&gt;
	remove_wiki_link = utilities_page_ptr.remove_wiki_link;&lt;br /&gt;
	strip_apostrophe_markup = utilities_page_ptr.strip_apostrophe_markup;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E X P O R T E D   F U N C T I O N S &amp;gt;------------------------------------------&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	make_coins_title = make_coins_title,&lt;br /&gt;
	get_coins_pages = get_coins_pages,&lt;br /&gt;
	COinS = COinS,&lt;br /&gt;
	set_selected_modules = set_selected_modules,&lt;br /&gt;
	}&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Module:Citation/CS1/Identifiers&amp;diff=6661</id>
		<title>Module:Citation/CS1/Identifiers</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Module:Citation/CS1/Identifiers&amp;diff=6661"/>
		<updated>2025-11-01T21:42:35Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;--[[--------------------------&amp;lt; F O R W A R D   D E C L A R A T I O N S &amp;gt;--------------------------------------&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local has_accept_as_written, is_set, in_array, set_message, select_one,			-- functions in Module:Citation/CS1/Utilities&lt;br /&gt;
		substitute, make_wikilink;&lt;br /&gt;
&lt;br /&gt;
local z;																		-- table of tables defined in Module:Citation/CS1/Utilities&lt;br /&gt;
&lt;br /&gt;
local cfg;																		-- table of configuration tables that are defined in Module:Citation/CS1/Configuration&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; P A G E   S C O P E   V A R I A B L E S &amp;gt;--------------------------------------&lt;br /&gt;
&lt;br /&gt;
declare variables here that have page-wide scope that are not brought in from other modules; that are created here and used here&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local auto_link_urls = {};														-- holds identifier URLs for those identifiers that can auto-link |title=&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--============================&amp;lt;&amp;lt; H E L P E R   F U N C T I O N S &amp;gt;&amp;gt;============================================&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; W I K I D A T A _ A R T I C L E _ N A M E _ G E T &amp;gt;----------------------------&lt;br /&gt;
&lt;br /&gt;
as an aid to internationalizing identifier-label wikilinks, gets identifier article names from Wikidata.&lt;br /&gt;
&lt;br /&gt;
returns w:&amp;lt;lang code&amp;gt;:&amp;lt;article title&amp;gt; when &amp;lt;q&amp;gt; has an &amp;lt;article title&amp;gt; for &amp;lt;lang code&amp;gt;; nil else. &#039;w:&amp;lt;lang code&amp;gt;&#039;&lt;br /&gt;
ensures that sister project (like wiktionary) will link to the &amp;lt;lang code&amp;gt;.wikipedia article.&lt;br /&gt;
&lt;br /&gt;
for identifiers that do not have &amp;lt;q&amp;gt;, returns nil&lt;br /&gt;
&lt;br /&gt;
for wikis that do not have mw.wikibase installed, returns nil&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function wikidata_article_name_get (q)&lt;br /&gt;
	if not is_set (q) or (q and not mw.wikibase) then							-- when no q number or when a q number but mw.wikibase not installed on this wiki&lt;br /&gt;
		return nil;																-- abandon&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local wd_article;&lt;br /&gt;
	local this_wiki_code = cfg.this_wiki_code;									-- Wikipedia subdomain; &#039;en&#039; for en.wikipedia.org&lt;br /&gt;
&lt;br /&gt;
	wd_article = mw.wikibase.getSitelink (q, this_wiki_code .. &#039;wiki&#039;);			-- fetch article title from WD; nil when no title available at this wiki&lt;br /&gt;
&lt;br /&gt;
	if wd_article then&lt;br /&gt;
		wd_article = table.concat ({&#039;w:&#039;, this_wiki_code, &#039;:&#039;, wd_article});	-- interwiki-style link without brackets if taken from WD; leading &#039;w:&#039; required&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return wd_article;															-- article title from WD; nil else&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; L A B E L _ L I N K _ M A K E &amp;gt;------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
common function to create a link for an identifier label from handler table or from Wikidata&lt;br /&gt;
&lt;br /&gt;
returns the first available of:&lt;br /&gt;
	1. redirect from local wiki&#039;s handler table (if enabled)&lt;br /&gt;
	2. Wikidata sitelink to the local language wikipedia article (if there is a Wikidata entry for this identifier in the local language)&lt;br /&gt;
	3. link to wikipedia article specified in the local wiki&#039;s handler table&lt;br /&gt;
	&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function label_link_make (handler)&lt;br /&gt;
	local wd_article;&lt;br /&gt;
	&lt;br /&gt;
	if not (cfg.use_identifier_redirects and is_set (handler.redirect)) then	-- redirect has priority so if enabled and available don&#039;t fetch from Wikidata because expensive&lt;br /&gt;
		wd_article = wikidata_article_name_get (handler.q);						-- if Wikidata has an article title for this wiki, get it;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return (cfg.use_identifier_redirects and is_set (handler.redirect) and handler.redirect) or wd_article or handler.link;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E X T E R N A L _ L I N K _ I D &amp;gt;----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Formats a wiki-style external link&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function external_link_id (options)&lt;br /&gt;
	local url_string = options.id;&lt;br /&gt;
	local ext_link;&lt;br /&gt;
	local this_wiki_code = cfg.this_wiki_code;									-- Wikipedia subdomain; &#039;en&#039; for en.wikipedia.org&lt;br /&gt;
	local wd_article;															-- article title from Wikidata&lt;br /&gt;
	&lt;br /&gt;
	if options.encode == true or options.encode == nil then&lt;br /&gt;
		url_string = mw.uri.encode (url_string, &#039;PATH&#039;);&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if options.auto_link and is_set (options.access) then&lt;br /&gt;
		auto_link_urls[options.auto_link] = table.concat ({options.prefix, url_string, options.suffix});&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	ext_link = mw.ustring.format (&#039;[%s%s%s %s]&#039;, options.prefix, url_string, options.suffix or &amp;quot;&amp;quot;, mw.text.nowiki (options.id));&lt;br /&gt;
	if is_set (options.access) then&lt;br /&gt;
		ext_link = substitute (cfg.presentation[&#039;ext-link-access-signal&#039;], {cfg.presentation[options.access].class, cfg.presentation[options.access].title, ext_link});	-- add the free-to-read / paywall lock&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return table.concat	({&lt;br /&gt;
		make_wikilink (label_link_make (options), options.label),				-- redirect, Wikidata link, or locally specified link (in that order)&lt;br /&gt;
		options.separator or &#039;&amp;amp;nbsp;&#039;,&lt;br /&gt;
		ext_link&lt;br /&gt;
		});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I N T E R N A L _ L I N K _ I D &amp;gt;----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Formats a wiki-style internal link&lt;br /&gt;
&lt;br /&gt;
TODO: Does not currently need to support options.access, options.encode, auto-linking and COinS (as in external_link_id),&lt;br /&gt;
but may be needed in the future for :m:Interwiki_map custom-prefixes like :arxiv:, :bibcode:, :DOI:, :hdl:, :ISSN:,&lt;br /&gt;
:JSTOR:, :Openlibrary:, :PMID:, :RFC:.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function internal_link_id (options)&lt;br /&gt;
	local id = mw.ustring.gsub (options.id, &#039;%d&#039;, cfg.date_names.local_digits);	-- translate &#039;local&#039; digits to Western 0-9&lt;br /&gt;
&lt;br /&gt;
	return table.concat (&lt;br /&gt;
		{&lt;br /&gt;
		make_wikilink (label_link_make (options), options.label),				-- wiki-link the identifier label&lt;br /&gt;
		options.separator or &#039;&amp;amp;nbsp;&#039;,											-- add the separator&lt;br /&gt;
		make_wikilink (&lt;br /&gt;
			table.concat (&lt;br /&gt;
				{&lt;br /&gt;
				options.prefix,&lt;br /&gt;
				id,																-- translated to Western digits&lt;br /&gt;
				options.suffix or &#039;&#039;&lt;br /&gt;
				}),&lt;br /&gt;
			substitute (cfg.presentation[&#039;bdi&#039;], {&#039;&#039;, mw.text.nowiki (options.id)})	-- bdi tags to prevent Latin script identifiers from being reversed at RTL language wikis&lt;br /&gt;
			);																	-- nowiki because MediaWiki still has magic links for ISBN and the like; TODO: is it really required?&lt;br /&gt;
		});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S _ E M B A R G O E D &amp;gt;------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Determines if a PMC identifier&#039;s online version is embargoed. Compares the date in |pmc-embargo-date= against&lt;br /&gt;
today&#039;s date.  If embargo date is in the future, returns the content of |pmc-embargo-date=; otherwise, returns&lt;br /&gt;
an empty string because the embargo has expired or because |pmc-embargo-date= was not set in this cite.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function is_embargoed (embargo)&lt;br /&gt;
	if is_set (embargo) then&lt;br /&gt;
		local lang = mw.getContentLanguage();&lt;br /&gt;
		local good1, embargo_date, todays_date;&lt;br /&gt;
		good1, embargo_date = pcall (lang.formatDate, lang, &#039;U&#039;, embargo);&lt;br /&gt;
		todays_date = lang:formatDate (&#039;U&#039;);&lt;br /&gt;
	&lt;br /&gt;
		if good1 then															-- if embargo date is a good date&lt;br /&gt;
			if tonumber (embargo_date) &amp;gt;= tonumber (todays_date) then			-- is embargo date is in the future?&lt;br /&gt;
				return embargo;													-- still embargoed&lt;br /&gt;
			else&lt;br /&gt;
				set_message (&#039;maint_pmc_embargo&#039;);								-- embargo has expired; add main cat&lt;br /&gt;
				return &#039;&#039;;														-- unset because embargo has expired&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return &#039;&#039;;																	-- |pmc-embargo-date= not set return empty string&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[=[-------------------------&amp;lt; I S _ V A L I D _ R X I V _ D A T E &amp;gt;------------------------------------------&lt;br /&gt;
&lt;br /&gt;
for biorxiv, returns true if:&lt;br /&gt;
	2019-12-11T00:00Z &amp;lt;= biorxiv_date &amp;lt; today + 2 days&lt;br /&gt;
for medrxiv, returns true if:&lt;br /&gt;
	2020-01-01T00:00Z &amp;lt;= medrxiv_date &amp;lt; today + 2 days&lt;br /&gt;
	&lt;br /&gt;
The dated form of biorxiv identifier has a start date of 2019-12-11.  The Unix timestamp for that date is {{#time:U|2019-12-11}} = 1576022400&lt;br /&gt;
The medrxiv identifier has a start date of 2020-01-01.  The Unix timestamp for that date is {{#time:U|2020-01-01}} = 1577836800&lt;br /&gt;
&lt;br /&gt;
&amp;lt;rxiv_date&amp;gt; is the date provided in those |biorxiv= parameter values that are dated and in |medrxiv= parameter values at time 00:00:00 UTC&lt;br /&gt;
&amp;lt;today&amp;gt; is the current date at time 00:00:00 UTC plus 48 hours&lt;br /&gt;
	if today&#039;s date is 2023-01-01T00:00:00 then&lt;br /&gt;
		adding 24 hours gives 2023-01-02T00:00:00 – one second more than today&lt;br /&gt;
		adding 24 hours gives 2023-01-03T00:00:00 – one second more than tomorrow&lt;br /&gt;
&lt;br /&gt;
inputs:&lt;br /&gt;
	&amp;lt;y&amp;gt;, &amp;lt;m&amp;gt;, &amp;lt;d&amp;gt; – year, month, day parts of the date from the birxiv or medrxiv identifier&lt;br /&gt;
	&amp;lt;select&amp;gt; &#039;b&#039; for biorxiv, &#039;m&#039; for medrxiv; defaults to &#039;b&#039;&lt;br /&gt;
&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
local function is_valid_rxiv_date (y, m, d, select)&lt;br /&gt;
	if 0 == tonumber (m) and 12 &amp;lt; tonumber (m) then								-- &amp;lt;m&amp;gt; must be a number 1–12&lt;br /&gt;
		return false;&lt;br /&gt;
	end&lt;br /&gt;
	if 0 == tonumber (d) and 31 &amp;lt; tonumber (d) then								-- &amp;lt;d&amp;gt; must be a number 1–31; TODO: account for month length and leap yer?&lt;br /&gt;
		return false;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local rxiv_date = table.concat ({y, m, d}, &#039;-&#039;);							-- make ymd date string&lt;br /&gt;
	local good1, good2;&lt;br /&gt;
	local rxiv_ts, tomorrow_ts;													-- to hold Unix timestamps representing the dates&lt;br /&gt;
	local lang_object = mw.getContentLanguage();&lt;br /&gt;
&lt;br /&gt;
	good1, rxiv_ts = pcall (lang_object.formatDate, lang_object, &#039;U&#039;, rxiv_date);		-- convert rxiv_date value to Unix timestamp &lt;br /&gt;
	good2, tomorrow_ts = pcall (lang_object.formatDate, lang_object, &#039;U&#039;, &#039;today + 2 days&#039; );	-- today midnight + 2 days is one second more than all day tomorrow&lt;br /&gt;
	&lt;br /&gt;
	if good1 and good2 then														-- lang.formatDate() returns a timestamp in the local script which tonumber() may not understand&lt;br /&gt;
		rxiv_ts = tonumber (rxiv_ts) or lang_object:parseFormattedNumber (rxiv_ts);	-- convert to numbers for the comparison;&lt;br /&gt;
		tomorrow_ts = tonumber (tomorrow_ts) or lang_object:parseFormattedNumber (tomorrow_ts);&lt;br /&gt;
	else&lt;br /&gt;
		return false;															-- one or both failed to convert to Unix timestamp&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local limit_ts = ((select and (&#039;m&#039; == select)) and 1577836800) or 1576022400;	-- choose the appropriate limit timesatmp&lt;br /&gt;
&lt;br /&gt;
	return ((limit_ts &amp;lt;= rxiv_ts) and (rxiv_ts &amp;lt; tomorrow_ts))					-- limit_ts &amp;lt;= rxiv_date &amp;lt; tomorrow&#039;s date&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; IS _ V A L I D _ I S X N &amp;gt;-----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ISBN-10 and ISSN validator code calculates checksum across all ISBN/ISSN digits including the check digit.&lt;br /&gt;
ISBN-13 is checked in isbn().&lt;br /&gt;
&lt;br /&gt;
If the number is valid the result will be 0. Before calling this function, ISBN/ISSN must be checked for length&lt;br /&gt;
and stripped of dashes, spaces and other non-ISxN characters.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function is_valid_isxn (isxn_str, len)&lt;br /&gt;
	local temp = 0;&lt;br /&gt;
	isxn_str = { isxn_str:byte(1, len) };										-- make a table of byte values &#039;0&#039; → 0x30 .. &#039;9&#039; → 0x39, &#039;X&#039; → 0x58&lt;br /&gt;
	len = len + 1;																-- adjust to be a loop counter&lt;br /&gt;
	for i, v in ipairs (isxn_str) do											-- loop through all of the bytes and calculate the checksum&lt;br /&gt;
		if v == string.byte (&amp;quot;X&amp;quot; ) then											-- if checkdigit is X (compares the byte value of &#039;X&#039; which is 0x58)&lt;br /&gt;
			temp = temp + 10 * (len - i);										-- it represents 10 decimal&lt;br /&gt;
		else&lt;br /&gt;
			temp = temp + tonumber (string.char (v) )*(len-i);&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return temp % 11 == 0;														-- returns true if calculation result is zero&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; IS _ V A L I D _ I S X N _ 1 3 &amp;gt;-----------------------------------------------&lt;br /&gt;
&lt;br /&gt;
ISBN-13 and ISMN validator code calculates checksum across all 13 ISBN/ISMN digits including the check digit.&lt;br /&gt;
If the number is valid, the result will be 0. Before calling this function, ISBN-13/ISMN must be checked for length&lt;br /&gt;
and stripped of dashes, spaces and other non-ISxN-13 characters.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function is_valid_isxn_13 (isxn_str)&lt;br /&gt;
	local temp=0;&lt;br /&gt;
	&lt;br /&gt;
	isxn_str = { isxn_str:byte(1, 13) };										-- make a table of byte values &#039;0&#039; → 0x30 .. &#039;9&#039; → 0x39&lt;br /&gt;
	for i, v in ipairs (isxn_str) do&lt;br /&gt;
		temp = temp + (3 - 2*(i % 2)) * tonumber (string.char (v) );			-- multiply odd index digits by 1, even index digits by 3 and sum; includes check digit&lt;br /&gt;
	end&lt;br /&gt;
	return temp % 10 == 0;														-- sum modulo 10 is zero when ISBN-13/ISMN is correct&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; N O R M A L I Z E _ L C C N &amp;gt;--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
LCCN normalization (https://www.loc.gov/marc/lccn-namespace.html#normalization)&lt;br /&gt;
1. Remove all blanks.&lt;br /&gt;
2. If there is a forward slash (/) in the string, remove it, and remove all characters to the right of the forward slash.&lt;br /&gt;
3. If there is a hyphen in the string:&lt;br /&gt;
	a. Remove it.&lt;br /&gt;
	b. Inspect the substring following (to the right of) the (removed) hyphen. Then (and assuming that steps 1 and 2 have been carried out):&lt;br /&gt;
		1. All these characters should be digits, and there should be six or less. (not done in this function)&lt;br /&gt;
		2. If the length of the substring is less than 6, left-fill the substring with zeroes until the length is six.&lt;br /&gt;
&lt;br /&gt;
Returns a normalized LCCN for lccn() to validate.  There is no error checking (step 3.b.1) performed in this function.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function normalize_lccn (lccn)&lt;br /&gt;
	lccn = lccn:gsub (&amp;quot;%s&amp;quot;, &amp;quot;&amp;quot;);												-- 1. strip whitespace&lt;br /&gt;
&lt;br /&gt;
	if nil ~= string.find (lccn, &#039;/&#039;) then&lt;br /&gt;
		lccn = lccn:match (&amp;quot;(.-)/&amp;quot;);											-- 2. remove forward slash and all character to the right of it&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local prefix&lt;br /&gt;
	local suffix&lt;br /&gt;
	prefix, suffix = lccn:match (&amp;quot;(.+)%-(.+)&amp;quot;);									-- 3.a remove hyphen by splitting the string into prefix and suffix&lt;br /&gt;
&lt;br /&gt;
	if nil ~= suffix then														-- if there was a hyphen&lt;br /&gt;
		suffix = string.rep(&amp;quot;0&amp;quot;, 6-string.len (suffix)) .. suffix;				-- 3.b.2 left fill the suffix with 0s if suffix length less than 6&lt;br /&gt;
		lccn = prefix..suffix;													-- reassemble the LCCN&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return lccn;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--============================&amp;lt;&amp;lt; I D E N T I F I E R   F U N C T I O N S &amp;gt;&amp;gt;====================================&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; A R X I V &amp;gt;--------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
See: https://arxiv.org/help/arxiv_identifier&lt;br /&gt;
&lt;br /&gt;
format and error check arXiv identifier.  There are three valid forms of the identifier:&lt;br /&gt;
the first form, valid only between date codes 9107 and 0703, is:&lt;br /&gt;
	arXiv:&amp;lt;archive&amp;gt;.&amp;lt;class&amp;gt;/&amp;lt;date code&amp;gt;&amp;lt;number&amp;gt;&amp;lt;version&amp;gt;&lt;br /&gt;
where:&lt;br /&gt;
	&amp;lt;archive&amp;gt; is a string of alpha characters - may be hyphenated; no other punctuation&lt;br /&gt;
	&amp;lt;class&amp;gt; is a string of alpha characters - may be hyphenated; no other punctuation; not the same as |class= parameter which is not supported in this form&lt;br /&gt;
	&amp;lt;date code&amp;gt; is four digits in the form YYMM where YY is the last two digits of the four-digit year and MM is the month number January = 01&lt;br /&gt;
		first digit of YY for this form can only 9 and 0&lt;br /&gt;
	&amp;lt;number&amp;gt; is a three-digit number&lt;br /&gt;
	&amp;lt;version&amp;gt; is a 1 or more digit number preceded with a lowercase v; no spaces (undocumented)&lt;br /&gt;
	&lt;br /&gt;
the second form, valid from April 2007 through December 2014 is:&lt;br /&gt;
	arXiv:&amp;lt;date code&amp;gt;.&amp;lt;number&amp;gt;&amp;lt;version&amp;gt;&lt;br /&gt;
where:&lt;br /&gt;
	&amp;lt;date code&amp;gt; is four digits in the form YYMM where YY is the last two digits of the four-digit year and MM is the month number January = 01&lt;br /&gt;
	&amp;lt;number&amp;gt; is a four-digit number&lt;br /&gt;
	&amp;lt;version&amp;gt; is a 1 or more digit number preceded with a lowercase v; no spaces&lt;br /&gt;
&lt;br /&gt;
the third form, valid from January 2015 is:&lt;br /&gt;
	arXiv:&amp;lt;date code&amp;gt;.&amp;lt;number&amp;gt;&amp;lt;version&amp;gt;&lt;br /&gt;
where:&lt;br /&gt;
	&amp;lt;date code&amp;gt; and &amp;lt;version&amp;gt; are as defined for 0704-1412&lt;br /&gt;
	&amp;lt;number&amp;gt; is a five-digit number&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function arxiv (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local class = options.Class;												-- TODO: lowercase?&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local year, month, version;&lt;br /&gt;
	local err_msg = false;														-- assume no error message&lt;br /&gt;
	local text;																	-- output text&lt;br /&gt;
	&lt;br /&gt;
	if id:match(&amp;quot;^%a[%a%.%-]+/[90]%d[01]%d%d%d%d$&amp;quot;) or id:match(&amp;quot;^%a[%a%.%-]+/[90]%d[01]%d%d%d%dv%d+$&amp;quot;) then	-- test for the 9107-0703 format with or without version&lt;br /&gt;
		year, month = id:match(&amp;quot;^%a[%a%.%-]+/([90]%d)([01]%d)%d%d%d[v%d]*$&amp;quot;);&lt;br /&gt;
		year = tonumber (year);&lt;br /&gt;
		month = tonumber (month);&lt;br /&gt;
		if ((not (90 &amp;lt; year or 8 &amp;gt; year)) or (1 &amp;gt; month or 12 &amp;lt; month)) or		-- if invalid year or invalid month&lt;br /&gt;
			((91 == year and 7 &amp;gt; month) or (7 == year and 3 &amp;lt; month)) then		-- if years ok, are starting and ending months ok?&lt;br /&gt;
				err_msg = true;													-- flag for error message&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	elseif id:match(&amp;quot;^%d%d[01]%d%.%d%d%d%d$&amp;quot;) or id:match(&amp;quot;^%d%d[01]%d%.%d%d%d%dv%d+$&amp;quot;) then	-- test for the 0704-1412 with or without version&lt;br /&gt;
		year, month = id:match(&amp;quot;^(%d%d)([01]%d)%.%d%d%d%d[v%d]*$&amp;quot;);&lt;br /&gt;
		year = tonumber (year);&lt;br /&gt;
		month = tonumber (month);&lt;br /&gt;
		if ((7 &amp;gt; year) or (14 &amp;lt; year) or (1 &amp;gt; month or 12 &amp;lt; month)) or			-- is year invalid or is month invalid? (doesn&#039;t test for future years)&lt;br /&gt;
			((7 == year) and (4 &amp;gt; month)) then									-- when year is 07, is month invalid (before April)?&lt;br /&gt;
				err_msg = true;													-- flag for error message&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	elseif id:match(&amp;quot;^%d%d[01]%d%.%d%d%d%d%d$&amp;quot;) or id:match(&amp;quot;^%d%d[01]%d%.%d%d%d%d%dv%d+$&amp;quot;) then	-- test for the 1501- format with or without version&lt;br /&gt;
		year, month = id:match(&amp;quot;^(%d%d)([01]%d)%.%d%d%d%d%d[v%d]*$&amp;quot;);&lt;br /&gt;
		year = tonumber (year);&lt;br /&gt;
		month = tonumber (month);&lt;br /&gt;
		if ((15 &amp;gt; year) or (1 &amp;gt; month or 12 &amp;lt; month)) then						-- is year invalid or is month invalid? (doesn&#039;t test for future years)&lt;br /&gt;
			err_msg = true;														-- flag for error message&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	else&lt;br /&gt;
		err_msg = true;															-- not a recognized format; flag for error message&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if err_msg then&lt;br /&gt;
		options.coins_list_t[&#039;ARXIV&#039;] = nil;									-- when error, unset so not included in COinS&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local err_msg_t = {};&lt;br /&gt;
	if err_msg then&lt;br /&gt;
		set_message (&#039;err_bad_arxiv&#039;);&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	text = external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
			prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = handler.access});&lt;br /&gt;
&lt;br /&gt;
	if is_set (class) then&lt;br /&gt;
		if id:match (&#039;^%d+&#039;) then&lt;br /&gt;
			text = table.concat ({text, &#039; [[https://arxiv.org/archive/&#039;, class, &#039; &#039;, class, &#039;]]&#039;});	-- external link within square brackets, not wikilink&lt;br /&gt;
		else&lt;br /&gt;
			set_message (&#039;err_class_ignored&#039;);&lt;br /&gt;
		end&lt;br /&gt;
	else																		-- class not set&lt;br /&gt;
		if id:match (&#039;^%d+&#039;) and options.CitationClass == &#039;arxiv&#039; then			-- new (post 2007) format; {{cite arxiv}} only&lt;br /&gt;
			set_message (&#039;maint_missing_class&#039;);								-- add maint cat&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return text;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; B I B C O D E &amp;gt;--------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Validates (sort of) and formats a bibcode ID.&lt;br /&gt;
&lt;br /&gt;
Format for bibcodes is specified here: https://adsabs.harvard.edu/abs_doc/help_pages/data.html#bibcodes&lt;br /&gt;
&lt;br /&gt;
But, this: 2015arXiv151206696F is apparently valid so apparently, the only things that really matter are length, 19 characters&lt;br /&gt;
and first four digits must be a year.  This function makes these tests:&lt;br /&gt;
	length must be 19 characters&lt;br /&gt;
	characters in position&lt;br /&gt;
		1–4 must be digits and must represent a year in the range of 1000 – next year&lt;br /&gt;
		5 must be a letter&lt;br /&gt;
		6–8 must be letter, digit, ampersand, or dot (ampersand cannot directly precede a dot; &amp;amp;. )&lt;br /&gt;
		9–18 must be letter, digit, or dot&lt;br /&gt;
		19 must be a letter or dot&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function bibcode (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local access = options.access;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local ignore_invalid = options.accept;&lt;br /&gt;
	local err_type;&lt;br /&gt;
	local err_msg = &#039;&#039;;&lt;br /&gt;
	local year;&lt;br /&gt;
&lt;br /&gt;
	local text = external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
		prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode,&lt;br /&gt;
		access = access});&lt;br /&gt;
	&lt;br /&gt;
	if 19 ~= id:len() then&lt;br /&gt;
		err_type = cfg.err_msg_supl.length;&lt;br /&gt;
	else&lt;br /&gt;
		year = id:match (&amp;quot;^(%d%d%d%d)[%a][%w&amp;amp;%.][%w&amp;amp;%.][%w&amp;amp;%.][%w.]+[%a%.]$&amp;quot;);&lt;br /&gt;
		if not year then														-- if nil then no pattern match&lt;br /&gt;
			err_type = cfg.err_msg_supl.value;									-- so value error&lt;br /&gt;
		else&lt;br /&gt;
			local next_year = tonumber (os.date (&#039;%Y&#039;)) + 1;					-- get the current year as a number and add one for next year&lt;br /&gt;
			year = tonumber (year);												-- convert year portion of bibcode to a number&lt;br /&gt;
			if (1000 &amp;gt; year) or (year &amp;gt; next_year) then&lt;br /&gt;
				err_type = cfg.err_msg_supl.year;								-- year out of bounds&lt;br /&gt;
			end&lt;br /&gt;
			if id:find(&#039;&amp;amp;%.&#039;) then&lt;br /&gt;
				err_type = cfg.err_msg_supl.journal;							-- journal abbreviation must not have &#039;&amp;amp;.&#039; (if it does it&#039;s missing a letter)&lt;br /&gt;
			end&lt;br /&gt;
			if id:match (&#039;.........%.tmp%.&#039;) then								-- temporary bibcodes when positions 10–14 are &#039;.tmp.&#039;&lt;br /&gt;
				set_message (&#039;maint_bibcode&#039;);&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if is_set (err_type) and not ignore_invalid then							-- if there was an error detected and accept-as-written markup not used&lt;br /&gt;
		set_message (&#039;err_bad_bibcode&#039;, {err_type});&lt;br /&gt;
		options.coins_list_t[&#039;BIBCODE&#039;] = nil;									-- when error, unset so not included in COinS&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return text;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; B I O R X I V &amp;gt;-----------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Format bioRxiv ID and do simple error checking.  Before 2019-12-11, biorXiv IDs were 10.1101/ followed by exactly&lt;br /&gt;
6 digits.  After 2019-12-11, biorXiv IDs retained the six-digit identifier but prefixed that with a yyyy.mm.dd. &lt;br /&gt;
date and suffixed with an optional version identifier.&lt;br /&gt;
&lt;br /&gt;
The bioRxiv ID is the string of characters:&lt;br /&gt;
	https://doi.org/10.1101/078733 -&amp;gt; 10.1101/078733&lt;br /&gt;
or a date followed by a six-digit number followed by an optional version indicator &#039;v&#039; and one or more digits:&lt;br /&gt;
	https://www.biorxiv.org/content/10.1101/2019.12.11.123456v2 -&amp;gt; 10.1101/2019.12.11.123456v2&lt;br /&gt;
	&lt;br /&gt;
see https://www.biorxiv.org/about-biorxiv&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function biorxiv (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local err_msg = true;														-- flag; assume that there will be an error&lt;br /&gt;
	&lt;br /&gt;
	local patterns = {&lt;br /&gt;
		&#039;^10%.1101/%d%d%d%d%d%d$&#039;,												-- simple 6-digit identifier (before 2019-12-11)&lt;br /&gt;
		&#039;^10%.1101/(20%d%d)%.(%d%d)%.(%d%d)%.%d%d%d%d%d%dv%d+$&#039;,				-- y.m.d. date + 6-digit identifier + version (after 2019-12-11)&lt;br /&gt;
		&#039;^10%.1101/(20%d%d)%.(%d%d)%.(%d%d)%.%d%d%d%d%d%d$&#039;,					-- y.m.d. date + 6-digit identifier (after 2019-12-11)&lt;br /&gt;
		}&lt;br /&gt;
	&lt;br /&gt;
	for _, pattern in ipairs (patterns) do										-- spin through the patterns looking for a match&lt;br /&gt;
		if id:match (pattern) then&lt;br /&gt;
			local y, m, d = id:match (pattern);									-- found a match, attempt to get year, month and date from the identifier&lt;br /&gt;
&lt;br /&gt;
			if m then															-- m is nil when id is the six-digit form&lt;br /&gt;
				if not is_valid_rxiv_date (y, m, d, &#039;b&#039;) then					-- validate the encoded date; &#039;b&#039; for biorxiv limit&lt;br /&gt;
					break;														-- date fail; break out early so we don&#039;t unset the error message&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			err_msg = nil;														-- we found a match so unset the error message&lt;br /&gt;
			break;																-- and done&lt;br /&gt;
		end&lt;br /&gt;
	end																			-- err_cat remains set here when no match&lt;br /&gt;
&lt;br /&gt;
	if err_msg then&lt;br /&gt;
		options.coins_list_t[&#039;BIORXIV&#039;] = nil;									-- when error, unset so not included in COinS&lt;br /&gt;
		set_message (&#039;err_bad_biorxiv&#039;);										-- and set the error message&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
			prefix = handler.prefix, id = id, separator = handler.separator,&lt;br /&gt;
			encode = handler.encode, access = handler.access});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; C I T E S E E R X &amp;gt;------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
CiteSeerX use their own notion of &amp;quot;doi&amp;quot; (not to be confused with the identifiers resolved via doi.org).&lt;br /&gt;
&lt;br /&gt;
The description of the structure of this identifier can be found at Help_talk:Citation_Style_1/Archive_26#CiteSeerX_id_structure&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function citeseerx (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local matched;&lt;br /&gt;
&lt;br /&gt;
	local text = external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
		prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode,&lt;br /&gt;
		access = handler.access});&lt;br /&gt;
	&lt;br /&gt;
	matched = id:match (&amp;quot;^10%.1%.1%.[1-9]%d?%d?%d?%.[1-9]%d?%d?%d?$&amp;quot;);&lt;br /&gt;
	if not matched then&lt;br /&gt;
		set_message (&#039;err_bad_citeseerx&#039; );&lt;br /&gt;
		options.coins_list_t[&#039;CITESEERX&#039;] = nil;								-- when error, unset so not included in COinS&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return text;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; D O I &amp;gt;------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Formats a DOI and checks for DOI errors.&lt;br /&gt;
&lt;br /&gt;
DOI names contain two parts: prefix and suffix separated by a forward slash.&lt;br /&gt;
	Prefix: directory indicator &#039;10.&#039; followed by a registrant code&lt;br /&gt;
	Suffix: character string of any length chosen by the registrant&lt;br /&gt;
&lt;br /&gt;
This function checks a DOI name for: prefix/suffix.  If the DOI name contains spaces or endashes, or, if it ends&lt;br /&gt;
with a period or a comma, this function will emit a bad_doi error message.&lt;br /&gt;
&lt;br /&gt;
DOI names are case-insensitive and can incorporate any printable Unicode characters so the test for spaces, endash,&lt;br /&gt;
and terminal punctuation may not be technically correct but it appears, that in practice these characters are rarely&lt;br /&gt;
if ever used in DOI names.&lt;br /&gt;
&lt;br /&gt;
https://www.doi.org/doi_handbook/2_Numbering.html				-- 2.2 Syntax of a DOI name&lt;br /&gt;
https://www.doi.org/doi_handbook/2_Numbering.html#2.2.2			-- 2.2.2 DOI prefix&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function doi (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local inactive = options.DoiBroken&lt;br /&gt;
	local access = options.access;&lt;br /&gt;
	local ignore_invalid = options.accept;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local err_flag;&lt;br /&gt;
&lt;br /&gt;
	local function is_extended_free (registrant, suffix)						-- local function to check those few registrants that are mixed; identifiable by the doi suffix &amp;lt;incipit&amp;gt;&lt;br /&gt;
		if cfg.extended_registrants_t[registrant] then							-- if this registrant has known free-to-read extentions&lt;br /&gt;
			for _, incipit in ipairs (cfg.extended_registrants_t[registrant]) do	-- loop through the registrant&#039;s incipits&lt;br /&gt;
				if mw.ustring.find (suffix, &#039;^&#039; .. incipit) then				-- if found&lt;br /&gt;
					return true;&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local text;&lt;br /&gt;
	if is_set (inactive) then&lt;br /&gt;
		local inactive_year = inactive:match(&amp;quot;%d%d%d%d&amp;quot;);						-- try to get the year portion from the inactive date&lt;br /&gt;
		local inactive_month, good;&lt;br /&gt;
&lt;br /&gt;
		if is_set (inactive_year) then&lt;br /&gt;
			if 4 &amp;lt; inactive:len() then											-- inactive date has more than just a year (could be anything)&lt;br /&gt;
				local lang_obj = mw.getContentLanguage();						-- get a language object for this wiki&lt;br /&gt;
				good, inactive_month = pcall (lang_obj.formatDate, lang_obj, &#039;F&#039;, inactive);	-- try to get the month name from the inactive date&lt;br /&gt;
				if not good then&lt;br /&gt;
					inactive_month = nil;										-- something went wrong so make sure this is unset&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end																		-- otherwise, |doi-broken-date= has something but it isn&#039;t a date&lt;br /&gt;
		&lt;br /&gt;
		if is_set (inactive_year) and is_set (inactive_month) then&lt;br /&gt;
			set_message (&#039;maint_doi_inactive_dated&#039;, {inactive_year, inactive_month, &#039; &#039;});&lt;br /&gt;
		elseif is_set (inactive_year) then&lt;br /&gt;
			set_message (&#039;maint_doi_inactive_dated&#039;, {inactive_year, &#039;&#039;, &#039;&#039;});&lt;br /&gt;
		else&lt;br /&gt;
			set_message (&#039;maint_doi_inactive&#039;);&lt;br /&gt;
		end&lt;br /&gt;
		inactive = &amp;quot; (&amp;quot; .. cfg.messages[&#039;inactive&#039;] .. &#039; &#039; .. inactive .. &#039;)&#039;;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local suffix;&lt;br /&gt;
	local registrant, suffix = mw.ustring.match (id, &#039;^10%.([^/]+)/([^%s–]-[^%.,])$&#039;);	-- registrant and suffix set when DOI has the proper basic form&lt;br /&gt;
&lt;br /&gt;
	local registrant_err_patterns = {											-- these patterns are for code ranges that are not supported &lt;br /&gt;
		&#039;^[^1-3]%d%d%d%d%.%d+$&#039;,												-- 5 digits with subcode (0xxxx, 40000+); accepts: 10000–39999&lt;br /&gt;
		&#039;^[^1-7]%d%d%d%d$&#039;,														-- 5 digits without subcode (0xxxx, 60000+); accepts: 10000–69999&lt;br /&gt;
		&#039;^[^1-9]%d%d%d%.%d+$&#039;,												-- 4 digits with subcode (0xxx); accepts: 1000–9999&lt;br /&gt;
		&#039;^[^1-9]%d%d%d$&#039;,														-- 4 digits without subcode (0xxx); accepts: 1000–9999&lt;br /&gt;
		&#039;^%d%d%d%d%d%d+&#039;,														-- 6 or more digits&lt;br /&gt;
		&#039;^%d%d?%d?$&#039;,															-- less than 4 digits without subcode (3 digits with subcode is legitimate)&lt;br /&gt;
		&#039;^%d%d?%.[%d%.]+&#039;,														-- 1 or 2 digits with subcode&lt;br /&gt;
		&#039;^5555$&#039;,																-- test registrant will never resolve&lt;br /&gt;
		&#039;[^%d%.]&#039;,																-- any character that isn&#039;t a digit or a dot&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	if not ignore_invalid then&lt;br /&gt;
		if registrant then														-- when DOI has proper form&lt;br /&gt;
			for i, pattern in ipairs (registrant_err_patterns) do				-- spin through error patterns&lt;br /&gt;
				if registrant:match (pattern) then								-- to validate registrant codes&lt;br /&gt;
					err_flag = set_message (&#039;err_bad_doi&#039;);						-- when found, mark this DOI as bad&lt;br /&gt;
					break;														-- and done&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			err_flag = set_message (&#039;err_bad_doi&#039;);								-- invalid directory or malformed&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		set_message (&#039;maint_doi_ignore&#039;);&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if err_flag then&lt;br /&gt;
		options.coins_list_t[&#039;DOI&#039;] = nil;										-- when error, unset so not included in COinS&lt;br /&gt;
	else&lt;br /&gt;
		if not access and (cfg.known_free_doi_registrants_t[registrant] or is_extended_free (registrant, suffix)) then		-- |doi-access=free not set and &amp;lt;registrant&amp;gt; is known to be free&lt;br /&gt;
			set_message (&#039;maint_doi_unflagged_free&#039;);							-- set a maint cat&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	text = external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
		prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = access,&lt;br /&gt;
		auto_link = not (err_flag or is_set (inactive) or ignore_invalid) and &#039;doi&#039; or nil -- do not auto-link when |doi-broken-date= has a value or when there is a DOI error or (to play it safe, after all, auto-linking is not essential) when invalid DOIs are ignored&lt;br /&gt;
		}) .. (inactive or &#039;&#039;);&lt;br /&gt;
&lt;br /&gt;
	return text;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; H D L &amp;gt;------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Formats an HDL with minor error checking.&lt;br /&gt;
&lt;br /&gt;
HDL names contain two parts: prefix and suffix separated by a forward slash.&lt;br /&gt;
	Prefix: character string using any character in the UCS-2 character set except &#039;/&#039;&lt;br /&gt;
	Suffix: character string of any length using any character in the UCS-2 character set chosen by the registrant&lt;br /&gt;
&lt;br /&gt;
This function checks a HDL name for: prefix/suffix.  If the HDL name contains spaces, endashes, or, if it ends&lt;br /&gt;
with a period or a comma, this function will emit a bad_hdl error message.&lt;br /&gt;
&lt;br /&gt;
HDL names are case-insensitive and can incorporate any printable Unicode characters so the test for endashes and&lt;br /&gt;
terminal punctuation may not be technically correct but it appears, that in practice these characters are rarely&lt;br /&gt;
if ever used in HDLs.&lt;br /&gt;
&lt;br /&gt;
Query string parameters are named here: https://www.handle.net/proxy_servlet.html.  query strings are not displayed&lt;br /&gt;
but since &#039;?&#039; is an allowed character in an HDL, &#039;?&#039; followed by one of the query parameters is the only way we&lt;br /&gt;
have to detect the query string so that it isn&#039;t URL-encoded with the rest of the identifier.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function hdl (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local access = options.access;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local query_params = {														-- list of known query parameters from https://www.handle.net/proxy_servlet.html&lt;br /&gt;
		&#039;noredirect&#039;,&lt;br /&gt;
		&#039;ignore_aliases&#039;,&lt;br /&gt;
		&#039;auth&#039;,&lt;br /&gt;
		&#039;cert&#039;,&lt;br /&gt;
		&#039;index&#039;,&lt;br /&gt;
		&#039;type&#039;,&lt;br /&gt;
		&#039;urlappend&#039;,&lt;br /&gt;
		&#039;locatt&#039;,&lt;br /&gt;
		&#039;action&#039;,&lt;br /&gt;
		}&lt;br /&gt;
	&lt;br /&gt;
	local hdl, suffix, param = id:match (&#039;(.-)(%?(%a+).+)$&#039;);					-- look for query string&lt;br /&gt;
	local found;&lt;br /&gt;
&lt;br /&gt;
	if hdl then																	-- when there are query strings, this is the handle identifier portion&lt;br /&gt;
		for _, q in ipairs (query_params) do									-- spin through the list of query parameters&lt;br /&gt;
			if param:match (&#039;^&#039; .. q) then										-- if the query string begins with one of the parameters&lt;br /&gt;
				found = true;													-- announce a find&lt;br /&gt;
				break;															-- and stop looking&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if found then&lt;br /&gt;
		id = hdl;																-- found so replace id with the handle portion; this will be URL-encoded, suffix will not&lt;br /&gt;
	else&lt;br /&gt;
		suffix = &#039;&#039;;															-- make sure suffix is empty string for concatenation else&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local text = external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
			prefix = handler.prefix, id = id, suffix = suffix, separator = handler.separator, encode = handler.encode, access = access})&lt;br /&gt;
&lt;br /&gt;
	if nil == id:match(&amp;quot;^[^%s–]-/[^%s–]-[^%.,]$&amp;quot;) then							-- HDL must contain a forward slash, must not contain spaces, endashes, and must not end with period or comma&lt;br /&gt;
		set_message (&#039;err_bad_hdl&#039; );&lt;br /&gt;
		options.coins_list_t[&#039;HDL&#039;] = nil;										-- when error, unset so not included in COinS&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return text;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S B N &amp;gt;----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Determines whether an ISBN string is valid&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function isbn (options_t)&lt;br /&gt;
	local isbn_str = options_t.id;&lt;br /&gt;
	local ignore_invalid = options_t.accept;&lt;br /&gt;
	local handler = options_t.handler;&lt;br /&gt;
	local year = options_t.Year;												-- when set, valid anchor_year; may have a disambiguator which must be removed&lt;br /&gt;
&lt;br /&gt;
	local function return_result (check, err_type)								-- local function to handle the various returns&lt;br /&gt;
		local ISBN = internal_link_id ({link = handler.link, label = handler.label, redirect = handler.redirect,&lt;br /&gt;
						prefix = handler.prefix, id = isbn_str, separator = handler.separator});&lt;br /&gt;
		if ignore_invalid then													-- if ignoring ISBN errors&lt;br /&gt;
			set_message (&#039;maint_isbn_ignore&#039;);									-- add a maint category even when there is no error&lt;br /&gt;
		else																	-- here when not ignoring&lt;br /&gt;
			if not check then													-- and there is an error&lt;br /&gt;
				options_t.coins_list_t[&#039;ISBN&#039;] = nil;								-- when error, unset so not included in COinS&lt;br /&gt;
				set_message (&#039;err_bad_isbn&#039;, err_type);							-- set an error message&lt;br /&gt;
				return ISBN;										 			-- return id text&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		return ISBN;															-- return id text&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if year and not ignore_invalid then											-- &lt;br /&gt;
		year = year:match (&#039;%d%d%d%d?&#039;);										-- strip disambiguator if present&lt;br /&gt;
		if year and (1965 &amp;gt; tonumber(year)) then								-- &amp;lt;year&amp;gt; will be nil here when |year=n.d. or |year=nd&lt;br /&gt;
			set_message (&#039;err_invalid_isbn_date&#039;);								-- set an error message&lt;br /&gt;
			return internal_link_id ({link = handler.link, label = handler.label, redirect = handler.redirect,&lt;br /&gt;
					prefix = handler.prefix, id = isbn_str, separator = handler.separator});&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if nil ~= isbn_str:match (&#039;[^%s-0-9X]&#039;) then&lt;br /&gt;
		return return_result (false, cfg.err_msg_supl.char);					-- fail if isbn_str contains anything but digits, hyphens, or the uppercase X&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local id = isbn_str:gsub (&#039;[%s-]&#039;, &#039;&#039;);										-- remove hyphens and whitespace&lt;br /&gt;
&lt;br /&gt;
	local len = id:len();&lt;br /&gt;
 &lt;br /&gt;
	if len ~= 10 and len ~= 13 then&lt;br /&gt;
		return return_result (false, cfg.err_msg_supl.length);					-- fail if incorrect length&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if len == 10 then&lt;br /&gt;
		if id:match (&#039;^%d*X?$&#039;) == nil then										-- fail if isbn_str has &#039;X&#039; anywhere but last position&lt;br /&gt;
			return return_result (false, cfg.err_msg_supl.form);									&lt;br /&gt;
		end&lt;br /&gt;
		if not is_valid_isxn (id, 10) then										-- test isbn-10 for numerical validity&lt;br /&gt;
			return return_result (false, cfg.err_msg_supl.check);				-- fail if isbn-10 is not numerically valid&lt;br /&gt;
		end&lt;br /&gt;
		if id:find (&#039;^63[01]&#039;) then												-- 630xxxxxxx and 631xxxxxxx are (apparently) not valid isbn group ids but are used by amazon as numeric identifiers (asin)&lt;br /&gt;
			return return_result (false, cfg.err_msg_supl.group);				-- fail if isbn-10 begins with 630/1&lt;br /&gt;
		end&lt;br /&gt;
		return return_result (true, cfg.err_msg_supl.check);					-- pass if isbn-10 is numerically valid&lt;br /&gt;
	else&lt;br /&gt;
		if id:match (&#039;^%d+$&#039;) == nil then&lt;br /&gt;
			return return_result (false, cfg.err_msg_supl.char);				-- fail if ISBN-13 is not all digits&lt;br /&gt;
		end&lt;br /&gt;
		if id:match (&#039;^97[89]%d*$&#039;) == nil then&lt;br /&gt;
			return return_result (false, cfg.err_msg_supl.prefix);				-- fail when ISBN-13 does not begin with 978 or 979&lt;br /&gt;
		end&lt;br /&gt;
		if id:match (&#039;^9790&#039;) then&lt;br /&gt;
			return return_result (false, cfg.err_msg_supl.group);				-- group identifier &#039;0&#039; is reserved to ISMN&lt;br /&gt;
		end&lt;br /&gt;
		return return_result (is_valid_isxn_13 (id), cfg.err_msg_supl.check);&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; A S I N &amp;gt;----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Formats a link to Amazon.  Do simple error checking: ASIN must be mix of 10 numeric or uppercase alpha&lt;br /&gt;
characters.  If a mix, first character must be uppercase alpha; if all numeric, ASINs must be 10-digit&lt;br /&gt;
ISBN. If 10-digit ISBN, add a maintenance category so a bot or AWB script can replace |asin= with |isbn=.&lt;br /&gt;
Error message if not 10 characters, if not ISBN-10, if mixed and first character is a digit.&lt;br /&gt;
&lt;br /&gt;
|asin=630....... and |asin=631....... are (apparently) not a legitimate ISBN though it checksums as one; these&lt;br /&gt;
do not cause this function to emit the maint_asin message&lt;br /&gt;
&lt;br /&gt;
This function is positioned here because it calls isbn()&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function asin (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local domain = options.ASINTLD;&lt;br /&gt;
	&lt;br /&gt;
	local err_flag;&lt;br /&gt;
&lt;br /&gt;
	if not id:match(&amp;quot;^[%d%u][%d%u][%d%u][%d%u][%d%u][%d%u][%d%u][%d%u][%d%u][%d%u]$&amp;quot;) then&lt;br /&gt;
		err_flag = set_message (&#039;err_bad_asin&#039;);								-- ASIN is not a mix of 10 uppercase alpha and numeric characters&lt;br /&gt;
	else&lt;br /&gt;
		if id:match(&amp;quot;^%d%d%d%d%d%d%d%d%d[%dX]$&amp;quot;) then							-- if 10-digit numeric (or 9 digits with terminal X)&lt;br /&gt;
			if is_valid_isxn (id, 10) then										-- see if ASIN value is or validates as ISBN-10&lt;br /&gt;
				if not id:find (&#039;^63[01]&#039;) then									-- 630xxxxxxx and 631xxxxxxx are (apparently) not a valid isbn prefixes but are used by amazon as a numeric identifier&lt;br /&gt;
					err_flag = set_message (&#039;err_bad_asin&#039;);					-- ASIN has ISBN-10 form but begins with something other than 630/1 so probably an isbn &lt;br /&gt;
				end&lt;br /&gt;
			elseif not is_set (err_flag) then&lt;br /&gt;
				err_flag = set_message (&#039;err_bad_asin&#039;);						-- ASIN is not ISBN-10&lt;br /&gt;
			end&lt;br /&gt;
		elseif not id:match(&amp;quot;^%u[%d%u]+$&amp;quot;) then&lt;br /&gt;
			err_flag = set_message (&#039;err_bad_asin&#039;);							-- asin doesn&#039;t begin with uppercase alpha&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if (not is_set (domain)) or in_array (domain, {&#039;us&#039;}) then					-- default: United States&lt;br /&gt;
		domain = &amp;quot;com&amp;quot;;&lt;br /&gt;
	elseif in_array (domain, {&#039;jp&#039;, &#039;uk&#039;}) then									-- Japan, United Kingdom&lt;br /&gt;
		domain = &amp;quot;co.&amp;quot; .. domain;&lt;br /&gt;
	elseif in_array (domain, {&#039;z.cn&#039;}) then 									-- China&lt;br /&gt;
		domain = &amp;quot;cn&amp;quot;;&lt;br /&gt;
	elseif in_array (domain, {&#039;au&#039;, &#039;br&#039;, &#039;mx&#039;, &#039;sg&#039;, &#039;tr&#039;}) then				-- Australia, Brazil, Mexico, Singapore, Turkey&lt;br /&gt;
		domain = &amp;quot;com.&amp;quot; .. domain;&lt;br /&gt;
	elseif not in_array (domain, {&#039;ae&#039;, &#039;ca&#039;, &#039;cn&#039;, &#039;de&#039;, &#039;es&#039;, &#039;fr&#039;, &#039;in&#039;, &#039;it&#039;, &#039;nl&#039;, &#039;pl&#039;, &#039;sa&#039;, &#039;se&#039;, &#039;co.jp&#039;, &#039;co.uk&#039;, &#039;com&#039;, &#039;com.au&#039;, &#039;com.br&#039;, &#039;com.mx&#039;, &#039;com.sg&#039;, &#039;com.tr&#039;}) then -- Arabic Emirates, Canada, China, Germany, Spain, France, Indonesia, Italy, Netherlands, Poland, Saudi Arabia, Sweden (as of 2021-03 Austria (.at), Liechtenstein (.li) and Switzerland (.ch) still redirect to the German site (.de) with special settings, so don&#039;t maintain local ASINs for them)&lt;br /&gt;
		err_flag = set_message (&#039;err_bad_asin_tld&#039;);							-- unsupported asin-tld value&lt;br /&gt;
	end&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
&lt;br /&gt;
	if not is_set (err_flag) then&lt;br /&gt;
		options.coins_list_t[&#039;ASIN&#039;] = handler.prefix .. domain .. &amp;quot;/dp/&amp;quot; .. id;	-- asin for coins&lt;br /&gt;
	else&lt;br /&gt;
		options.coins_list_t[&#039;ASIN&#039;] = nil;										-- when error, unset so not included in COinS&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
		prefix = handler.prefix .. domain .. &amp;quot;/dp/&amp;quot;,&lt;br /&gt;
		id = id, encode = handler.encode, separator = handler.separator})&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S M N &amp;gt;----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Determines whether an ISMN string is valid.  Similar to ISBN-13, ISMN is 13 digits beginning 979-0-... and uses the&lt;br /&gt;
same check digit calculations.  See https://www.ismn-international.org/download/Web_ISMN_Users_Manual_2008-6.pdf&lt;br /&gt;
section 2, pages 9–12.&lt;br /&gt;
&lt;br /&gt;
ismn value not made part of COinS metadata because we don&#039;t have a url or isn&#039;t a COinS-defined identifier (rft.xxx)&lt;br /&gt;
or an identifier registered at info-uri.info (info:)&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function ismn (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local text;&lt;br /&gt;
	local valid_ismn = true;&lt;br /&gt;
	local id_copy;&lt;br /&gt;
&lt;br /&gt;
	id_copy = id;																-- save a copy because this testing is destructive&lt;br /&gt;
	id = id:gsub (&#039;[%s-]&#039;, &#039;&#039;);													-- remove hyphens and white space&lt;br /&gt;
&lt;br /&gt;
	if 13 ~= id:len() or id:match (&amp;quot;^9790%d*$&amp;quot; ) == nil then					-- ISMN must be 13 digits and begin with 9790&lt;br /&gt;
		valid_ismn = false;&lt;br /&gt;
	else&lt;br /&gt;
		valid_ismn=is_valid_isxn_13 (id);										-- validate ISMN&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--	text = internal_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,		-- use this (or external version) when there is some place to link to&lt;br /&gt;
	--		prefix = handler.prefix, id = id_copy, separator = handler.separator, encode = handler.encode})&lt;br /&gt;
&lt;br /&gt;
	text = table.concat (														-- because no place to link to yet&lt;br /&gt;
		{&lt;br /&gt;
		make_wikilink (label_link_make (handler), handler.label),&lt;br /&gt;
		handler.separator,&lt;br /&gt;
		id_copy&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
	if false == valid_ismn then&lt;br /&gt;
		options.coins_list_t[&#039;ISMN&#039;] = nil;										-- when error, unset so not included in COinS; not really necessary here because ismn not made part of COinS&lt;br /&gt;
		set_message (&#039;err_bad_ismn&#039;);											-- create an error message if the ISMN is invalid&lt;br /&gt;
	end &lt;br /&gt;
	&lt;br /&gt;
	return text;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S S N &amp;gt;----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Validate and format an ISSN.  This code fixes the case where an editor has included an ISSN in the citation but&lt;br /&gt;
has separated the two groups of four digits with a space.  When that condition occurred, the resulting link looked&lt;br /&gt;
like this:&lt;br /&gt;
&lt;br /&gt;
	|issn=0819 4327 gives: [https://www.worldcat.org/issn/0819 4327 0819 4327]	-- can&#039;t have spaces in an external link&lt;br /&gt;
	&lt;br /&gt;
This code now prevents that by inserting a hyphen at the ISSN midpoint.  It also validates the ISSN for length&lt;br /&gt;
and makes sure that the checkdigit agrees with the calculated value.  Incorrect length (8 digits), characters&lt;br /&gt;
other than 0-9 and X, or checkdigit / calculated value mismatch will all cause a check ISSN error message.  The&lt;br /&gt;
ISSN is always displayed with a hyphen, even if the ISSN was given as a single group of 8 digits.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function issn (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local ignore_invalid = options.accept;&lt;br /&gt;
&lt;br /&gt;
	local issn_copy = id;														-- save a copy of unadulterated ISSN; use this version for display if ISSN does not validate&lt;br /&gt;
	local text;&lt;br /&gt;
	local valid_issn = true;&lt;br /&gt;
&lt;br /&gt;
	id = id:gsub (&#039;[%s-]&#039;, &#039;&#039;);													-- remove hyphens and whitespace&lt;br /&gt;
&lt;br /&gt;
	if 8 ~= id:len() or nil == id:match (&amp;quot;^%d*X?$&amp;quot; ) then						-- validate the ISSN: 8 digits long, containing only 0-9 or X in the last position&lt;br /&gt;
		valid_issn = false;														-- wrong length or improper character&lt;br /&gt;
	else&lt;br /&gt;
		valid_issn = is_valid_isxn (id, 8);										-- validate ISSN&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if true == valid_issn then&lt;br /&gt;
		id = string.sub (id, 1, 4 ) .. &amp;quot;-&amp;quot; .. string.sub (id, 5 );				-- if valid, display correctly formatted version&lt;br /&gt;
	else&lt;br /&gt;
		id = issn_copy;															-- if not valid, show the invalid ISSN with error message&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	text = external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
		prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode})&lt;br /&gt;
&lt;br /&gt;
	if ignore_invalid then&lt;br /&gt;
		set_message (&#039;maint_issn_ignore&#039;);&lt;br /&gt;
	else&lt;br /&gt;
		if false == valid_issn then&lt;br /&gt;
			options.coins_list_t[&#039;ISSN&#039;] = nil;									-- when error, unset so not included in COinS&lt;br /&gt;
			set_message (&#039;err_bad_issn&#039;, (options.hkey == &#039;EISSN&#039;) and &#039;e&#039; or &#039;&#039;);	-- create an error message if the ISSN is invalid&lt;br /&gt;
		end &lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return text;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; J F M &amp;gt;-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
A numerical identifier in the form nn.nnnn.nn&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function jfm (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local id_num;&lt;br /&gt;
&lt;br /&gt;
	id_num = id:match (&#039;^[Jj][Ff][Mm](.*)$&#039;);									-- identifier with jfm prefix; extract identifier&lt;br /&gt;
&lt;br /&gt;
	if is_set (id_num) then&lt;br /&gt;
		set_message (&#039;maint_jfm_format&#039;);&lt;br /&gt;
	else																		-- plain number without JFM prefix&lt;br /&gt;
		id_num = id;															-- if here id does not have prefix&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if id_num and id_num:match(&#039;^%d%d%.%d%d%d%d%.%d%d$&#039;) then&lt;br /&gt;
		id = id_num;															-- jfm matches pattern&lt;br /&gt;
	else&lt;br /&gt;
		set_message (&#039;err_bad_jfm&#039; );											-- set an error message&lt;br /&gt;
		options.coins_list_t[&#039;JFM&#039;] = nil;										-- when error, unset so not included in COinS&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
			prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; J S T O R &amp;gt;--------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Format a JSTOR with some error checking&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function jstor (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local access = options.access;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
&lt;br /&gt;
	if id:find (&#039;[Jj][Ss][Tt][Oo][Rr]&#039;) or id:find (&#039;^https?://&#039;) or id:find (&#039;%s&#039;) then&lt;br /&gt;
		set_message (&#039;err_bad_jstor&#039;);											-- set an error message&lt;br /&gt;
		options.coins_list_t[&#039;JSTOR&#039;] = nil;									-- when error, unset so not included in COinS&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
		prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = access});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; L C C N &amp;gt;----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Format LCCN link and do simple error checking.  LCCN is a character string 8-12 characters long. The length of&lt;br /&gt;
the LCCN dictates the character type of the first 1-3 characters; the rightmost eight are always digits.&lt;br /&gt;
https://oclc-research.github.io/infoURI-Frozen/info-uri.info/info:lccn/reg.html&lt;br /&gt;
&lt;br /&gt;
length = 8 then all digits&lt;br /&gt;
length = 9 then lccn[1] is lowercase alpha&lt;br /&gt;
length = 10 then lccn[1] and lccn[2] are both lowercase alpha or both digits&lt;br /&gt;
length = 11 then lccn[1] is lower case alpha, lccn[2] and lccn[3] are both lowercase alpha or both digits&lt;br /&gt;
length = 12 then lccn[1] and lccn[2] are both lowercase alpha&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function lccn (options)&lt;br /&gt;
	local lccn = options.id;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local err_flag;																-- presume that LCCN is valid&lt;br /&gt;
	local id = lccn;															-- local copy of the LCCN&lt;br /&gt;
&lt;br /&gt;
	id = normalize_lccn (id);													-- get canonical form (no whitespace, hyphens, forward slashes)&lt;br /&gt;
	local len = id:len();														-- get the length of the LCCN&lt;br /&gt;
&lt;br /&gt;
	if 8 == len then&lt;br /&gt;
		if id:match(&amp;quot;[^%d]&amp;quot;) then												-- if LCCN has anything but digits (nil if only digits)&lt;br /&gt;
			err_flag = set_message (&#039;err_bad_lccn&#039;);							-- set an error message&lt;br /&gt;
		end&lt;br /&gt;
	elseif 9 == len then														-- LCCN should be adddddddd&lt;br /&gt;
		if nil == id:match(&amp;quot;%l%d%d%d%d%d%d%d%d&amp;quot;) then							-- does it match our pattern?&lt;br /&gt;
			err_flag = set_message (&#039;err_bad_lccn&#039;);							-- set an error message&lt;br /&gt;
		end&lt;br /&gt;
	elseif 10 == len then														-- LCCN should be aadddddddd or dddddddddd&lt;br /&gt;
		if id:match(&amp;quot;[^%d]&amp;quot;) then												-- if LCCN has anything but digits (nil if only digits) ...&lt;br /&gt;
			if nil == id:match(&amp;quot;^%l%l%d%d%d%d%d%d%d%d&amp;quot;) then					-- ... see if it matches our pattern&lt;br /&gt;
				err_flag = set_message (&#039;err_bad_lccn&#039;);						-- no match, set an error message&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	elseif 11 == len then														-- LCCN should be aaadddddddd or adddddddddd&lt;br /&gt;
		if not (id:match(&amp;quot;^%l%l%l%d%d%d%d%d%d%d%d&amp;quot;) or id:match(&amp;quot;^%l%d%d%d%d%d%d%d%d%d%d&amp;quot;)) then	-- see if it matches one of our patterns&lt;br /&gt;
			err_flag = set_message (&#039;err_bad_lccn&#039;);							-- no match, set an error message&lt;br /&gt;
		end&lt;br /&gt;
	elseif 12 == len then														-- LCCN should be aadddddddddd&lt;br /&gt;
		if not id:match(&amp;quot;^%l%l%d%d%d%d%d%d%d%d%d%d&amp;quot;) then						-- see if it matches our pattern&lt;br /&gt;
			err_flag = set_message (&#039;err_bad_lccn&#039;);							-- no match, set an error message&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		err_flag = set_message (&#039;err_bad_lccn&#039;);								-- wrong length, set an error message&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not is_set (err_flag) and nil ~= lccn:find (&#039;%s&#039;) then&lt;br /&gt;
		err_flag = set_message (&#039;err_bad_lccn&#039;);								-- lccn contains a space, set an error message&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if is_set (err_flag) then&lt;br /&gt;
		options.coins_list_t[&#039;LCCN&#039;] = nil;										-- when error, unset so not included in COinS&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
			prefix = handler.prefix, id = lccn, separator = handler.separator, encode = handler.encode});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; M E D R X I V &amp;gt;-----------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Format medRxiv ID and do simple error checking.  Similar to later bioRxiv IDs, medRxiv IDs are prefixed with a&lt;br /&gt;
yyyy.mm.dd. date and suffixed with an optional version identifier.  Ealiest date accepted is 2020.01.01&lt;br /&gt;
&lt;br /&gt;
The medRxiv ID is a date followed by an eight-digit number followed by an optional version indicator &#039;v&#039; and one or more digits:&lt;br /&gt;
	https://www.medrxiv.org/content/10.1101/2020.11.16.20232009v2 -&amp;gt; 10.1101/2020.11.16.20232009v2&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function medrxiv (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local err_msg_flag = true;													-- flag; assume that there will be an error&lt;br /&gt;
&lt;br /&gt;
	local patterns = {&lt;br /&gt;
		&#039;^%d%d%d%d%d%d%d%d$&#039;,													-- simple 8-digit identifier; these should be relatively rare&lt;br /&gt;
		&#039;^10%.1101/(20%d%d)%.(%d%d)%.(%d%d)%.%d%d%d%d%d%d%d%dv%d+$&#039;,			-- y.m.d. date + 8-digit identifier + version (2020-01-01 and later)&lt;br /&gt;
		&#039;^10%.1101/(20%d%d)%.(%d%d)%.(%d%d)%.%d%d%d%d%d%d%d%d$&#039;,				-- y.m.d. date + 8-digit identifier (2020-01-01 and later)&lt;br /&gt;
		}&lt;br /&gt;
	&lt;br /&gt;
	for _, pattern in ipairs (patterns) do										-- spin through the patterns looking for a match&lt;br /&gt;
		if id:match (pattern) then&lt;br /&gt;
			local y, m, d = id:match (pattern);									-- found a match, attempt to get year, month and date from the identifier&lt;br /&gt;
&lt;br /&gt;
			if m then															-- m is nil when id is the 8-digit form&lt;br /&gt;
				if not is_valid_rxiv_date (y, m, d, &#039;b&#039;) then					-- validate the encoded date; &#039;b&#039; for medrxiv limit&lt;br /&gt;
					break;														-- date fail; break out early so we don&#039;t unset the error message&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			err_msg_flag = nil;													-- we found a match so unset the error message&lt;br /&gt;
			break;																-- and done&lt;br /&gt;
		end&lt;br /&gt;
	end																			-- &amp;lt;err_msg_flag&amp;gt; remains set here when no match&lt;br /&gt;
&lt;br /&gt;
	if err_msg_flag then&lt;br /&gt;
		options.coins_list_t[&#039;MEDRXIV&#039;] = nil;									-- when error, unset so not included in COinS&lt;br /&gt;
		set_message (&#039;err_bad_medrxiv&#039;);										-- and set the error message&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
			prefix = handler.prefix, id = id, separator = handler.separator,&lt;br /&gt;
			encode = handler.encode, access = handler.access});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; M R &amp;gt;--------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
A seven digit number; if not seven digits, zero-fill leading digits to make seven digits.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function mr (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local id_num;&lt;br /&gt;
	local id_len;&lt;br /&gt;
&lt;br /&gt;
	id_num = id:match (&#039;^[Mm][Rr](%d+)$&#039;);										-- identifier with mr prefix&lt;br /&gt;
&lt;br /&gt;
	if is_set (id_num) then&lt;br /&gt;
		set_message (&#039;maint_mr_format&#039;);										-- add maint cat&lt;br /&gt;
	else																		-- plain number without mr prefix&lt;br /&gt;
		id_num = id:match (&#039;^%d+$&#039;);											-- if here id is all digits&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	id_len = id_num and id_num:len() or 0;&lt;br /&gt;
	if (7 &amp;gt;= id_len) and (0 ~= id_len) then&lt;br /&gt;
		id = string.rep (&#039;0&#039;, 7-id_len) .. id_num;								-- zero-fill leading digits&lt;br /&gt;
	else&lt;br /&gt;
		set_message (&#039;err_bad_mr&#039;);												-- set an error message&lt;br /&gt;
		options.coins_list_t[&#039;MR&#039;] = nil;										-- when error, unset so not included in COinS&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
			prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; O C L C &amp;gt;----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Validate and format an OCLC ID.  https://www.oclc.org/batchload/controlnumber.en.html {{dead link}}&lt;br /&gt;
archived at: https://web.archive.org/web/20161228233804/https://www.oclc.org/batchload/controlnumber.en.html&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function oclc (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local number;&lt;br /&gt;
&lt;br /&gt;
	if id:match(&#039;^ocm%d%d%d%d%d%d%d%d$&#039;) then									-- ocm prefix and 8 digits; 001 field (12 characters)&lt;br /&gt;
		number = id:match(&#039;ocm(%d+)&#039;);											-- get the number&lt;br /&gt;
	elseif id:match(&#039;^ocn%d%d%d%d%d%d%d%d%d$&#039;) then								-- ocn prefix and 9 digits; 001 field (12 characters)&lt;br /&gt;
		number = id:match(&#039;ocn(%d+)&#039;);											-- get the number&lt;br /&gt;
	elseif id:match(&#039;^on%d%d%d%d%d%d%d%d%d%d+$&#039;) then							-- on prefix and 10 or more digits; 001 field (12 characters)&lt;br /&gt;
		number = id:match(&#039;^on(%d%d%d%d%d%d%d%d%d%d+)$&#039;);						-- get the number&lt;br /&gt;
	elseif id:match(&#039;^%(OCoLC%)[1-9]%d*$&#039;) then									-- (OCoLC) prefix and variable number digits; no leading zeros; 035 field&lt;br /&gt;
		number = id:match(&#039;%(OCoLC%)([1-9]%d*)&#039;);								-- get the number&lt;br /&gt;
		if 9 &amp;lt; number:len() then&lt;br /&gt;
			number = nil;														-- constrain to 1 to 9 digits; change this when OCLC issues 10-digit numbers&lt;br /&gt;
		end&lt;br /&gt;
	elseif id:match(&#039;^%d+$&#039;) then												-- no prefix&lt;br /&gt;
		number = id;															-- get the number&lt;br /&gt;
		if tonumber (id) &amp;gt; handler.id_limit then&lt;br /&gt;
			number = nil;														-- unset when id value exceeds the limit&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if number then																-- proper format&lt;br /&gt;
		id = number;															-- exclude prefix, if any, from external link&lt;br /&gt;
	else&lt;br /&gt;
		set_message (&#039;err_bad_oclc&#039;)											-- add an error message if the id is malformed&lt;br /&gt;
		options.coins_list_t[&#039;OCLC&#039;] = nil;										-- when error, unset so not included in COinS&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
		prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; O P E N L I B R A R Y &amp;gt;--------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Formats an OpenLibrary link, and checks for associated errors.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function openlibrary (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local access = options.access;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local ident, code = id:gsub(&#039;^OL&#039;, &#039;&#039;):match(&amp;quot;^(%d+([AMW]))$&amp;quot;);				-- strip optional OL prefix followed immediately by digits followed by &#039;A&#039;, &#039;M&#039;, or &#039;W&#039;;&lt;br /&gt;
	local err_flag;&lt;br /&gt;
	local prefix = {															-- these are appended to the handler.prefix according to code&lt;br /&gt;
		[&#039;A&#039;]=&#039;authors/OL&#039;,&lt;br /&gt;
		[&#039;M&#039;]=&#039;books/OL&#039;,&lt;br /&gt;
		[&#039;W&#039;]=&#039;works/OL&#039;,&lt;br /&gt;
		[&#039;X&#039;]=&#039;OL&#039;																-- not a code; spoof when &#039;code&#039; in id is invalid&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
	if not ident then&lt;br /&gt;
		code = &#039;X&#039;;																-- no code or id completely invalid&lt;br /&gt;
		ident = id;																-- copy id to ident so that we display the flawed identifier&lt;br /&gt;
		err_flag = set_message (&#039;err_bad_ol&#039;);&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not is_set (err_flag) then&lt;br /&gt;
		options.coins_list_t[&#039;OL&#039;] = handler.prefix .. prefix[code] .. ident;	-- experiment for ol coins&lt;br /&gt;
	else&lt;br /&gt;
		options.coins_list_t[&#039;OL&#039;] = nil;										-- when error, unset so not included in COinS&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
		prefix = handler.prefix .. prefix[code],&lt;br /&gt;
		id = ident, separator = handler.separator, encode = handler.encode,&lt;br /&gt;
		access = access});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; O S T I &amp;gt;----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Format OSTI and do simple error checking. OSTIs are sequential numbers beginning at 1 and counting up.  This&lt;br /&gt;
code checks the OSTI to see that it contains only digits and is less than test_limit specified in the configuration;&lt;br /&gt;
the value in test_limit will need to be updated periodically as more OSTIs are issued.&lt;br /&gt;
&lt;br /&gt;
NB. 1018 is the lowest OSTI number found in the wild (so far) and resolving OK on the OSTI site&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function osti (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local access = options.access;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
&lt;br /&gt;
	if id:match(&amp;quot;[^%d]&amp;quot;) then													-- if OSTI has anything but digits&lt;br /&gt;
		set_message (&#039;err_bad_osti&#039;);											-- set an error message&lt;br /&gt;
		options.coins_list_t[&#039;OSTI&#039;] = nil;										-- when error, unset so not included in COinS&lt;br /&gt;
	else																		-- OSTI is only digits&lt;br /&gt;
		local id_num = tonumber (id);											-- convert id to a number for range testing&lt;br /&gt;
		if 1018 &amp;gt; id_num or handler.id_limit &amp;lt; id_num then						-- if OSTI is outside test limit boundaries&lt;br /&gt;
			set_message (&#039;err_bad_osti&#039;);										-- set an error message&lt;br /&gt;
			options.coins_list_t[&#039;OSTI&#039;] = nil;									-- when error, unset so not included in COinS&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
			prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = access});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; P M C &amp;gt;------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Format a PMC, do simple error checking, and check for embargoed articles.&lt;br /&gt;
&lt;br /&gt;
The embargo parameter takes a date for a value. If the embargo date is in the future the PMC identifier will not&lt;br /&gt;
be linked to the article.  If the embargo date is today or in the past, or if it is empty or omitted, then the&lt;br /&gt;
PMC identifier is linked to the article through the link at cfg.id_handlers[&#039;PMC&#039;].prefix.&lt;br /&gt;
&lt;br /&gt;
PMC embargo date testing is done in function is_embargoed () which is called earlier because when the citation&lt;br /&gt;
has |pmc=&amp;lt;value&amp;gt; but does not have a |url= then |title= is linked with the PMC link.  Function is_embargoed ()&lt;br /&gt;
returns the embargo date if the PMC article is still embargoed, otherwise it returns an empty string.&lt;br /&gt;
&lt;br /&gt;
PMCs are sequential numbers beginning at 1 and counting up.  This code checks the PMC to see that it contains only digits and is less&lt;br /&gt;
than test_limit; the value in local variable test_limit will need to be updated periodically as more PMCs are issued.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function pmc (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local embargo = options.Embargo;											-- TODO: lowercase?&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local err_flag;&lt;br /&gt;
	local id_num;&lt;br /&gt;
	local text;&lt;br /&gt;
&lt;br /&gt;
	id_num = id:match (&#039;^[Pp][Mm][Cc](%d+)$&#039;);									-- identifier with PMC prefix&lt;br /&gt;
&lt;br /&gt;
	if is_set (id_num) then&lt;br /&gt;
		set_message (&#039;maint_pmc_format&#039;);&lt;br /&gt;
	else																		-- plain number without PMC prefix&lt;br /&gt;
		id_num = id:match (&#039;^%d+$&#039;);											-- if here id is all digits&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if is_set (id_num) then														-- id_num has a value so test it&lt;br /&gt;
		id_num = tonumber (id_num);												-- convert id_num to a number for range testing&lt;br /&gt;
		if 1 &amp;gt; id_num or handler.id_limit &amp;lt; id_num then							-- if PMC is outside test limit boundaries&lt;br /&gt;
			err_flag = set_message (&#039;err_bad_pmc&#039;);								-- set an error message&lt;br /&gt;
		else&lt;br /&gt;
			id = tostring (id_num);												-- make sure id is a string&lt;br /&gt;
		end&lt;br /&gt;
	else																		-- when id format incorrect&lt;br /&gt;
		err_flag = set_message (&#039;err_bad_pmc&#039;);									-- set an error message&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if is_set (embargo) and is_set (is_embargoed (embargo)) then				-- is PMC is still embargoed?&lt;br /&gt;
		text = table.concat (													-- still embargoed so no external link&lt;br /&gt;
			{&lt;br /&gt;
			make_wikilink (label_link_make (handler), handler.label),&lt;br /&gt;
			handler.separator,&lt;br /&gt;
			id,&lt;br /&gt;
			});&lt;br /&gt;
	else&lt;br /&gt;
		text = external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,	-- no embargo date or embargo has expired, ok to link to article&lt;br /&gt;
			prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = handler.access,&lt;br /&gt;
			auto_link = not err_flag and &#039;pmc&#039; or nil							-- do not auto-link when PMC has error&lt;br /&gt;
			});&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if err_flag then&lt;br /&gt;
		options.coins_list_t[&#039;PMC&#039;] = nil;										-- when error, unset so not included in COinS&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return text;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; P M I D &amp;gt;----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Format PMID and do simple error checking.  PMIDs are sequential numbers beginning at 1 and counting up.  This&lt;br /&gt;
code checks the PMID to see that it contains only digits and is less than test_limit; the value in local variable&lt;br /&gt;
test_limit will need to be updated periodically as more PMIDs are issued.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function pmid (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
&lt;br /&gt;
	if id:match(&amp;quot;[^%d]&amp;quot;) then													-- if PMID has anything but digits&lt;br /&gt;
		set_message (&#039;err_bad_pmid&#039;);											-- set an error message&lt;br /&gt;
		options.coins_list_t[&#039;PMID&#039;] = nil;										-- when error, unset so not included in COinS&lt;br /&gt;
	else																		-- PMID is only digits&lt;br /&gt;
		local id_num = tonumber (id);											-- convert id to a number for range testing&lt;br /&gt;
		if 1 &amp;gt; id_num or handler.id_limit &amp;lt; id_num then							-- if PMID is outside test limit boundaries&lt;br /&gt;
			set_message (&#039;err_bad_pmid&#039;);										-- set an error message&lt;br /&gt;
			options.coins_list_t[&#039;PMID&#039;] = nil;									-- when error, unset so not included in COinS&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
			prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; R F C &amp;gt;------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Format RFC and do simple error checking. RFCs are sequential numbers beginning at 1 and counting up.  This&lt;br /&gt;
code checks the RFC to see that it contains only digits and is less than test_limit specified in the configuration;&lt;br /&gt;
the value in test_limit will need to be updated periodically as more RFCs are issued.&lt;br /&gt;
&lt;br /&gt;
An index of all RFCs is here: https://tools.ietf.org/rfc/&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function rfc (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
&lt;br /&gt;
	if id:match(&amp;quot;[^%d]&amp;quot;) then													-- if RFC has anything but digits&lt;br /&gt;
		set_message (&#039;err_bad_rfc&#039;);											-- set an error message&lt;br /&gt;
		options.coins_list_t[&#039;RFC&#039;] = nil;										-- when error, unset so not included in COinS&lt;br /&gt;
	else																		-- RFC is only digits&lt;br /&gt;
		local id_num = tonumber (id);											-- convert id to a number for range testing&lt;br /&gt;
		if 1 &amp;gt; id_num or handler.id_limit &amp;lt; id_num then							-- if RFC is outside test limit boundaries&lt;br /&gt;
			set_message (&#039;err_bad_rfc&#039;);										-- set an error message&lt;br /&gt;
			options.coins_list_t[&#039;RFC&#039;] = nil;									-- when error, unset so not included in COinS&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
			prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = handler.access});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; S 2 C I D &amp;gt;--------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Format an S2CID, do simple error checking&lt;br /&gt;
&lt;br /&gt;
S2CIDs are sequential numbers beginning at 1 and counting up.  This code checks the S2CID to see that it is only&lt;br /&gt;
digits and is less than test_limit; the value in local variable test_limit will need to be updated periodically&lt;br /&gt;
as more S2CIDs are issued.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function s2cid (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local access = options.access;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local id_num;&lt;br /&gt;
	local text;&lt;br /&gt;
	&lt;br /&gt;
	id_num = id:match (&#039;^[1-9]%d*$&#039;);											-- id must be all digits; must not begin with 0; no open access flag&lt;br /&gt;
&lt;br /&gt;
 	if is_set (id_num) then														-- id_num has a value so test it&lt;br /&gt;
		id_num = tonumber (id_num);												-- convert id_num to a number for range testing&lt;br /&gt;
		if handler.id_limit &amp;lt; id_num then										-- if S2CID is outside test limit boundaries&lt;br /&gt;
			set_message (&#039;err_bad_s2cid&#039;);										-- set an error message&lt;br /&gt;
			options.coins_list_t[&#039;S2CID&#039;] = nil;								-- when error, unset so not included in COinS&lt;br /&gt;
		end&lt;br /&gt;
	else																		-- when id format incorrect&lt;br /&gt;
		set_message (&#039;err_bad_s2cid&#039;);											-- set an error message&lt;br /&gt;
		options.coins_list_t[&#039;S2CID&#039;] = nil;									-- when error, unset so not included in COinS&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	text = external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
		prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = access});&lt;br /&gt;
&lt;br /&gt;
	return text;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; S B N &amp;gt;------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
9-digit form of ISBN-10; uses same check-digit validation when SBN is prefixed with an additional &#039;0&#039; to make 10 digits&lt;br /&gt;
&lt;br /&gt;
sbn value not made part of COinS metadata because we don&#039;t have a url or isn&#039;t a COinS-defined identifier (rft.xxx)&lt;br /&gt;
or an identifier registered at info-uri.info (info:)&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function sbn (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local ignore_invalid = options.accept;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local function return_result (check, err_type)								-- local function to handle the various returns&lt;br /&gt;
		local SBN = internal_link_id ({link = handler.link, label = handler.label, redirect = handler.redirect,&lt;br /&gt;
						prefix = handler.prefix, id = id, separator = handler.separator});&lt;br /&gt;
		if not ignore_invalid then												-- if not ignoring SBN errors&lt;br /&gt;
			if not check then&lt;br /&gt;
				options.coins_list_t[&#039;SBN&#039;] = nil;								-- when error, unset so not included in COinS; not really necessary here because sbn not made part of COinS&lt;br /&gt;
				set_message (&#039;err_bad_sbn&#039;, {err_type});						-- display an error message&lt;br /&gt;
				return SBN; &lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			set_message (&#039;maint_isbn_ignore&#039;);									-- add a maint category even when there is no error (ToDo: Possibly switch to separate message for SBNs only)&lt;br /&gt;
		end&lt;br /&gt;
		return SBN;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if id:match (&#039;[^%s-0-9X]&#039;) then&lt;br /&gt;
		return return_result (false, cfg.err_msg_supl.char);					-- fail if SBN contains anything but digits, hyphens, or the uppercase X&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local ident = id:gsub (&#039;[%s-]&#039;, &#039;&#039;);										-- remove hyphens and whitespace; they interfere with the rest of the tests&lt;br /&gt;
&lt;br /&gt;
	if  9 ~= ident:len() then&lt;br /&gt;
		return return_result (false, cfg.err_msg_supl.length);					-- fail if incorrect length&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if ident:match (&#039;^%d*X?$&#039;) == nil then&lt;br /&gt;
		return return_result (false, cfg.err_msg_supl.form);					-- fail if SBN has &#039;X&#039; anywhere but last position&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return return_result (is_valid_isxn (&#039;0&#039; .. ident, 10), cfg.err_msg_supl.check);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; S S R N &amp;gt;----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Format an SSRN, do simple error checking&lt;br /&gt;
&lt;br /&gt;
SSRNs are sequential numbers beginning at 100? and counting up.  This code checks the SSRN to see that it is&lt;br /&gt;
only digits and is greater than 99 and less than test_limit; the value in local variable test_limit will need&lt;br /&gt;
to be updated periodically as more SSRNs are issued.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function ssrn (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
	local id_num;&lt;br /&gt;
	local text;&lt;br /&gt;
	&lt;br /&gt;
	id_num = id:match (&#039;^%d+$&#039;);												-- id must be all digits&lt;br /&gt;
&lt;br /&gt;
	if is_set (id_num) then														-- id_num has a value so test it&lt;br /&gt;
		id_num = tonumber (id_num);												-- convert id_num to a number for range testing&lt;br /&gt;
		if 100 &amp;gt; id_num or handler.id_limit &amp;lt; id_num then						-- if SSRN is outside test limit boundaries&lt;br /&gt;
			set_message (&#039;err_bad_ssrn&#039;);										-- set an error message&lt;br /&gt;
			options.coins_list_t[&#039;SSRN&#039;] = nil;									-- when error, unset so not included in COinS&lt;br /&gt;
		end&lt;br /&gt;
	else																		-- when id format incorrect&lt;br /&gt;
		set_message (&#039;err_bad_ssrn&#039;);											-- set an error message&lt;br /&gt;
		options.coins_list_t[&#039;SSRN&#039;] = nil;										-- when error, unset so not included in COinS&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	text = external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
		prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode, access = options.access});&lt;br /&gt;
&lt;br /&gt;
	return text;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; U S E N E T _ I D &amp;gt;------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Validate and format a usenet message id.  Simple error checking, looks for &#039;id-left@id-right&#039; not enclosed in&lt;br /&gt;
&#039;&amp;lt;&#039; and/or &#039;&amp;gt;&#039; angle brackets.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function usenet_id (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
&lt;br /&gt;
	local text = external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
		prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode})&lt;br /&gt;
 &lt;br /&gt;
	if not id:match(&#039;^.+@.+$&#039;) or not id:match(&#039;^[^&amp;lt;].*[^&amp;gt;]$&#039;) then				-- doesn&#039;t have &#039;@&#039; or has one or first or last character is &#039;&amp;lt; or &#039;&amp;gt;&#039;&lt;br /&gt;
		set_message (&#039;err_bad_usenet_id&#039;)										-- add an error message if the message id is invalid&lt;br /&gt;
		options.coins_list_t[&#039;USENETID&#039;] = nil;									-- when error, unset so not included in COinS&lt;br /&gt;
	end &lt;br /&gt;
	&lt;br /&gt;
	return text;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; Z B L &amp;gt;-----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
A numerical identifier in the form nnnn.nnnnn - leading zeros in the first quartet optional&lt;br /&gt;
&lt;br /&gt;
format described here: http://emis.mi.sanu.ac.rs/ZMATH/zmath/en/help/search/&lt;br /&gt;
&lt;br /&gt;
temporary format is apparently eight digits.  Anything else is an error&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function zbl (options)&lt;br /&gt;
	local id = options.id;&lt;br /&gt;
	local handler = options.handler;&lt;br /&gt;
&lt;br /&gt;
	if id:match(&#039;^%d%d%d%d%d%d%d%d$&#039;) then										-- is this identifier using temporary format?&lt;br /&gt;
		set_message (&#039;maint_zbl&#039;);												-- yes, add maint cat&lt;br /&gt;
	elseif not id:match(&#039;^%d?%d?%d?%d%.%d%d%d%d%d$&#039;) then						-- not temporary, is it normal format?&lt;br /&gt;
		set_message (&#039;err_bad_zbl&#039;);											-- no, set an error message&lt;br /&gt;
		options.coins_list_t[&#039;ZBL&#039;] = nil;										-- when error, unset so not included in COinS&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return external_link_id ({link = handler.link, label = handler.label, q = handler.q, redirect = handler.redirect,&lt;br /&gt;
			prefix = handler.prefix, id = id, separator = handler.separator, encode = handler.encode});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--============================&amp;lt;&amp;lt; I N T E R F A C E   F U N C T I O N S &amp;gt;&amp;gt;==========================================&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E X T R A C T _ I D S &amp;gt;------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Populates ID table from arguments using configuration settings. Loops through cfg.id_handlers and searches args for&lt;br /&gt;
any of the parameters listed in each cfg.id_handlers[&#039;...&#039;].parameters.  If found, adds the parameter and value to&lt;br /&gt;
the identifier list.  Emits redundant error message if more than one alias exists in args&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function extract_ids (args)&lt;br /&gt;
	local id_list = {};															-- list of identifiers found in args&lt;br /&gt;
	for k, v in pairs (cfg.id_handlers) do										-- k is uppercase identifier name as index to cfg.id_handlers; e.g. cfg.id_handlers[&#039;ISBN&#039;], v is a table&lt;br /&gt;
		v = select_one (args, v.parameters, &#039;err_redundant_parameters&#039; );		-- v.parameters is a table of aliases for k; here we pick one from args if present&lt;br /&gt;
		if is_set (v) then id_list[k] = v; end									-- if found in args, add identifier to our list&lt;br /&gt;
	end&lt;br /&gt;
	return id_list;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E X T R A C T _ I D _ A C C E S S _ L E V E L S &amp;gt;--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Fetches custom id access levels from arguments using configuration settings. Parameters which have a predefined access&lt;br /&gt;
level (e.g. arxiv) do not use this function as they are directly rendered as free without using an additional parameter.&lt;br /&gt;
&lt;br /&gt;
returns a table of k/v pairs where k is same as the identifier&#039;s key in cfg.id_handlers and v is the assigned (valid) keyword&lt;br /&gt;
&lt;br /&gt;
access-level values must match the case used in cfg.keywords_lists[&#039;id-access&#039;] (lowercase unless there is some special reason for something else)&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function extract_id_access_levels (args, id_list)&lt;br /&gt;
	local id_accesses_list = {};&lt;br /&gt;
	for k, v in pairs (cfg.id_handlers) do&lt;br /&gt;
		local access_param = v.custom_access;									-- name of identifier&#039;s access-level parameter&lt;br /&gt;
		if is_set (access_param) then&lt;br /&gt;
			local access_level = args[access_param];							-- get the assigned value if there is one&lt;br /&gt;
			if is_set (access_level) then&lt;br /&gt;
				if not in_array (access_level, cfg.keywords_lists[&#039;id-access&#039;]) then	-- exact match required&lt;br /&gt;
					set_message (&#039;err_invalid_param_val&#039;, {access_param, access_level});	&lt;br /&gt;
					access_level = nil;											-- invalid so unset&lt;br /&gt;
				end&lt;br /&gt;
				if not is_set (id_list[k]) then									-- identifier access-level must have a matching identifier&lt;br /&gt;
					set_message (&#039;err_param_access_requires_param&#039;, {k:lower()});	-- parameter name is uppercase in cfg.id_handlers (k); lowercase for error message&lt;br /&gt;
				end&lt;br /&gt;
				id_accesses_list[k] = cfg.keywords_xlate[access_level];			-- get translated keyword&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return id_accesses_list;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; B U I L D _ I D _ L I S T &amp;gt;----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
render the identifiers into a sorted sequence table&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ID_list_coins_t&amp;gt; is a table of k/v pairs where k is same as key in cfg.id_handlers and v is the assigned value&lt;br /&gt;
&amp;lt;options_t&amp;gt; is a table of various k/v option pairs provided in the call to new_build_id_list();&lt;br /&gt;
	modified by	this function and passed to all identifier rendering functions&lt;br /&gt;
&amp;lt;access_levels_t&amp;gt; is a table of k/v pairs where k is same as key in cfg.id_handlers and v is the assigned value (if valid)&lt;br /&gt;
&lt;br /&gt;
returns a sequence table of sorted (by hkey - &#039;handler&#039; key) rendered identifier strings&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function build_id_list (ID_list_coins_t, options_t, access_levels_t)&lt;br /&gt;
	local ID_list_t = {};&lt;br /&gt;
	local accept;&lt;br /&gt;
	local func_map = {															--function map points to functions associated with hkey identifier&lt;br /&gt;
		[&#039;ARXIV&#039;] = arxiv,&lt;br /&gt;
		[&#039;ASIN&#039;] = asin,&lt;br /&gt;
		[&#039;BIBCODE&#039;] = bibcode,&lt;br /&gt;
		[&#039;BIORXIV&#039;] = biorxiv,&lt;br /&gt;
		[&#039;CITESEERX&#039;] = citeseerx,&lt;br /&gt;
		[&#039;DOI&#039;] = doi,&lt;br /&gt;
		[&#039;EISSN&#039;] = issn,&lt;br /&gt;
		[&#039;HDL&#039;] = hdl,&lt;br /&gt;
		[&#039;ISBN&#039;] = isbn,&lt;br /&gt;
		[&#039;ISMN&#039;] = ismn,&lt;br /&gt;
		[&#039;ISSN&#039;] = issn,&lt;br /&gt;
		[&#039;JFM&#039;] = jfm,&lt;br /&gt;
		[&#039;JSTOR&#039;] = jstor,&lt;br /&gt;
		[&#039;LCCN&#039;] = lccn,&lt;br /&gt;
		[&#039;MEDRXIV&#039;] = medrxiv,&lt;br /&gt;
		[&#039;MR&#039;] = mr,&lt;br /&gt;
		[&#039;OCLC&#039;] = oclc,&lt;br /&gt;
		[&#039;OL&#039;] = openlibrary,&lt;br /&gt;
		[&#039;OSTI&#039;] = osti,&lt;br /&gt;
		[&#039;PMC&#039;] = pmc,&lt;br /&gt;
		[&#039;PMID&#039;] = pmid,&lt;br /&gt;
		[&#039;RFC&#039;]  = rfc,&lt;br /&gt;
		[&#039;S2CID&#039;] = s2cid,&lt;br /&gt;
		[&#039;SBN&#039;] = sbn,&lt;br /&gt;
		[&#039;SSRN&#039;] = ssrn,&lt;br /&gt;
		[&#039;USENETID&#039;] = usenet_id,&lt;br /&gt;
		[&#039;ZBL&#039;] = zbl,&lt;br /&gt;
		}&lt;br /&gt;
&lt;br /&gt;
	for hkey, v in pairs (ID_list_coins_t) do&lt;br /&gt;
		v, accept = has_accept_as_written (v);									-- remove accept-as-written markup if present; accept is boolean true when markup removed; false else&lt;br /&gt;
																				-- every function gets the options table with value v and accept boolean&lt;br /&gt;
		options_t.hkey = hkey;													-- ~/Configuration handler key&lt;br /&gt;
		options_t.id = v;														-- add that identifier value to the options table&lt;br /&gt;
		options_t.accept = accept;												-- add the accept boolean flag&lt;br /&gt;
		options_t.access = access_levels_t[hkey];								-- add the access level for those that have an |&amp;lt;identifier-access= parameter&lt;br /&gt;
		options_t.handler = cfg.id_handlers[hkey];&lt;br /&gt;
		options_t.coins_list_t = ID_list_coins_t;								-- pointer to ID_list_coins_t; for |asin= and |ol=; also to keep erroneous values out of the citation&#039;s metadata&lt;br /&gt;
		options_t.coins_list_t[hkey] = v;										-- id value without accept-as-written markup for metadata&lt;br /&gt;
		&lt;br /&gt;
		if options_t.handler.access and not in_array (options_t.handler.access, cfg.keywords_lists[&#039;id-access&#039;]) then&lt;br /&gt;
			error (cfg.messages[&#039;unknown_ID_access&#039;] .. options_t.handler.access);	-- here when handler access key set to a value not listed in list of allowed id access keywords&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if func_map[hkey] then&lt;br /&gt;
			local id_text = func_map[hkey] (options_t);							-- call the function to get identifier text and any error message&lt;br /&gt;
			table.insert (ID_list_t, {hkey, id_text});							-- add identifier text to the output sequence table&lt;br /&gt;
		else&lt;br /&gt;
			error (cfg.messages[&#039;unknown_ID_key&#039;] .. hkey);						-- here when func_map doesn&#039;t have a function for hkey&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function comp (a, b)													-- used by following table.sort()&lt;br /&gt;
		return a[1]:lower() &amp;lt; b[1]:lower();										-- sort by hkey&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	table.sort (ID_list_t, comp);												-- sequence table of tables sort	&lt;br /&gt;
	for k, v in ipairs (ID_list_t) do											-- convert sequence table of tables to simple sequence table of strings&lt;br /&gt;
		ID_list_t[k] = v[2];													-- v[2] is the identifier rendering from the call to the various functions in func_map{}&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return ID_list_t;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; O P T I O N S _ C H E C K &amp;gt;----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
check that certain option parameters have their associated identifier parameters with values&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ID_list_coins_t&amp;gt; is a table of k/v pairs where k is same as key in cfg.id_handlers and v is the assigned value&lt;br /&gt;
&amp;lt;ID_support_t&amp;gt; is a sequence table of tables created in citation0() where each subtable has four elements:&lt;br /&gt;
	[1] is the support parameter&#039;s assigned value; empty string if not set&lt;br /&gt;
	[2] is a text string same as key in cfg.id_handlers&lt;br /&gt;
	[3] is cfg.error_conditions key used to create error message&lt;br /&gt;
	[4] is original ID support parameter name used to create error message&lt;br /&gt;
	&lt;br /&gt;
returns nothing; on error emits an appropriate error message&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function options_check (ID_list_coins_t, ID_support_t)&lt;br /&gt;
	for _, v in ipairs (ID_support_t) do&lt;br /&gt;
		if is_set (v[1]) and not ID_list_coins_t[v[2]] then						-- when support parameter has a value but matching identifier parameter is missing or empty&lt;br /&gt;
			set_message (v[3], (v[4]));											-- emit the appropriate error message&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I D E N T I F I E R _ L I S T S _ G E T &amp;gt;--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Creates two identifier lists: a k/v table of identifiers and their values to be used locally and for use in the&lt;br /&gt;
COinS metadata, and a sequence table of the rendered identifier strings that will be included in the rendered&lt;br /&gt;
citation.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function identifier_lists_get (args_t, options_t, ID_support_t)&lt;br /&gt;
	local ID_list_coins_t = extract_ids (args_t);										-- get a table of identifiers and their values for use locally and for use in COinS&lt;br /&gt;
	options_check (ID_list_coins_t, ID_support_t);										-- ID support parameters must have matching identifier parameters &lt;br /&gt;
	local ID_access_levels_t = extract_id_access_levels (args_t, ID_list_coins_t);		-- get a table of identifier access levels&lt;br /&gt;
	local ID_list_t = build_id_list (ID_list_coins_t, options_t, ID_access_levels_t);	-- get a sequence table of rendered identifier strings&lt;br /&gt;
&lt;br /&gt;
	return ID_list_t, ID_list_coins_t;											-- return the tables&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; S E T _ S E L E C T E D _ M O D U L E S &amp;gt;--------------------------------------&lt;br /&gt;
&lt;br /&gt;
Sets local cfg table and imported functions table to same (live or sandbox) as that used by the other modules.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function set_selected_modules (cfg_table_ptr, utilities_page_ptr)&lt;br /&gt;
	cfg = cfg_table_ptr;&lt;br /&gt;
&lt;br /&gt;
	has_accept_as_written = utilities_page_ptr.has_accept_as_written;			-- import functions from select Module:Citation/CS1/Utilities module&lt;br /&gt;
	is_set = utilities_page_ptr.is_set;								&lt;br /&gt;
	in_array = utilities_page_ptr.in_array;&lt;br /&gt;
	set_message = utilities_page_ptr.set_message;&lt;br /&gt;
	select_one = utilities_page_ptr.select_one;&lt;br /&gt;
	substitute = utilities_page_ptr.substitute;&lt;br /&gt;
	make_wikilink = utilities_page_ptr.make_wikilink;&lt;br /&gt;
&lt;br /&gt;
	z = utilities_page_ptr.z;													-- table of tables in Module:Citation/CS1/Utilities&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E X P O R T E D   F U N C T I O N S &amp;gt;------------------------------------------&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	auto_link_urls = auto_link_urls,											-- table of identifier URLs to be used when auto-linking |title=&lt;br /&gt;
	&lt;br /&gt;
	identifier_lists_get = identifier_lists_get,								-- experiment to replace individual calls to build_id_list(), extract_ids, extract_id_access_levels&lt;br /&gt;
	is_embargoed = is_embargoed;&lt;br /&gt;
	set_selected_modules = set_selected_modules;&lt;br /&gt;
	}&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Module:CS1_identifiers&amp;diff=6659</id>
		<title>Module:CS1 identifiers</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Module:CS1_identifiers&amp;diff=6659"/>
		<updated>2025-11-01T21:39:23Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;require (&#039;strict&#039;);&lt;br /&gt;
&lt;br /&gt;
local get_args = require (&#039;Module:Arguments&#039;).getArgs;&lt;br /&gt;
local identifiers = require (&#039;Module:Citation/CS1/Identifiers&#039;);&lt;br /&gt;
local utilities = require (&#039;Module:Citation/CS1/Utilities&#039;);&lt;br /&gt;
	local has_accept_as_written = utilities.has_accept_as_written;				-- import functions from Module:Citation/CS1/Utilities&lt;br /&gt;
	local is_set = utilities.is_set;&lt;br /&gt;
	local make_wikilink = utilities.make_wikilink;&lt;br /&gt;
	local set_message = utilities.set_message;&lt;br /&gt;
	local substitute = utilities.substitute;&lt;br /&gt;
&lt;br /&gt;
local cfg = mw.loadData (&#039;Module:Citation/CS1/Configuration&#039;);&lt;br /&gt;
&lt;br /&gt;
utilities.set_selected_modules (cfg);											-- so that functions in Utilities can see the selected cfg tables&lt;br /&gt;
identifiers.set_selected_modules (cfg, utilities);								-- so that functions in Identifiers can see the selected cfg tables and selected Utilities module&lt;br /&gt;
&lt;br /&gt;
local Frame;																	-- local copy of &amp;lt;frame&amp;gt; from main(); nil else&lt;br /&gt;
local this_page = mw.title.getCurrentTitle();									-- used to limit categorization to certain namepsaces&lt;br /&gt;
&lt;br /&gt;
local no_cat;																	-- used to limit categorization to certain namespaces&lt;br /&gt;
if cfg.uncategorized_namespaces[this_page.namespace] then						-- is this page&#039;s namespace id one of the uncategorized namespace ids?&lt;br /&gt;
	no_cat = true;																-- set no_cat; this page will not be categorized&lt;br /&gt;
end&lt;br /&gt;
for _, v in ipairs (cfg.uncategorized_subpages) do								-- cycle through page name patterns&lt;br /&gt;
	if this_page.text:match (v) then											-- test page name against each pattern&lt;br /&gt;
		no_cat = true;															-- set no_cat; this page will not be categorized&lt;br /&gt;
		break;																	-- bail out if one is found&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E R R _ M E S S A G E _ C O N V E R T &amp;gt;----------------------------------------&lt;br /&gt;
&lt;br /&gt;
converts cs1|2 error message to a message suitable for this module.&lt;br /&gt;
&lt;br /&gt;
converted error messages do not name a parameter as is done in cs1|2.  The help link links to the template page&lt;br /&gt;
not to a help-namespace page.  The prefix is rewritten to name the offending template; not a cs1|2 template.&lt;br /&gt;
&lt;br /&gt;
adds template specific category.&lt;br /&gt;
&lt;br /&gt;
done this way because the identifier functions in Module:Citation/CS1/Identifiers create properly formatted&lt;br /&gt;
messages with correct html for styling.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function err_message_convert (message_prefix, message, _template, no_cat)&lt;br /&gt;
	message = message:gsub (&#039;&amp;amp;#124;([^=]+)=&#039;, &#039;%1&#039;);							-- remove parameter pipe and assignment operator&lt;br /&gt;
	message = message:gsub (&#039;Help:CS1 errors#[^%]]+&#039;, substitute (&#039;Template:$1|help&#039;, _template));	-- rewrite help text&lt;br /&gt;
	message = message:gsub (&#039;(%b&amp;lt;&amp;gt;)&#039;, substitute (&#039;$1$2: &#039;, {&#039;%1&#039;, message_prefix}), 1);	-- %1 is the opening span tag; insert &amp;lt;message_prefix&amp;gt;&lt;br /&gt;
	local category = no_cat and &#039;&#039; or substitute (&#039;[[Category:Pages with $1 errors]]&#039;, _template:upper());	-- limited to certain namespaces &lt;br /&gt;
	return substitute (&#039;$1$2&#039;, {message, category});							-- make a big string and done&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; M A I N T _ M E S S A G E _ C O N V E R T &amp;gt;------------------------------------&lt;br /&gt;
&lt;br /&gt;
converts cs1|2 maintenance message to a message suitable for this module.&lt;br /&gt;
&lt;br /&gt;
converted maintenance messages have a prefix suitable for the rendered template.  The &#039;link&#039; text links to the&lt;br /&gt;
an appropriate maintenance category&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function maint_message_convert (message_prefix, message_raw, _template, no_cat)&lt;br /&gt;
	message_raw = message_raw:gsub (&#039;CS1 maint: &#039;, &#039;&#039;);							-- strip cs1-specific prefix from cat name&lt;br /&gt;
	local message = substitute (&#039;$1: $2&#039;, {message_prefix, message_raw});		-- add the template prefix&lt;br /&gt;
	message = substitute (&#039;$1$2 ($3)&#039;, {&lt;br /&gt;
		message,&lt;br /&gt;
		no_cat and &#039;&#039; or substitute (cfg.messages[&#039;cat wikilink&#039;], message_raw),-- the category link; limited to certain namespaces&lt;br /&gt;
		substitute (cfg.messages[&#039;:cat wikilink&#039;], message_raw)}				-- links to the maint cat, just as cs1|2 links to its maint cats&lt;br /&gt;
		);&lt;br /&gt;
	return substitute (cfg.presentation[&#039;hidden-maint&#039;], message);				-- the maint message text&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; P A R A M S _ G E T &amp;gt;----------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
extract enumerated parameters from &amp;lt;args_t&amp;gt; where the enumerator is &amp;lt;i&amp;gt;.  enumerator is always the last character&lt;br /&gt;
of the parameter name (doi-broken-date1 not doi1-broken-date)&lt;br /&gt;
&lt;br /&gt;
special case the enumerator is 1: prefer non-enumerated parameters&lt;br /&gt;
&lt;br /&gt;
returns a table of same-enumerator parameters (without enumerator) &lt;br /&gt;
&lt;br /&gt;
note: &amp;lt;i&amp;gt; is a number&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function params_get (args_t, i)&lt;br /&gt;
--mw.logObject (args_t, &#039;args_t&#039;)&lt;br /&gt;
	local params_t = {};														-- selected parameters go in this table&lt;br /&gt;
	if 1 == i then																-- special case when enumerator (&amp;lt;i&amp;gt;) is 1&lt;br /&gt;
		for k, v in pairs (args_t) do											-- for each parameter&lt;br /&gt;
			if &#039;number&#039; == type (k) then										-- if this is a positional parameter&lt;br /&gt;
				if 1 == k then													-- and its the first positional parameter&lt;br /&gt;
					params_t[1] = v;											-- save it&lt;br /&gt;
				end&lt;br /&gt;
			else																-- here for named parameters&lt;br /&gt;
				local enum = k:match (&#039;%d+$&#039;);									-- extract the enumerator from the parameter&#039;s name; nil else&lt;br /&gt;
				if (not enum) or (1 == tonumber (enum)) then					-- when not enumerated or when enumerator is 1&lt;br /&gt;
					k = k:gsub (&#039;%d+$&#039;, &#039;&#039;);									-- remove the enumerator from parameter name&lt;br /&gt;
					params_t[k] = v;											-- and save this parameter&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		for k, v in pairs (args_t) do											-- for each parameter&lt;br /&gt;
			if &#039;number&#039; == type (k) then										-- if this is a positional parameter&lt;br /&gt;
				if i == k then													-- and is the desired positional parameter&lt;br /&gt;
					params_t[1] = v;											-- save it (as index number 1; not as index &amp;lt;i&amp;gt;)&lt;br /&gt;
				end&lt;br /&gt;
			else																-- here for named parameters&lt;br /&gt;
				local enum = k:match (&#039;%d+$&#039;);									-- extract the parameter&#039;s enumerator; nil else&lt;br /&gt;
				if enum and (i == tonumber (enum)) then							-- when enumerated and the enumerator is same as requested&lt;br /&gt;
					k = k:gsub (&#039;%d+$&#039;, &#039;&#039;);									-- remove the enumerator from parameter name&lt;br /&gt;
					params_t[k] = v;											-- and save this parameter&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
--mw.logObject (params_t, &#039;params_t&#039;)&lt;br /&gt;
	return params_t;															-- and done&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; R E N D E R _ F I N A L &amp;gt;------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
this function applies cs1|2 template style sheet to a rendered identifier or error message&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function render_final (output)&lt;br /&gt;
	if not Frame then															-- not set when this module called from another module&lt;br /&gt;
		Frame = mw.getCurrentFrame();											-- get the calling module&#039;s frame so that we can call extensionTag()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return substitute (&#039;$1$2&#039;, {&lt;br /&gt;
		Frame:extensionTag (&#039;templatestyles&#039;, &#039;&#039;, {src=&#039;Module:Citation/CS1/styles.css&#039;}),	-- apply templatestyles&lt;br /&gt;
		output																	-- to the rendered identifier or error message&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; _ M A I N &amp;gt;--------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
entry point when called from another module; example:&lt;br /&gt;
	local rendered_identifier = require (&#039;Module:CS1 identifiers&#039;)._main ({&#039;10.4231/sommat&#039;, _template = &#039;doi&#039;, [&#039;doi-access&#039;] = &#039;free&#039;, [&#039;doi-broken-date&#039;] = &#039;June 2025&#039;});&lt;br /&gt;
&lt;br /&gt;
supported identifier templates are:&lt;br /&gt;
	{{arxiv}}	{{asin}}	{{bibcode}}	{{biorxiv}}		{{citeseerx}}	{{doi}}&lt;br /&gt;
	{{hdl}}		{{isbn}}	{{ismn}}	{{issn}}		{{jfm}}			{{jstor}}&lt;br /&gt;
	{{medrxiv}}	{{mr}}		{{oclc}}	{{ol}}			{{osti}}		{{pmc}}&lt;br /&gt;
	{{pmid}}	{{sbn}}		{{ssrn}}	{{s2cid}}		{{zbl}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;args_t&amp;gt; is a table of all parameters needed to properly render the identifier&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function _main (args_t)&lt;br /&gt;
	local ID_list_t = {};														-- sequence table of rendered identifiers&lt;br /&gt;
	local ID_list_coins_t = {};													-- table of identifiers and their values from args; key is same as cfg.id_handlers&#039;s key; COinS not supported in this module&lt;br /&gt;
	local template_name = args_t._template;&lt;br /&gt;
	local message_prefix;&lt;br /&gt;
&lt;br /&gt;
	if not (template_name and cfg.id_handlers[template_name:upper()]) then&lt;br /&gt;
		error (&#039;|_template= requires valid value&#039;);								-- a message for template writers; not seen by users&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	template_name = template_name:lower();										-- force lower case&lt;br /&gt;
	message_prefix = substitute (&#039;&amp;lt;code class=&amp;quot;cs1-code&amp;quot;&amp;gt;&amp;amp;#x7B;{[[Template:$1|$1]]}}&amp;lt;/code&amp;gt;&#039;, template_name);&lt;br /&gt;
&lt;br /&gt;
	local rendered_id;															-- a single rendered id worked on here&lt;br /&gt;
	local rendered_ids_t = {};													-- individual rendered ids go here&lt;br /&gt;
	&lt;br /&gt;
	local i = 1;																-- initialize the indexer for the repeat loop&lt;br /&gt;
	repeat																		-- loop until no &lt;br /&gt;
		local params_t = params_get (args_t, i);								-- get the parameters associated with enumerator &amp;lt;i&amp;gt;&lt;br /&gt;
		params_t[template_name] = params_t[1] or params_t[&#039;id&#039;];				-- assign value from {{{1}}} or |id= to |&amp;lt;identifier&amp;gt;=&lt;br /&gt;
		params_t._template = nil;												-- unset as no longer needed&lt;br /&gt;
		if not params_t[template_name] then										-- in case params_t[1] and params_t.id are nil&lt;br /&gt;
			params_t[template_name] = &#039;&#039;;										-- set &amp;lt;id&amp;gt; to empty string&lt;br /&gt;
			return render_final (												-- make an error message and done&lt;br /&gt;
				substitute (&#039;&amp;lt;span class=&amp;quot;cs1-visible-error citation-comment&amp;quot;&amp;gt;$1: required identifier missing ($2)&amp;lt;/span&amp;gt;$3&#039;, {&lt;br /&gt;
					message_prefix,&lt;br /&gt;
					substitute (&#039;[[Template:$1|help]]&#039;, template_name),&lt;br /&gt;
					no_cat and &#039;&#039; or substitute (&#039;[[Category:Pages with $1 errors]]&#039;, template_name:upper())&lt;br /&gt;
					}));&lt;br /&gt;
		end&lt;br /&gt;
		params_t[i] = nil;														-- unset these as no longer needed&lt;br /&gt;
		params_t.id = nil;&lt;br /&gt;
&lt;br /&gt;
		local DoiBroken = params_t[&#039;doi-broken-date&#039;];							-- {{doi}} only&lt;br /&gt;
		local Embargo = params_t[&#039;pmc-embargo-date&#039;];							-- {{pmc}} only&lt;br /&gt;
		local Class = params_t[&#039;class&#039;];										-- {{arxiv}} only&lt;br /&gt;
		local AsinTLD = params_t[&#039;asin-tld&#039;];									-- {{asin}} only&lt;br /&gt;
&lt;br /&gt;
		ID_list_t, ID_list_coins_t = identifiers.identifier_lists_get (params_t, {DoiBroken = DoiBroken, Embargo = Embargo, Class = Class, ASINTLD = AsinTLD}, {});	-- {} is a placeholder for unused ID_support{}&lt;br /&gt;
		rendered_id = ID_list_t[1];&lt;br /&gt;
&lt;br /&gt;
		if utilities.z.error_msgs_t[1] then										-- only one error message considered&lt;br /&gt;
			rendered_id = substitute (&#039;$1 $2&#039;, {&lt;br /&gt;
				rendered_id,&lt;br /&gt;
				err_message_convert (message_prefix, utilities.z.error_msgs_t[1], template_name, no_cat),&lt;br /&gt;
				});&lt;br /&gt;
			&lt;br /&gt;
		elseif utilities.z.maint_cats_t[1] then									-- only one maint message considered per rendering&lt;br /&gt;
			rendered_id = substitute (&#039;$1 $2&#039;, {&lt;br /&gt;
				rendered_id,&lt;br /&gt;
				maint_message_convert (message_prefix, utilities.z.maint_cats_t[1], template_name, no_cat),&lt;br /&gt;
				});&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		utilities.z.error_msgs_t = {};											-- reset these&lt;br /&gt;
		utilities.z.maint_cats_t = {};&lt;br /&gt;
		&lt;br /&gt;
		if (1 ~= i) or ((1 == i) and (&#039;yes&#039; == args_t.plainlink)) then			-- no label for 2nd... identifiers; when |plainlink=yes then no label for first identifier; &lt;br /&gt;
			local separator = cfg.id_handlers[template_name:upper()].separator;	-- get the identifier label separator&lt;br /&gt;
			rendered_id = rendered_id:gsub (&#039;^%[%[.-|.-%]%]&#039;, &#039;&#039;);				-- strip cs1-supplied label&lt;br /&gt;
			rendered_id = rendered_id:gsub (&#039;^&#039; .. separator, &#039;&#039;);				-- and strip the label separator&lt;br /&gt;
		elseif 1 == i then														-- here for first identifier; |plainlink= not set&lt;br /&gt;
			if &#039;no&#039; == args_t.link then											-- |link=no then do not link identifier label&lt;br /&gt;
				rendered_id = rendered_id:gsub (&#039;^%[%[.-|(.-)%]%]&#039;, &#039;%1&#039;);		-- strip wikilink markup from cs1-supplied label&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		table.insert (rendered_ids_t, rendered_id);								-- save the rendered identifier&lt;br /&gt;
		&lt;br /&gt;
		i = i + 1;																-- bump the indexer&lt;br /&gt;
		until not (args_t[i] or args_t[&#039;id&#039; .. i]);								-- end of repeat loop&lt;br /&gt;
&lt;br /&gt;
	local list_separator = &#039;, &#039;;												-- identifier separator for a list of identifiers&lt;br /&gt;
	local leadout = args_t.leadout and mw.ustring.gsub (args_t.leadout, &#039;^(%a.*)&#039;, &#039; %1 &#039;) or nil;	-- insert leading space if first character is a letter; add trailing space&lt;br /&gt;
&lt;br /&gt;
	if leadout then																-- extra text goes between last two identifiers in the list&lt;br /&gt;
		return render_final (mw.text.listToText (rendered_ids_t, list_separator, leadout));	-- make a list, add templatestyles, and done&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return render_final (table.concat (rendered_ids_t, list_separator));		-- make a list, add templatestyles, and done&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; M A I N &amp;gt;----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
entry point from an invoke&lt;br /&gt;
&lt;br /&gt;
	{{#invoke:CS1 identifiers|main|_template=&amp;lt;identifier name&amp;gt;}}&lt;br /&gt;
	&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function main (frame)&lt;br /&gt;
	Frame = frame;																-- make a copy for rendering final output&lt;br /&gt;
	local args_t = get_args (frame);											-- extract the arguments&lt;br /&gt;
&lt;br /&gt;
	return _main (args_t);														-- render the identifier and done&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E X P O R T S &amp;gt;----------------------------------------------------------------&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	main = main,																-- entry point from an invoke (in a template usually)&lt;br /&gt;
	&lt;br /&gt;
	_main = _main																-- entry point when called from another module&lt;br /&gt;
	}&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Template:ISBN&amp;diff=6657</id>
		<title>Template:ISBN</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Template:ISBN&amp;diff=6657"/>
		<updated>2025-11-01T21:38:12Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{#invoke:CS1 identifiers|main|_template=isbn}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Template:Template_wrapper&amp;diff=6655</id>
		<title>Template:Template wrapper</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Template:Template_wrapper&amp;diff=6655"/>
		<updated>2025-11-01T21:37:18Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Module:Template wrapper]]&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Module:Template_wrapper&amp;diff=6653</id>
		<title>Module:Template wrapper</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Module:Template_wrapper&amp;diff=6653"/>
		<updated>2025-11-01T21:37:06Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;require(&#039;strict&#039;);&lt;br /&gt;
&lt;br /&gt;
local error_msg = &#039;&amp;lt;span style=\&amp;quot;font-size:100%\&amp;quot; class=\&amp;quot;error\&amp;quot;&amp;gt;&amp;lt;code style=\&amp;quot;color:inherit; border:inherit; padding:inherit;\&amp;quot;&amp;gt;&amp;amp;#124;_template=&amp;lt;/code&amp;gt; missing or empty&amp;lt;/span&amp;gt;&#039;;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S _ I N _ T A B L E &amp;gt;--------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
scan through tbl looking for value; return true if found, false else&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function is_in_table (tbl, value)&lt;br /&gt;
    for k, v in pairs (tbl) do&lt;br /&gt;
        if v == value then return true end&lt;br /&gt;
    end&lt;br /&gt;
    return false;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; A D D _ P A R A M E T E R &amp;gt;----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
adds parameter name and its value to args table according to the state of boolean list argument; kv pair for&lt;br /&gt;
template execution; k=v string for template listing.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function add_parameter (k, v, args, list)&lt;br /&gt;
	if list then&lt;br /&gt;
		table.insert( args, table.concat ({k, &#039;=&#039;, v}));						-- write parameter names and values to args table as string&lt;br /&gt;
	else&lt;br /&gt;
		args[k] = v;															-- copy parameters to args table&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; A L I A S _ M A P _ G E T &amp;gt;----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
returns a table of local template (parent frame) parameter names and the target template names that match where&lt;br /&gt;
in [key]=&amp;lt;value&amp;gt; pairs where:&lt;br /&gt;
	[key] is local template parameter name (an alias)&lt;br /&gt;
	&amp;lt;value&amp;gt; is target template parameter name (the canonical parameter name used in the working template)&lt;br /&gt;
&lt;br /&gt;
The parameter |_alias-map= has the form:&lt;br /&gt;
	|_alias-map=&amp;lt;list&amp;gt;&lt;br /&gt;
where &amp;lt;list&amp;gt; is a comma-separated list of alias / canonical parameter name pairs in the form&lt;br /&gt;
	&amp;lt;from&amp;gt; : &amp;lt;to&amp;gt;&lt;br /&gt;
where:&lt;br /&gt;
	&amp;lt;from&amp;gt; is the local template&#039;s parameter name (alias)&lt;br /&gt;
	&amp;lt;to&amp;gt; is the target template&#039;s parameter name (canonical)&lt;br /&gt;
	for enumerated parameters place an octothorp (#) where the enumerator digits are placed in the parameter names:&lt;br /&gt;
		&amp;lt;from#&amp;gt; : &amp;lt;to#&amp;gt;&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function alias_map_get (_alias_map)&lt;br /&gt;
	local T = mw.text.split (_alias_map, &#039;%s*,%s*&#039;);							-- convert the comma-separated list into a table of alias pairs&lt;br /&gt;
	local mapped_aliases = {};													-- mapped aliases will go here&lt;br /&gt;
	local l_name, t_name;														-- parameter names&lt;br /&gt;
	&lt;br /&gt;
	for _, alias_pair in ipairs (T) do											-- loop through the table of alias pairs&lt;br /&gt;
		l_name, t_name = alias_pair:match (&#039;(.-)%s*:%s*(.+)&#039;);					-- from each pair, get local and target parameter names&lt;br /&gt;
		if l_name and t_name then												-- if both are set&lt;br /&gt;
			if tonumber (l_name) then&lt;br /&gt;
				l_name = tonumber (l_name);										-- convert number-as-text to a number&lt;br /&gt;
			end&lt;br /&gt;
			mapped_aliases[l_name] = t_name;									-- add them to the map table&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return mapped_aliases;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; F R A M E _ A R G S _ G E T &amp;gt;--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Fetch the wrapper template&#039;s &#039;default&#039; and control parameters; adds default parameters to args&lt;br /&gt;
&lt;br /&gt;
returns content of |_template= parameter (name of the working template); nil else&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function frame_args_get (frame_args, args, list)&lt;br /&gt;
	local template;&lt;br /&gt;
&lt;br /&gt;
	for k, v in pairs (frame_args) do											-- here we get the wrapper template&#039;s &#039;default&#039; parameters&lt;br /&gt;
		if &#039;string&#039; == type (k) and (v and (&#039;&#039; ~= v)) then						-- do not pass along positional or empty parameters&lt;br /&gt;
			if &#039;_template&#039; == k then&lt;br /&gt;
				template = v;													-- save the name of template that we are wrapping&lt;br /&gt;
			elseif &#039;_exclude&#039; ~= k and &#039;_reuse&#039; ~= k and &#039;_include-positional&#039; ~= k  and &#039;_alias-map&#039; ~= k then	-- these already handled so ignore here; &lt;br /&gt;
				add_parameter (k, v, args, list);								-- add all other parameters to args in the style dictated by list&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return template;															-- return contents of |_template= parameter&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[=[--------------------------&amp;lt; P F R A M E _ A R G S _ G E T &amp;gt;------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Fetches the wrapper template&#039;s &#039;live&#039; parameters; adds live parameters that aren&#039;t members of the exclude table to&lt;br /&gt;
args table; positional parameters may not be excluded&lt;br /&gt;
&lt;br /&gt;
no return value&lt;br /&gt;
&lt;br /&gt;
]=]&lt;br /&gt;
&lt;br /&gt;
local function pframe_args_get (pframe_args, args, exclude, _include_positional, list)&lt;br /&gt;
	for k, v in pairs (pframe_args) do&lt;br /&gt;
		if &#039;string&#039; == type (k) and not is_in_table (exclude, k) then			-- do not pass along excluded parameters&lt;br /&gt;
			if v and (&#039;&#039; ~= v) then												-- pass along only those parameters that have assigned values&lt;br /&gt;
				if &#039;unset&#039; == v:lower() then									-- special keyword to unset &#039;default&#039; parameters set in the wrapper template&lt;br /&gt;
					v = &#039;&#039;;														-- unset the value in the args table&lt;br /&gt;
				end&lt;br /&gt;
				add_parameter (k, v, args, list)								-- add all other parameters to args in the style dictated by list; alias map only supported for local-template parameters&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if _include_positional then&lt;br /&gt;
		for i, v in ipairs (pframe_args) do										-- pass along positional parameters&lt;br /&gt;
			if &#039;unset&#039; == v:lower() then										-- special keyword to unset &#039;default&#039; parameters set in the wrapper template&lt;br /&gt;
				v = &#039;&#039;;															-- unset the value in the args table&lt;br /&gt;
			end&lt;br /&gt;
			add_parameter (i, v, args, list);&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; _ M A I N &amp;gt;--------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Collect the various default and live parameters into args styled according to boolean list.&lt;br /&gt;
&lt;br /&gt;
returns name of the working or listed template or nil for an error message&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function _main (frame, args, list)&lt;br /&gt;
	local template;&lt;br /&gt;
	local exclude = {};															-- table of parameter names for parameters that are not passed to the working template&lt;br /&gt;
	local reuse_list = {};														-- table of pframe parameter names whose values are modified before they are passed to the working template as the same name&lt;br /&gt;
	local alias_map = {};														-- table that maps parameter aliases to working template canonical parameter names&lt;br /&gt;
	local _include_positional;&lt;br /&gt;
	&lt;br /&gt;
	if frame.args._exclude and (&#039;&#039; ~= frame.args._exclude) then					-- if there is |_exclude= and it&#039;s not empty&lt;br /&gt;
		exclude = mw.text.split (frame.args._exclude, &amp;quot;%s*,%s*&amp;quot;);				-- make a table from its contents&lt;br /&gt;
	end&lt;br /&gt;
																				-- TODO: |_reuse= needs a better name (|_reuse=)&lt;br /&gt;
	if frame.args._reuse and (&#039;&#039; ~= frame.args._reuse) then					-- if there is |_reuse= and it&#039;s not empty&lt;br /&gt;
		reuse_list = mw.text.split (frame.args._reuse, &amp;quot;%s*,%s*&amp;quot;);				-- make a table from its contents&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if frame.args[&#039;_alias-map&#039;] and (&#039;&#039; ~= frame.args[&#039;_alias-map&#039;]) then		-- if there is |_alias-map= and it&#039;s not empty&lt;br /&gt;
		alias_map = alias_map_get (frame.args[&#039;_alias-map&#039;]);					-- make a table from its contents&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	template = frame_args_get (frame.args, args, list);							-- get parameters provided in the {{#invoke:template wrapper|...|...}}&lt;br /&gt;
	if nil == template or &#039;&#039; == template then									-- this is the one parameter that is required by this module&lt;br /&gt;
		return nil;																-- not present, tell calling function to emit an error message&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	_include_positional = &#039;yes&#039; == frame.args[&#039;_include-positional&#039;];			-- when true pass all positional parameters along with non-excluded named parameters to ...&lt;br /&gt;
																				-- ... the working template; positional parameters are not excludable&lt;br /&gt;
																				&lt;br /&gt;
	local _pframe_args = frame:getParent().args;								-- here we get the wrapper template&#039;s &#039;live&#039; parameters from pframe.args&lt;br /&gt;
	local pframe_args = {};														-- a local table that we can modify&lt;br /&gt;
&lt;br /&gt;
	for k, v in pairs (_pframe_args) do											-- make a copy that we can modify&lt;br /&gt;
		pframe_args[k] = v;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
-- here we look for pframe parameters that are aliases of canonical parameter names; when found&lt;br /&gt;
-- we replace the alias with the canonical.  We do this here because the reuse_list works on&lt;br /&gt;
-- canonical parameter names so first we convert alias parameter names to canonical names and then&lt;br /&gt;
-- we remove those canonical names from the pframe table that are reused (provided to the working&lt;br /&gt;
-- template through the frame args table)&lt;br /&gt;
&lt;br /&gt;
	for k, v in pairs (alias_map) do											-- k is alias name, v is canonical name&lt;br /&gt;
		if pframe_args[k] then													-- if pframe_args has parameter with alias name&lt;br /&gt;
			pframe_args[v] = _pframe_args[k];									-- create new canonical name with alias&#039; value&lt;br /&gt;
			pframe_args[k] = nil;												-- unset the alias&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for k, v in pairs (pframe_args) do											-- do enumerated parameter alias -&amp;gt; canonical translation&lt;br /&gt;
		if &#039;string&#039; == type (k) then											-- only named parameters can be enumerated&lt;br /&gt;
			if alias_map[k..&#039;#&#039;] then											-- non-enumerated alias matches enumerated parameter pattern? enumerator at end only&lt;br /&gt;
				pframe_args[alias_map[k..&#039;#&#039;]:gsub(&#039;#&#039;, &#039;&#039;)] = v;				-- remove &#039;#&#039; and copy parameter to pframe_args table&lt;br /&gt;
				pframe_args[k] = nil;											-- unset the alias&lt;br /&gt;
			elseif k:match (&#039;%d+&#039;) then											-- if this parameter name contains digits&lt;br /&gt;
				local temp = k:gsub (&#039;%d+&#039;, &#039;#&#039;);								-- make a copy; digits replaced with single &#039;#&#039;&lt;br /&gt;
				local enum = k:match (&#039;%d+&#039;);									-- get the enumerator&lt;br /&gt;
				&lt;br /&gt;
				if alias_map[temp] then											-- if this parameter is a recognized enumerated alias&lt;br /&gt;
					pframe_args[alias_map[temp]:gsub(&#039;#&#039;, enum)] = v;			-- use canonical name and replace &#039;#&#039; with enumerator and add to pframe_args&lt;br /&gt;
					pframe_args[k] = nil;										-- unset the alias&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
-- pframe parameters that are _reused are &#039;reused&#039; have the form something like this:&lt;br /&gt;
--	|chapter=[[wikisource:{{{chapter}}}|{{{chapter}}}]]&lt;br /&gt;
-- where a parameter in the wrapping template is modified and then passed to the working template&lt;br /&gt;
-- using the same parameter name (in this example |chapter=)&lt;br /&gt;
&lt;br /&gt;
																				-- remove parameters that will be reused&lt;br /&gt;
	for k, v in ipairs (reuse_list) do											-- k is numerical index, v is canonical parameter name to ignore&lt;br /&gt;
		if pframe_args[v] then													-- if pframe_args has parameter that should be ignored&lt;br /&gt;
			pframe_args[v] = nil;												-- unset the ignored parameter&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	pframe_args_get (pframe_args, args, exclude, _include_positional, list);	-- add parameters and values to args that are not listed in the exclude table&lt;br /&gt;
&lt;br /&gt;
	return template;															-- args now has all default and live parameters, return working template name&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; W R A P &amp;gt;----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Template entry point.  Call this function to &#039;execute&#039; the working template&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function wrap (frame)&lt;br /&gt;
	local args = {};															-- table of default and live parameters and their values to be passed to the wrapped template&lt;br /&gt;
	local template;																-- the name of the working template&lt;br /&gt;
&lt;br /&gt;
	template = _main (frame, args, false);										-- get default and live parameters and the name of the working template&lt;br /&gt;
	if not template then														-- template name is required&lt;br /&gt;
		return error_msg;														-- emit error message and abandon if template name not present&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return frame:expandTemplate {title=template, args=args};					-- render the working template&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; L I S T &amp;gt;----------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Template entry point.  Call this function to &#039;display&#039; the source for the working template.  This function added&lt;br /&gt;
as a result of a TfD here: Wikipedia:Templates_for_discussion/Log/2018_April_28#Module:PassArguments&lt;br /&gt;
&lt;br /&gt;
This function replaces a similarly named function which was used in {{cite compare}} and {{cite compare2}}&lt;br /&gt;
&lt;br /&gt;
Values in the args table are numerically indexed strings in the form &#039;name=value&#039;&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function list(frame, do_link)&lt;br /&gt;
	local args = {};						-- table of default and live parameters and their values to be passed to the listed template&lt;br /&gt;
	local template;							-- the name of the listed template&lt;br /&gt;
&lt;br /&gt;
	template = _main (frame, args, true);	-- get default and live parameters and the name of the listed template&lt;br /&gt;
	if not template then					-- template name is required&lt;br /&gt;
		return error_msg;					-- emit error message and abandon if template name not present&lt;br /&gt;
	end&lt;br /&gt;
	if do_link then&lt;br /&gt;
		template = (&#039;[[%s|%s]]&#039;):format(frame:expandTemplate{ title=&#039;Transclude&#039;, args = {template} }, template)&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(args)&lt;br /&gt;
	for i = 1, #args do&lt;br /&gt;
		local stripped = args[i]:match(&#039;^&#039; .. i .. &#039;=([^=]*)$&#039;)&lt;br /&gt;
		if stripped then args[i] = stripped else break end&lt;br /&gt;
	end&lt;br /&gt;
	return frame:preprocess(table.concat({&lt;br /&gt;
		&#039;&amp;lt;code style=&amp;quot;color:inherit; background:inherit; border:none;&amp;quot;&amp;gt;&amp;amp;#123;&amp;amp;#123;&#039;,&lt;br /&gt;
		template,&lt;br /&gt;
		(&#039;&amp;lt;wbr&amp;gt;&amp;lt;nowiki&amp;gt;|%s&amp;lt;/nowiki&amp;gt;&#039;):rep(#args):format(unpack(args)), &#039;&amp;amp;#125;&amp;amp;#125;&amp;lt;/code&amp;gt;&#039;}));	-- render the template&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function link (frame)&lt;br /&gt;
	return list(frame, true)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E X P O R T E D   F U N C T I O N S &amp;gt;------------------------------------------&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	link = link,&lt;br /&gt;
	list = list,&lt;br /&gt;
	wrap = wrap,&lt;br /&gt;
	};&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=ISBN_(identifier)&amp;diff=6651</id>
		<title>ISBN (identifier)</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=ISBN_(identifier)&amp;diff=6651"/>
		<updated>2025-11-01T21:33:29Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: Redirected page to wikipedia:ISBN (identifier)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[wikipedia:ISBN (identifier)]]&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=The_Foundation_Stone_of_Nordic_Larp&amp;diff=6647</id>
		<title>The Foundation Stone of Nordic Larp</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=The_Foundation_Stone_of_Nordic_Larp&amp;diff=6647"/>
		<updated>2025-11-01T21:06:43Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: Fix link to pdf&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox book|published=2014 (Knutpunkt)|image=The Foundation Stone of Nordic Larp.jpg|country=Sweden|isbn=978-91-637-4565-2|isbn_note=(ISBND {{ISBNT|978-91-637-4566-9}})|author={{Unbulleted list|[[Eleanor Saitta]]|[[Marie Holm-Andersen]]|[[Jon Back]]}}}}&lt;br /&gt;
&#039;&#039;&#039;The Foundation Stone of Nordic Larp&#039;&#039;&#039;, published in 2014, edited by [[Eleanor Saitta]], [[Marie Holm-Andersen]] and [[Jon Back]] is one of the two [[Knutepunkt-books]] of [[Knutpunkt 2014]]. Graphic design &#039;&#039;Mats Sjögren&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Downloads==&lt;br /&gt;
&lt;br /&gt;
*{{URL|https://www.nordiclarp.org/wiki/images/8/80/2014_The_Foundation_Stone_of_Nordic_Larp.pdf}} The Foundation Stone of Nordic Larp] (PDF, 3.89 MB)&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
*[[The Cutting Edge of Nordic Larp]]&lt;br /&gt;
&lt;br /&gt;
==Video presentation==&lt;br /&gt;
Presentation about the The Knutepunkt 2014 Book by [[Eleanor Saitta]] at the [[Nordic Larp Talks]] 2014.&lt;br /&gt;
{{#ev:youtube|nkv28QWKdKE}}&lt;br /&gt;
[[Category:Books]]&lt;br /&gt;
{{DEFAULTSORT:Foundation Stone of Nordic Larp, The}}&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=The_Book_of_Just_a_Little_Lovin%27_(2013_Denmark_Run)&amp;diff=6645</id>
		<title>The Book of Just a Little Lovin&#039; (2013 Denmark Run)</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=The_Book_of_Just_a_Little_Lovin%27_(2013_Denmark_Run)&amp;diff=6645"/>
		<updated>2025-11-01T21:05:40Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: Text replacement - &amp;quot;//nordiclarp.org/wiki/&amp;quot; to &amp;quot;//www.nordiclarp.org/wiki/&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox book&lt;br /&gt;
|pages=100&lt;br /&gt;
|published=2013 ([[Rollespilsakademiet]])|image=JaLL_2013_-_The_Book_-_Front_page.jpg|isbn=978-87-92507-17-4|author={{Unbulleted list|[[Claus Raasted]]|[[Casper Gronemann]]|[[Søren Lyng Ebbehøj]]}}|country=Denmark}}&lt;br /&gt;
&#039;&#039;&#039;The Book of Just a Little Lovin&#039; (2013 Denmark Run)&#039;&#039;&#039; &#039;&#039;- Documenting a larp project about desire, friendship and fear of deaths&#039;&#039;, published in 2013 through [[Rollespilsakademiet]], edited by [[Claus Raasted]] and [[Casper Gronemann]] with [[Søren Lyng Ebbehøj]] as assisting editor.&lt;br /&gt;
&lt;br /&gt;
It consists of articles and photos by the participants and organizers of the Danish production of the larp [[Just a Little Lovin&#039;]] that was run in July 2013.&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
{{quote|text=The best game design ever made for a larp.}}&lt;br /&gt;
{{quote|text=Hotly debated in the Swedish press.}}&lt;br /&gt;
{{quote|text=Mindblowing}}&lt;br /&gt;
{{quote|text=These are some of the things that have been said about Hanne Grasmo and Tor Kjetil Edland’s larp Just a Little Lovin’ from 2011. It has been run three times now, and in three different countries. Something like this deserves solid documentation, and while there were articles and pictures and talks about JaLL, there was no single collection of thoughts in one easily-accessible volume.}}&lt;br /&gt;
&lt;br /&gt;
From the foreword.&lt;br /&gt;
&lt;br /&gt;
==Distribution==&lt;br /&gt;
The book is available for purchase through [[Rollespilsakademiet]] with an e-mail to [mailto:info@rollespilsakademiet.dk?Subject=Purchase%20of%20JALL-book info@rollespilsakademiet.dk] or free online as a PDF.&lt;br /&gt;
&lt;br /&gt;
==Downloads==&lt;br /&gt;
&lt;br /&gt;
*[https://www.nordiclarp.org/wiki/File:The_book_of_jall.pdf The Book of Just a Little Lovin&#039; (2013 Denmark run)] (PDF)&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
{{gallery&lt;br /&gt;
| File:JaLL 2013 - The Book - Start text.jpg&lt;br /&gt;
 | alt1=A page from the Just a Little Lovin 2013 book.&lt;br /&gt;
 | JaLL 2013 - Thank You&lt;br /&gt;
| File:JaLL 2013 - The Player Text.jpg&lt;br /&gt;
 | alt2=A page from the Just a Little Lovin 2013 book.&lt;br /&gt;
 | Player text&lt;br /&gt;
| File:JaLL 2013 - The Book - Image.jpg&lt;br /&gt;
 | alt3=A page from the Just a Little Lovin 2013 book.&lt;br /&gt;
 | Chapter 4 - Final Words&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==External links==&lt;br /&gt;
&lt;br /&gt;
*[http://just-a-little-lovin.blogspot.com/ Official larp website for Just a Little Lovin&#039;]&lt;br /&gt;
&lt;br /&gt;
[[Category:Books]]&lt;br /&gt;
[[Category:2013 books]]&lt;br /&gt;
{{DEFAULTSORT:Book of Just a Little Lovin&#039; (2013 Denmark Run)}}&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Anatomy_of_Larp_Thoughts:_a_breathing_corpus&amp;diff=6644</id>
		<title>Anatomy of Larp Thoughts: a breathing corpus</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Anatomy_of_Larp_Thoughts:_a_breathing_corpus&amp;diff=6644"/>
		<updated>2025-11-01T21:05:40Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: Text replacement - &amp;quot;//nordiclarp.org/wiki/&amp;quot; to &amp;quot;//www.nordiclarp.org/wiki/&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox book|name=Anatomy of Larp Thoughts: a breathing&lt;br /&gt;
corpus|image=[[File:KP25 Cover Anatomy of Larp Thoughts.jpg|thumb|Cover design for the Knutepunkt 2025 Journal by Yanina Zaichanka &amp;amp; Kirsten van Werven.]]|published=2025 (Knutepunkt 2025)|pages=496|country=Norway}}&#039;&#039;&#039;Anatomy of Larp Thoughts: a breathing corpus&#039;&#039;&#039; is the journal of Knutepunkt 2025. It is available in three versions: preordered handed out at KP (ISBN 978-82-692633-2-9), free pdf (ISBN 978-82-692633-4-3) and is planned to be set up as Print-on-Demand (ISBN 978-82-692633-3-6) after KP. Two physical copies are available in the public library system of every Knutepunkt host-country. &lt;br /&gt;
&lt;br /&gt;
==Contributors==&lt;br /&gt;
&#039;&#039;&#039;Coordinator&#039;&#039;&#039;: [[Nadja Lipsyc]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Graphics team:&#039;&#039;&#039; Coordinator: [[Anne Serup Grove]]. Illustrations: [[Yanina Zaichanka]] &amp;amp; [[Kirsten van Werven]]. Layout, diagrams &amp;amp; graphic concepts: [[Anne Serup Grove]], [[Maren Wolf]], [[Cosmo Esposito]]. Print research &amp;amp; coordination: [[Anne Serup Grove]], [[Marijke Van Hauwaert]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Editors:&#039;&#039;&#039; [[Simon Brind]], [[Nadja Lipsyc]], [[Jukka Särkijärvi]], [[Martine Svanevik]] - [[Alana Bennett]], [[Elin Dalstål]], [[Mátyás Hartyándi]], [[Marijke Van Hauwaert]], [[Carolin Heinrich]], [[Kaisa Kangas]], [[Jonaya Kemper]], [[Sergio Losilla]], [[Markus Montola]], [[Ylva Otting]], [[Rasmus Lyngkjær]], [[Juhana Pettersson]], [[Jaakko Rinne]], [[Siri Sandquist]], [[Anne Serup Grove]], [[Melissa Song Loong]], [[Evan Torner]]. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Reviewers:&#039;&#039;&#039; [[Simon Brind]], [[Adrian Hon]], [[Nadja Lipsyc]], [[Martine Svanevik]] - [[Anne van Barlingen]], [[Gijs van Bilsen]], [[Áron Birtalan]], [[Elin Dalstål]], [[Hazel Anneke Dixon]], [[Laura op de Beke]], [[Kyria Van Gasse]], [[Alessandro Giovannucci]], [[Leandro Godoy]], [[Hanne Grasmo]], [[Lyssa Greywood]], [[Ryan Hart]], [[Mátyás Hartyándi]], [[Marijke Van Hauwaert]], [[Kjell Hedgard Hugaas]], [[Mo Holkar]], [[Frederikke S. B. Høyer]], [[Kaisa Kangas]], [[Jonaya Kemper]], [[Mia Kyhn]], [[Ian Knope]], [[Rasmus Lyngkjær]], [[Søren Lyng Ebbehøj]], [[James Lórien MacDonald|Jamie MacDonald]], [[Markus Montola]], [[Nina Mutik]], [[Vili Von Nissinen]], [[Mirka Oinonen]], [[Kerstin Örtberg]], [[Josephine Rydberg]], [[Anne Serup Grove]], [[Melissa Song Loong]], [[David Thorhauge]], [[Evan Torner]], [[Jessica Townshend]], [[Katrine Wind]], [[Maren Wolf]], [[Laura Wood]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Proofreaders:&#039;&#039;&#039; [[Lyssa Greywood]], [[Carolin Heinrich]], [[Jorg Rødsjø]], [[David Thorhauge]] - [[Karijn van der Heij]], [[Mo Holkar]], [[Adrian Hon]], [[Cosmo Esposito]], [[Mia Kyhn]], [[Marlies Kok]], [[Evan Torner]], [[Emma Voutilainen]], [[Malk Williams]]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Discord Wizard:&#039;&#039;&#039; [[Star Hope Percival]] &lt;br /&gt;
&lt;br /&gt;
==Contents==&lt;br /&gt;
&lt;br /&gt;
*Dedication by [[Maria Pettersson]]&lt;br /&gt;
*Foreword by [[Nadja Lipsyc]], [[Anne Serup Grove]], [[Katrin Førde]] &amp;amp; [[Thomas Frederick Hozman Tollefsen]]&lt;br /&gt;
*Chapter descriptions&lt;br /&gt;
&lt;br /&gt;
===Hands===&lt;br /&gt;
&lt;br /&gt;
*River Rafting Design by [[Katrine Wind]]&lt;br /&gt;
*The Costume Guide - Some tools, a paradox and an accidental manifesto by [[Anne Serup Grove]] &amp;amp; [[Kerstin Örtberg]]&lt;br /&gt;
*Emotionally pacing for larps - How to get the best rollercoaster ride by [[Elin Dalstål]]&lt;br /&gt;
*Design for young adult players - The relevance of designing for hope, agency and inclusion by [[Frederikke S. B. Høyer]]&lt;br /&gt;
*How to Start a Larp School by [[Marijke Van Hauwaert]]&lt;br /&gt;
&lt;br /&gt;
===Forehead===&lt;br /&gt;
&lt;br /&gt;
*Performance and Audience in Larp by [[Laura Wood]] &amp;amp; [[Mo Holkar]]&lt;br /&gt;
*Making History: Use of history in a larp context as a mirror of our own society by [[Siri Sandquist]]&lt;br /&gt;
*The Prosocial Act of Larp Crime, and Some Thoughts on Odysseus by [[Evan Torner]]&lt;br /&gt;
*What Do Adult Participants Get Out of Larp? A qualitative survey based on SWORDCRAFT Australia by [[Sam Barta]]&lt;br /&gt;
*Production Models of Nordic Larp by [[Juhana Pettersson]]&lt;br /&gt;
&lt;br /&gt;
===Eyes===&lt;br /&gt;
&lt;br /&gt;
*Bleed Before it was Cool - Early descriptions of dissimulative pretense, their unintended effects, and their impact on the evolution of roleplaying by [[Mátyás Hartyándi]]&lt;br /&gt;
*Larp As Embodied Art by [[Nina Mutik]] &amp;amp; [[Vili Myrsky Nissinen]]&lt;br /&gt;
*Star Wars: Galactic Starcruiser – The Blockbuster to End All Blockbusters by [[Adrian Hon]]&lt;br /&gt;
*Experiencing Art From Within by [[Kaisa Kangas]]&lt;br /&gt;
*The Art-Larp Paradox by [[Alex Brown]]&lt;br /&gt;
&lt;br /&gt;
===Thorax===&lt;br /&gt;
&lt;br /&gt;
*Grief in Larp: Bleeding Through Two Lives by [[Lyssa Greywood]]&lt;br /&gt;
*The Party Never Ends by [[Juhana Pettersson]]&lt;br /&gt;
*Christianity is an immersion closet by [[Julia Greip]]&lt;br /&gt;
*Chronicle: “Daddy, tell me a story?” by [[Leandro Godoy]]&lt;br /&gt;
*Learning from Bleed by [[Gijs van Bilsen]] &amp;amp; [[Anne van Barlingen]]&lt;br /&gt;
&lt;br /&gt;
===Nerves===&lt;br /&gt;
&lt;br /&gt;
*Larp Critique: Why We Need It and How To Write One by [[Alessandro Giovannucci]]&lt;br /&gt;
*Designing Greener Larps 101 by [[Søren Lyng Ebbehø]]&amp;lt;nowiki/&amp;gt;j &amp;amp; [[Troels Barkholt-Spangsbo]]&lt;br /&gt;
*Gender Matters: Thoughts about Accessibility, Inclusivity, and Gender-based Policing by [[Mirka Oinonen]]&lt;br /&gt;
&lt;br /&gt;
===Skin===&lt;br /&gt;
&lt;br /&gt;
*Quit the Mother Teresa Syndrome and the Praise-addiction, and love your work on its own terms by [[Astrid Cecilie Budolfsen]]&lt;br /&gt;
*‘I want to hold you close’: An auto-ethnographical discussion of sexual harassment in and around larp in Flanders by [[Kyria Van Gasse]]&lt;br /&gt;
*Why I hate post-larp compliment threads by [[Julia Greip]]&lt;br /&gt;
*Administrative and practical superheroes - And how your organization can better support their work by [[Rasmus Lyngkjær]]&lt;br /&gt;
&lt;br /&gt;
===Otherbody===&lt;br /&gt;
&lt;br /&gt;
*You Ate Us; We Thought We Ate You - when playing plays us, and the pleasures of being caused by [[Áron Birtalan]]&lt;br /&gt;
*Reading Larps: The Larp Experience Through Larp Scripts by [[Hanne Grasmo]]&lt;br /&gt;
*Games Never Played: or Composting ‘The Antarcticans’ by [[Laura op de Beke]]&lt;br /&gt;
*Mud in the Machine - On Embodiment for Virtual Players by [[Josephine Rydberg]]&lt;br /&gt;
&lt;br /&gt;
===Marrow===&lt;br /&gt;
&lt;br /&gt;
*Neurospicy Larpers - Role-play as a Method for Working with Neurodivergent Youth with Challenging Behavior Regarding Sexuality by [[Hanne Grasmo]]&lt;br /&gt;
*Failure Modes in Character Writing by [[Simon Brind]]&lt;br /&gt;
&lt;br /&gt;
===Immortalised by [[Kai Simon Fredriksen]]===&lt;br /&gt;
&lt;br /&gt;
==Downloads==&lt;br /&gt;
&lt;br /&gt;
*[https://www.nordiclarp.org/wiki/File:KP25_PDF_-_small_single_pages.pdf PDF publication, single page: Anatomy of Larp Thoughts: A breathing corpus]&lt;br /&gt;
*[https://www.nordiclarp.org/wiki/File:KP25_PDF_-_small.pdf PDF publication, spread view: Anatomy of Larp Thoughts: A breathing corpus]&lt;br /&gt;
&lt;br /&gt;
[[Category:Knutepunkt-books]]&lt;br /&gt;
[[Category:Books]]&lt;br /&gt;
[[Category:Knutepunkt]]&lt;br /&gt;
[[Category:Documentation]]&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=The_Knudepunkt_2015_Companion_Book&amp;diff=6642</id>
		<title>The Knudepunkt 2015 Companion Book</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=The_Knudepunkt_2015_Companion_Book&amp;diff=6642"/>
		<updated>2025-11-01T21:05:21Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: Text replacement - &amp;quot;//nordiclarp.org/w/&amp;quot; to &amp;quot;//www.nordiclarp.org/wiki/&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox book|pages=81|isbn=978-87-92507-24-2|published=2015 ([[Rollespilsakademiet]])|image=Kp2015companionbook.jpg|name=The Knudepunkt 2015 Companion Book|author={{Unbulleted list|[[Charles Bo Nielsen]]|[[Claus Raasted]]}}|country=Denmark}}&lt;br /&gt;
&#039;&#039;&#039;The Knudepunkt 2015 Companion Book&#039;&#039;&#039; is a collection of articles about larps which was released as part of documentation for the [[Knudepunkt 2015]] conference.&lt;br /&gt;
&lt;br /&gt;
==Articles==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;Foreword&#039;&#039; by [[Claus Raasted]]&lt;br /&gt;
*[http://nordiclarp.org/2015/01/28/six-levels-of-substitution/| 6 Levels of Substitution: The Behaviour Substitution Model] by [[Lauri Lukka]]&lt;br /&gt;
*[http://nordiclarp.org/2015/02/04/behind-the-larp-census/| Behind the Larp Census: 29.751 Larpers Can’t (All) Be Wrong] by [[Aaron Vanek]]&lt;br /&gt;
*[http://nordiclarp.org/2015/02/11/four-backstory-building-games-you-can-play-anywhere/| Four Backstory Building Games You Can Play Anywhere!: Simple and Effective] by [[Peter Woodworth]]&lt;br /&gt;
*[http://nordiclarp.org/2015/02/18/infinite-firing-squads-the-evolution-of-the-tribunal/| Infinite Firing Squads: The Evolution of The Tribunal] by [[J.Tuomas Harviainen]]&lt;br /&gt;
*[http://nordiclarp.org/2015/02/25/ingame-or-offgame-towards-a-typology-of-frame-switching-between-in-character-and-out-of-character/| Ingame or Offgame?: Towards a Typology of Frame Switching Between In-character and Out-of-character] by [[Olga Vorobyeva]]&lt;br /&gt;
*[http://nordiclarp.org/2015/03/04/learning-by-playing-larp-as-a-teaching-method/| Learning by Playing: Larp As a Teaching Method] by [[Myriel Balzer]] &amp;amp; [[Julia Kurz]]&lt;br /&gt;
*[http://nordiclarp.org/2015/03/11/looking-at-you-larp-documentation-and-being-watched/ Looking at You: Larp, Documentation and Being Watched] by [[Juhana Pettersson]]&lt;br /&gt;
*[http://nordiclarp.org/2015/03/18/now-that-weve-walked-the-walk-some-new-additions-to-the-larp-vocabulary/ Now That We’ve Walked The Walk…: Some new additions to the larp vocabulary] by [[Bjørn Flindt Temte]]&lt;br /&gt;
*[http://nordiclarp.org/2015/03/25/on-publicity-and-privacy-or-how-do-you-do-your-documentation/ On Publicity and Privacy: Or “How Do You Do Your Documentation?”] by [[Jamie MacDonald]]&lt;br /&gt;
*[http://nordiclarp.org/2015/04/01/painting-larp-using-art-terms-for-clarity/ Painting larp: Using art terms for clarity] by [[Jacob Nielsen]]&lt;br /&gt;
*[http://nordiclarp.org/2015/04/08/processing-political-larps-framing-larp-experiences-with-strong-agendas/ Processing Political Larps: Framing Larp Experiences with Strong Agendas] by [[Kaisa Kangas]]&lt;br /&gt;
*[http://nordiclarp.org/2015/04/15/safe-words-and-how-to-use-them/ Safe Words: And How to Use Them] by [[Nathan Hook]]&lt;br /&gt;
*[http://nordiclarp.org/2015/04/22/steering-for-immersion-in-five-nordic-larps-a-new-understanding-of-elaytyminen/ Steering For Immersion in Five Nordic Larps: A New Understanding of Eläytyminen] by [[Mike Pohjola]]&lt;br /&gt;
*[http://nordiclarp.org/2015/04/29/the-art-of-steering-bringing-the-player-and-the-character-back-together/ The Art of Steering: Bringing the Player and the Character Back Together] by [[Markus Montola]], [[Jaakko Stenros]] &amp;amp; [[Eleanor Saitta]]&lt;br /&gt;
*[http://nordiclarp.org/2015/05/06/the-blockbuster-formula-brute-force-design-in-the-monitor-celestra-and-college-of-wizardry/ The Blockbuster Formula: Brute Force Design in The Monitor Celestra and College of Wizardry] by [[Eirik Fatland]] &amp;amp; [[Markus Montola]]&lt;br /&gt;
*[https://nordiclarp.org/2015/05/13/the-d-m-creative-agenda-model-an-axis-instead-of-a-pyramid/ The D-M creative agenda model: An axis instead of a pyramid] by [[Nathan Hook]]&lt;br /&gt;
*[https://nordiclarp.org/2015/05/20/the-golden-cobra-challenge-amateur-friendly-pervasive-freeform-design/ The Golden Cobra Challenge: Amateur-Friendly Pervasive Freeform Design] by [[Evan Torner]], [[Whitney Beltrán|Whitney “Strix” Beltrán]], [[Emily Care Boss]] &amp;amp; [[Jason Morningstar]]&lt;br /&gt;
*[http://admin-tablet.hm.com/se/forever-summer?deviceStay=true There is no Nordic larp: And yet we all know what it means] by [[Stefan Deutsch]]&lt;br /&gt;
*[https://nordiclarp.org/2016/04/20/workshop-practice-practice-functional-workshop-structure-method/ Workshop practice: A functional workshop structure method] by [[Mo Holkar]]&lt;br /&gt;
*&#039;&#039;Ending: The Larper’s Burden&#039;&#039; by [[Claus Raasted]]&lt;br /&gt;
&lt;br /&gt;
==Downloads==&lt;br /&gt;
&lt;br /&gt;
*[//www.nordiclarp.org/wiki/images/2/27/Kp2015companionbook.pdf The Knudepunkt 2015 Companion Book] (PDF)&lt;br /&gt;
&lt;br /&gt;
[[Category:Books]]&lt;br /&gt;
{{DEFAULTSORT:Knudepunkt 2015 Companion Book, The}}&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=The_Book&amp;diff=6641</id>
		<title>The Book</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=The_Book&amp;diff=6641"/>
		<updated>2025-11-01T21:05:21Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: Text replacement - &amp;quot;//nordiclarp.org/w/&amp;quot; to &amp;quot;//www.nordiclarp.org/wiki/&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox book|name=The Book|published=2001|author={{Unbulleted list|[[Anette Alfsvåg]]|[[Ingrid Storrø]]|[[Erlend Eidsem Hansen]]}}|country=Norway}}&lt;br /&gt;
&#039;&#039;&#039;The Book&#039;&#039;&#039; was published in conjunction with the [[Knutepunkt 2001]] conference.&lt;br /&gt;
&lt;br /&gt;
==Content==&lt;br /&gt;
===The Book - Knutepunkt 2001===&lt;br /&gt;
====&#039;Editorial====&lt;br /&gt;
By Anethe Alfsvåg, [[Erlend Eidsem Hansen]], Ingrid Storrø, Tommy Finsen, Bjørn Rugstad and Helge H. Jensen.&lt;br /&gt;
&lt;br /&gt;
====Welcome====&lt;br /&gt;
By Benedikte&lt;br /&gt;
&lt;br /&gt;
====KP Online====&lt;br /&gt;
By Tommy Finsen&lt;br /&gt;
&lt;br /&gt;
====GiHa-DraMaK 07====&lt;br /&gt;
By [[Erlend Eidsem Hansen]]&lt;br /&gt;
&lt;br /&gt;
===The Articles===&lt;br /&gt;
====Knutepunkt; A retrospective vizualisation====&lt;br /&gt;
By Lars Munck&lt;br /&gt;
&lt;br /&gt;
A series of humorous drawings.&lt;br /&gt;
&lt;br /&gt;
====Developing a Character====&lt;br /&gt;
By Holger Jacobsson&lt;br /&gt;
&lt;br /&gt;
A suggestion to drop writing long background stories and descriptions for roleplaying characters and focus on the personal qualities and experiences that the players would want to explore.&lt;br /&gt;
&lt;br /&gt;
====Pre-LARP Communication====&lt;br /&gt;
By Cathrine Movold&lt;br /&gt;
&lt;br /&gt;
A short primer on the principles of communicating information to the players before a game and the exciting new opportunities of digital media.&lt;br /&gt;
&lt;br /&gt;
====Cultural Studies and Role-Playing====&lt;br /&gt;
By Frans Mäyrä&lt;br /&gt;
&lt;br /&gt;
The lack of and trouble of doing academic studies of roleplaying, due to its manifold character and grassroots nature.&lt;br /&gt;
&lt;br /&gt;
====The LRP-phenomenon====&lt;br /&gt;
By Lars Ivar and Owesen Lein-Borge&lt;br /&gt;
&lt;br /&gt;
Summary of an article. Ritual theory as applied to larp. The unique conditions of audience-less performance and the liminal spaces that allow for behavious unaccepted in normal life. The duality of actual experiences in a fictional setting.&lt;br /&gt;
&lt;br /&gt;
====Norwegian Vampire LARP====&lt;br /&gt;
By Torgrim Husvik&lt;br /&gt;
&lt;br /&gt;
An example of a vampire larp campaign in Norway and how it differs from the original Mind&#039;s Eye Theatre system from the US, illustrating some particularities of Norwegian larp.&lt;br /&gt;
&lt;br /&gt;
====Factors of LARP====&lt;br /&gt;
By Morten Gade&lt;br /&gt;
&lt;br /&gt;
Seven factors that players would want out of larp: Adrenaline, fun, intrigues, personality, education, media, art.&lt;br /&gt;
&lt;br /&gt;
====Historical Worlds====&lt;br /&gt;
by Henrik Summanen&lt;br /&gt;
&lt;br /&gt;
Ideas and examples of possible cooperation between museums and larpers, the kinds of thing each can gain from the other.&lt;br /&gt;
&lt;br /&gt;
====Before Full Time====&lt;br /&gt;
By Ingrid Fahlgren&lt;br /&gt;
&lt;br /&gt;
Two examples of larps that had to be stopped before time, due to developments that hurt the play of a large part of the participants.&lt;br /&gt;
&lt;br /&gt;
====LARP on the Net====&lt;br /&gt;
By Bo Kjellson&lt;br /&gt;
&lt;br /&gt;
How larpers are using chatrooms to continue the life of their characters between play.&lt;br /&gt;
&lt;br /&gt;
====Experience History====&lt;br /&gt;
By Hilde Bryhn, Cathrine Movold and Margrete Raaum&lt;br /&gt;
&lt;br /&gt;
Example of and advice for using a larp to teach history to primary school students.&lt;br /&gt;
&lt;br /&gt;
====Politically Consciousness-Expanding Roleplaying====&lt;br /&gt;
By Helge Hiram&lt;br /&gt;
&lt;br /&gt;
Philosophical perspectives on larp as a post-modern media and it&#039;s ability to change political viewpoints.&lt;br /&gt;
&lt;br /&gt;
====Why LARP Changed the Society Before 2010====&lt;br /&gt;
By Morten Gunnerud&lt;br /&gt;
&lt;br /&gt;
A scifi-style look at how larp was supposed to save the world in just ten years.&lt;br /&gt;
&lt;br /&gt;
====Emotions and Authority====&lt;br /&gt;
By Ragnhild Hutchison&lt;br /&gt;
&lt;br /&gt;
How a higher degree of women in the Oslo larp scene has brought emotional depth and a focus on relationship play into the hobby. As well as giving opportunities for women to take on roles of authority and the problems faced due to gendered socialization.&lt;br /&gt;
&lt;br /&gt;
====LARP = Sex?====&lt;br /&gt;
By [[Erlend Eidsem Hansen]]&lt;br /&gt;
&lt;br /&gt;
A  look at how larp is like sex in many ways, ex. the use of body language and the intensity between two people.&lt;br /&gt;
&lt;br /&gt;
====Hidden Plays in Public Places====&lt;br /&gt;
By Jonas Nelson&lt;br /&gt;
&lt;br /&gt;
A thorough dissection of the dangers and moral implications of pervasive larping, using numerous examples.&lt;br /&gt;
&lt;br /&gt;
====Building Dramatics====&lt;br /&gt;
By [[Susanne Gräslund]]&lt;br /&gt;
&lt;br /&gt;
A text on creating better dramatic structures for games, focusing on the individual player perspective. Goes through three-level models of design, dramatic webs, fateplay and assorted narrative techniques.&lt;br /&gt;
&lt;br /&gt;
====Two-Faced Dogme - Auteur Truth====&lt;br /&gt;
By [[Johanna Koljonen]]&lt;br /&gt;
&lt;br /&gt;
A comparison of the state of larp with contemporary media, specifically film and larp theory with political thinkers, to examine theorists who do not connect with reality of larp.&lt;br /&gt;
&lt;br /&gt;
====About the Feminist Movement====&lt;br /&gt;
By Staffan Ericsson&lt;br /&gt;
&lt;br /&gt;
An ironic counter statement.&lt;br /&gt;
&lt;br /&gt;
====Warning - Selfdestruction has Started====&lt;br /&gt;
By Thomas Davidsson&lt;br /&gt;
&lt;br /&gt;
A warning that if we keep suppressing the dissenting voices, larp itself will die.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===The Manifests===&lt;br /&gt;
A series of statements on how larp ought to be and how to go about making it so.&lt;br /&gt;
&lt;br /&gt;
====Introduction====&lt;br /&gt;
&lt;br /&gt;
====Rules of the Post Bjorneborgian School====&lt;br /&gt;
By [[J. Tuomas Harviainen]] and Lihaa Kuvitelmille&lt;br /&gt;
&lt;br /&gt;
====[[The Manifest Sunday]]====&lt;br /&gt;
By [[Emil Boss]], [[Martin Brodén]], [[Gabriel Widing]], and [[Tobias Wrigstad]]&lt;br /&gt;
&lt;br /&gt;
====Brosme 9,9 kg====&lt;br /&gt;
By Egil Moe&lt;br /&gt;
&lt;br /&gt;
====Dogma ‘99====&lt;br /&gt;
(By a host of larp designers)&lt;br /&gt;
&lt;br /&gt;
===The Countries===&lt;br /&gt;
A look at the state of larp in various countries.&lt;br /&gt;
&lt;br /&gt;
====Larping in Sweden====&lt;br /&gt;
By [[Anna Westerling]]&lt;br /&gt;
&lt;br /&gt;
====Larping in Denmark====&lt;br /&gt;
By Mikkel Sander&lt;br /&gt;
&lt;br /&gt;
====Rovantemi====&lt;br /&gt;
By Matti Nuorto&lt;br /&gt;
&lt;br /&gt;
====Larping in Norway====&lt;br /&gt;
Ed. Ingrid Storrø&lt;br /&gt;
&lt;br /&gt;
====In the Nordic Castle of Murmansk====&lt;br /&gt;
By [[Hanne Grasmo]]&lt;br /&gt;
&lt;br /&gt;
====Larps and Stripes====&lt;br /&gt;
By [[Mike Pohjola]]&lt;br /&gt;
===The Regulations===&lt;br /&gt;
===The People===&lt;br /&gt;
==Downloads==&lt;br /&gt;
&lt;br /&gt;
*[//www.nordiclarp.org/wiki/images/1/1f/Kp2001book.pdf The Book] (PDF)&lt;br /&gt;
&lt;br /&gt;
[[Category:Books|Book, The]]&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=The_Nordic_Larp_Yearbook_2014&amp;diff=6640</id>
		<title>The Nordic Larp Yearbook 2014</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=The_Nordic_Larp_Yearbook_2014&amp;diff=6640"/>
		<updated>2025-11-01T21:05:20Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: Text replacement - &amp;quot;//nordiclarp.org/w/&amp;quot; to &amp;quot;//www.nordiclarp.org/wiki/&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox book|pages=155|isbn=978-87-92507-23-5|published=2015 ([[Rollespilsakademiet]])|image=Nordiclarpyearbook2014.jpg|name=The Nordic Larp Yearbook 2014|author={{Unbulleted list|[[Charles Bo Nielsen]]|[[Claus Raasted]]}}|country=Denmark}}&lt;br /&gt;
&#039;&#039;&#039;The Nordic Larp Yearbook 2014&#039;&#039;&#039; is a collection of articles about larps run during 2014 which was released as part of documentation for the [[Knudepunkt 2015]] conference.&lt;br /&gt;
==Articles==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;Foreword&#039;&#039; by [[Claus Raasted]]&lt;br /&gt;
*[http://nordiclarp.org/2015/01/16/baltic-warriors-helsinki/ Baltic Warriors: Helsinki - Saving the Environment with Zombies] by [[Juhana Pettersson]]&lt;br /&gt;
*[http://nordiclarp.org/2015/01/23/brudpris/ Brudpris - Honor. Love. Patriarchy] by [[Anna-Karin Linder Krauklis]] &amp;amp; [[Carolina Dahlberg]]&lt;br /&gt;
*[http://nordiclarp.org/2015/01/30/%ef%bf%bccollege-of-wizardry/ College of Wizardry - The First Larp to Go Truly Viral] by [[Claus Raasted]]&lt;br /&gt;
*[http://nordiclarp.org/2015/02/06/de-la-bete-an-expensive-beast/ De la Bête - An Expensive Beast] by [[David František Wagner]]&lt;br /&gt;
*[http://nordiclarp.org/2015/02/13/exit-3-the-bunker-claustro-drama/ Exit 3: The Bunker - Claustro-drama] by [[Karijn van der Heij]]&lt;br /&gt;
*[http://nordiclarp.org/2015/02/20/koikoi-drums-rituals-inaction/ KoiKoi - Drums! Rituals! Inaction!] by [[Eirik Fatland]] &amp;amp; [[Tor Kjetil Edland]]&lt;br /&gt;
*[http://nordiclarp.org/2015/02/27/last-will-make-us-your-slaves-but-feed-us/ Last Will - Make Us Your Slaves, but Feed Us] by [[Annica Strand]], [[Frida Gamero]], and [[Sofia Stenler]]&lt;br /&gt;
*[http://nordiclarp.org/2015/03/06/livsgald-fantasy-with-gender-elements/ Livsgäld - Fantasy with Gender Elements] by [[Simon Svensson]]&lt;br /&gt;
*[http://nordiclarp.org/2015/03/13/mare-incognitum-trapped-in-the-ice/ Mare Incognitum - Trapped in the ice] by [[Olle Nyman]] &amp;amp; [[Sebastian Utbult]]&lt;br /&gt;
*[http://nordiclarp.org/2015/03/20/moon-a-firefly-larp-not-exactly-about-firefly/ Moon - A Firefly Larp Not Exactly About Firefly] by [[Jindřich Mašek &amp;amp; Martin Buchtík]]&lt;br /&gt;
*[http://nordiclarp.org/2015/03/27/morgenrode-a-game-at-the-dawning-of-the-age-of-aquarius/ Morgenrøde - A Game at the Dawning of the Age of Aquarius] by [[Anders Ebbehøj]], [[Jonas Trier-Knudsen]], [[Klaus Meier]]&lt;br /&gt;
*[http://nordiclarp.org/2015/04/03/nemefrego-2014-old-school-fantasy-with-new-ideas/ Nemefrego 2014 – Old School Fantasy with New Ideas] by [[Morten K Tellefsen]] &amp;amp; [[Frederikke B Høyer]]&lt;br /&gt;
*[http://nordiclarp.org/2015/04/17/%ef%bf%bcpan-horror-therapy-a-potent-cocktail/ Pan - Horror &amp;amp; Therapy: A Potent Cocktail] by [[Nathan Hook]]&lt;br /&gt;
*[http://nordiclarp.org/2015/04/24/saint-summer-a-60s-tale-of-music-and-hope/ Saint Summer - A 60’s Tale of Music and Hope] by [[Olga Shovman]] &amp;amp; [[Mark Shovman]]&lt;br /&gt;
*[http://nordiclarp.org/2015/05/01/salon-moravia-cabaret-for-women-only/ Salon Moravia - Cabaret for Women Only] by [[Radim Bondy]]&lt;br /&gt;
*[http://nordiclarp.org/2015/05/08/skoro-rassvet-vodka-tears-and-dostoyevsky/ Skoro Rassvet - Vodka, Tears and Dostoyevsky] by [[Tomáš Hampejs]]&lt;br /&gt;
*&#039;&#039;Ticket to Atlantis -Fear, Love, Death, Life...&#039;&#039; by [[Nadezhda Vechorek]] &amp;amp; [[Vasily Zakharov]]&lt;br /&gt;
*&#039;&#039;Tonnin Stiflat: Season One - To booze or not to booze...&#039;&#039; by [[Simo Järvelä]] &amp;amp; [[Niina Niskanen]]&lt;br /&gt;
&lt;br /&gt;
==Downloads==&lt;br /&gt;
&lt;br /&gt;
*[//www.nordiclarp.org/wiki/images/6/6d/Nordiclarpyearbook2014.pdf The Nordic Larp Yearbook 2014] (PDF)&lt;br /&gt;
&lt;br /&gt;
[[Category:Books|Nordic Larp Yearbook 2014]]&lt;br /&gt;
[[Category:2015 books|Nordic Larp Yearbook 2014]]&lt;br /&gt;
{{DEFAULTSORT:Nordic Larp Yearbook 2014, The}}&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=States_of_Play:_Nordic_Larp_Around_the_World&amp;diff=6639</id>
		<title>States of Play: Nordic Larp Around the World</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=States_of_Play:_Nordic_Larp_Around_the_World&amp;diff=6639"/>
		<updated>2025-11-01T21:05:18Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: Text replacement - &amp;quot;//nordiclarp.org/w/&amp;quot; to &amp;quot;//www.nordiclarp.org/wiki/&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox book|name=States of Play: Nordic Larp Around the World|image=States_of_play_solmukohta2012.jpg|published=2012 (Pohjoismaisen roolipelaamisen seura)|isbn=978-952-67599-4-4|isbnd=978-952-67599-5-1|pages=200 + a DVD|author=[[Juhana Pettersson]]|country=Finland}}&lt;br /&gt;
&#039;&#039;&#039;States of Play: Nordic Larp Around the World&#039;&#039;&#039; published in 2012, edited by [[Juhana Pettersson]] is the [[Knutepunkt-books|Knutepunkt book]] of [[Solmukohta 2012]].&lt;br /&gt;
&lt;br /&gt;
==Articles==&lt;br /&gt;
&lt;br /&gt;
*High on Hell by [[Elin Nilsen]]&lt;br /&gt;
*Valve: the Grand Adventure by [[Antti Kanner]] &amp;amp; [[Katri Lassila]]&lt;br /&gt;
*The Joy of Kidnapping by [[Juhana Pettersson]]&lt;br /&gt;
*The Golden Rule of Larp by [[Simo Järvelä]]&lt;br /&gt;
*A Moment of Weakness by [[Yaraslau Kot]]&lt;br /&gt;
*Dublin2: the EU&#039;s Asylum Policy in Miniature by [[JP Kaljonen]] &amp;amp; [[Johanna Raekallio]]&lt;br /&gt;
*Weddings and Anti-Condom Activists by [[Trine Lise Lindahl]]&lt;br /&gt;
*Larp and Aesthetic Responsibility by [[Tova Gerge]]&lt;br /&gt;
*Folk Fantasy by [[Mike Pohjola]]&lt;br /&gt;
*Reliving Sarmatia by [[Michal Mochocki]]&lt;br /&gt;
*Valokaari by [[J. Tuomas Harviainen]]&lt;br /&gt;
*Kiirastuli OY by [[Vili Nissinen]]&lt;br /&gt;
*Playing “Thus Spoke Zarathustra” by [[Ari-Pekka Lappi]]&lt;br /&gt;
*The Labyrinth of Possibilities by [[Gabriel Widing]]&lt;br /&gt;
*We Created a Monster, Part I by [[Johanna MacDonald]]&lt;br /&gt;
*We Created a Monster, Part II by [[Aarni Korpela]]&lt;br /&gt;
*Songs and Larp by [[Alexey Fedoseev]] &amp;amp; [[Daria Kurguzova]]&lt;br /&gt;
*Pathos by [[Lorenzo Trenti]]&lt;br /&gt;
*Shadowrun by [[Thomas B.]]&lt;br /&gt;
*Give Me Your Hands, I Will Be Your Eyes by [[Aaron Vanek]]&lt;br /&gt;
*Mistakes I’ve Made by [[Claus Raasted]]&lt;br /&gt;
*The Rogue Wave by [[Andrea Castellani]]&lt;br /&gt;
*It&#039;s About Time by [[Eleanor Saitta]]&lt;br /&gt;
*Letting the Stories Go by [[Eliot Wieslander]]&lt;br /&gt;
*Tears and Defeat by [[Nathan Hook]]&lt;br /&gt;
*What is Good Playing? by [[Niina Niskanen]]&lt;br /&gt;
*The Evaluation of Elusiveness by [[Aleksandra Mochocka]]&lt;br /&gt;
*¡Lucha Libre! by [[Jenni Sahramaa]]&lt;br /&gt;
*Tahtotila by [[Suvi Korhonen]] &amp;amp; [[Tuukka Virtaperko]]&lt;br /&gt;
*Your Character is Not Your Own by [[Gustav Nilsson]]&lt;br /&gt;
*The Blessing of Lineage by [[Lauri Lukka]]&lt;br /&gt;
*Beyond the Game Master by [[Emily Care Boss]], [[Ivan Vaghi]] &amp;amp; [[Jason Morningstar]]&lt;br /&gt;
*We Hold These Rules to Be Self-Evident by [[Lizzie Stark]]&lt;br /&gt;
&lt;br /&gt;
==Downloads==&lt;br /&gt;
&lt;br /&gt;
*[//www.nordiclarp.org/wiki/images/a/a0/2012-States.of.play.pdf States of Play: Nordic Larp Around the World] (PDF)&lt;br /&gt;
&lt;br /&gt;
==Video presentation==&lt;br /&gt;
Presentation about the book by [[Juhana Pettersson]], recorded prior to the [[Nordic Larp Talks]] 2012.&lt;br /&gt;
{{#ev:youtube|TluzQBYCQSk}}&lt;br /&gt;
&lt;br /&gt;
==External links==&lt;br /&gt;
&lt;br /&gt;
*[http://www.nordicrpg.fi/julkaisut/states-of-play/ Offical website for States of Play: Nordic Larp Around the World]&lt;br /&gt;
&lt;br /&gt;
[[Category:Books]]&lt;br /&gt;
[[Category:2012 books]]&lt;br /&gt;
[[Category:Knutepunkt-books]]&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Role,_Play,_Art&amp;diff=6638</id>
		<title>Role, Play, Art</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Role,_Play,_Art&amp;diff=6638"/>
		<updated>2025-11-01T21:05:18Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: Text replacement - &amp;quot;//nordiclarp.org/w/&amp;quot; to &amp;quot;//www.nordiclarp.org/wiki/&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox book|name=Role, Play, Art|image=2006-Role.Play.Art.jpg|published=2006|author={{Unbulleted list|[[Thorbiörn Fritzon]]|[[Tobias Wrigstad]]}}|isbn=91-631-8853-8|country=Sweden}}&lt;br /&gt;
&#039;&#039;&#039;Role, Play, Art&#039;&#039;&#039; was published in conjunction with the [[Knutpunkt 2006]] conference.&lt;br /&gt;
==Contents==&lt;br /&gt;
&lt;br /&gt;
*A Short Comment On the Compatibility of Immersion and Narrativism, [[Martin Brodén]]&lt;br /&gt;
*Games and Creativity Learning, [[Thomas Duus Henriksen]]&lt;br /&gt;
*Interaction Codes—Understanding and Establishing Patterns in Player Improvisation, [[Eirik Fatland]]&lt;br /&gt;
*The Theatre Connection, Kristine Flood&lt;br /&gt;
*To Live Happily Ever After—Techniques for Ending a Larp, Ada Fredelius&lt;br /&gt;
*The Character, the Player and Their Shared Body, [[Tova Gerge]] &amp;amp; [[Gabriel Widing]]&lt;br /&gt;
*Testing Larp Theories and Methods–Results of Year Two, J. Tuomas Harviainen&lt;br /&gt;
*With Role-Playing in Mind—A Cognitive Account of Decoupled Reality, Identity and Experience, Andreas Lieberoth&lt;br /&gt;
*Prosopopeia—Playing on the Edge of Reality, [[Markus Montola]] &amp;amp; Staffan Jonsson&lt;br /&gt;
*The Art of Experience, [[Juhana Pettersson]]&lt;br /&gt;
*Persona, Ryan Rohde Hansen &amp;amp; Maya Krone&lt;br /&gt;
*Play is Political, Johan Söderberg&lt;br /&gt;
&lt;br /&gt;
==Downloads==&lt;br /&gt;
&lt;br /&gt;
*[//www.nordiclarp.org/wiki/images/7/74/2006-Role.Play.Art.pdf Role, Play, Art] (PDF)&lt;br /&gt;
&lt;br /&gt;
== External Links ==&lt;br /&gt;
&lt;br /&gt;
* http://jeepen.org/kpbook/&lt;br /&gt;
&lt;br /&gt;
[[Category:Books]]&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Do_Larp_-_Documentary_Writings_from_KP2011&amp;diff=6637</id>
		<title>Do Larp - Documentary Writings from KP2011</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Do_Larp_-_Documentary_Writings_from_KP2011&amp;diff=6637"/>
		<updated>2025-11-01T21:05:17Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: Text replacement - &amp;quot;//nordiclarp.org/w/&amp;quot; to &amp;quot;//www.nordiclarp.org/wiki/&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox book&lt;br /&gt;
| name = Do Larp - Documentary Writings from KP2011&lt;br /&gt;
| image = 2011-Do.larp.jpg&lt;br /&gt;
| author = {{Unbulleted list|[[Lars Andresen]]|[[Charles Bo Nielsen]]|[[Luisa Carbonelli]]|[[Jesper Heebøll-Christensen]]|[[Marie Oscilowski]]}}&lt;br /&gt;
| country = Denmark&lt;br /&gt;
| published = 2011 ([[Rollespilsakademiet]])&lt;br /&gt;
| isbn = 978-87-92507-06-8&lt;br /&gt;
}}&#039;&#039;&#039;Do Larp - Documentary Writings from KP2011&#039;&#039;&#039; was published in conjunction with the [[Knudepunkt 2011]] conference.&lt;br /&gt;
==Downloads==&lt;br /&gt;
&lt;br /&gt;
*[//www.nordiclarp.org/wiki/images/e/e4/2011-Do.larp.pdf Do Larp - Documentary Writings from KP2011] (PDF)&lt;br /&gt;
&lt;br /&gt;
[[category:Books]]&lt;br /&gt;
[[category:2011 books]]&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Beyond_Role_and_Play&amp;diff=6636</id>
		<title>Beyond Role and Play</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Beyond_Role_and_Play&amp;diff=6636"/>
		<updated>2025-11-01T21:05:16Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: Text replacement - &amp;quot;//nordiclarp.org/w/&amp;quot; to &amp;quot;//www.nordiclarp.org/wiki/&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox book&lt;br /&gt;
| name = Beyond Role and Play&lt;br /&gt;
| image = 2004-Beyond.Role.and.Play.jpg&lt;br /&gt;
| author = {{Unbulleted list|[[Markus Montola]]|[[Jaakko Stenros]]}}&lt;br /&gt;
| country = Finland&lt;br /&gt;
| published = 2004&lt;br /&gt;
| isbn = 952-91-6842-X&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Beyond Role and Play&#039;&#039;&#039; was published in conjunction with the [[Solmukohta 2004]] conference.&lt;br /&gt;
&lt;br /&gt;
==Contents==&lt;br /&gt;
&lt;br /&gt;
*Foreword by [[Frans Mäyrä]]&lt;br /&gt;
*Preface by [[Markus Montola]] &amp;amp; [[Jaakko Stenros]]&lt;br /&gt;
*In Search of the Self: A Survey of the First 25 Years of Anglo-American RolePlaying Game Theory by [[Paul Mason]]&lt;br /&gt;
*Play to Love: Reading Victor Turner&#039;s “Liminal to Liminoid, in Play, Flow,  and Ritual; An Essay in Comparative Symbology” by [[Martin Ericsson]]&lt;br /&gt;
&lt;br /&gt;
THEORY&lt;br /&gt;
&lt;br /&gt;
*Immersive Story:  A View of Role-Played Drama by [[John H. Kim]]&lt;br /&gt;
*A Semiotic View on Diegesis Construction by [[Mika Loponen]] &amp;amp; [[Markus Montola]]&lt;br /&gt;
*Tilting at Windmills: The Theatricality of Role-Playing Games by [[Edward Choy]]&lt;br /&gt;
*Role-Playing: A Narrative Experience and a Mindset by [[Satu Heliö]]&lt;br /&gt;
*Notes on Role-Playing Texts by [[Jaakko Stenros]]&lt;br /&gt;
*Autonomous Identities: Immersion as a Tool for Exploring, Empowering and Emancipating Identities by [[Mike Pohjola]]&lt;br /&gt;
*The Character Interpretation: The Process Before the Immersion and the Game by [[Ari-Pekka Lappi]]&lt;br /&gt;
*On the Transmutation of Educational Role-Play: A Critical Reframing to the Role-Play in Order to Meet the Educational Demands by [[Thomas Henriksen]]&lt;br /&gt;
*Deconstructing Larp Analysis or, “Let’s Recognize a Bias Where There Is One” by [[J. Tuomas Harviainen]]&lt;br /&gt;
&lt;br /&gt;
PRACTICE &lt;br /&gt;
&lt;br /&gt;
*Character Design Fundamentals for Role-Playing Games by [[Petri Lankoski]]&lt;br /&gt;
*Narrative Function: A Larpwright&#039;s Tool by [[Erling Rognli]]&lt;br /&gt;
*Chaotic Role-Playing: Applying the Chaos Model of Organisations for Role-Playing by [[Markus Montola]]&lt;br /&gt;
*Genre, Style, Method and Focus: Typologies for Role-Playing Games by [[Jaakko Stenros]]&lt;br /&gt;
*On the Importance of Body Language in Live-Action Role-play by [[Terhi Säilä]]&lt;br /&gt;
*Rules of Engagement by [[Eliot Wieslander]]&lt;br /&gt;
&lt;br /&gt;
GAMES&lt;br /&gt;
&lt;br /&gt;
*“I Could a Tale Unfold Whose Lightest Word Would Harrow up Thy Soul”: Lessons from Hamlet by [[Johanna Koljonen]]&lt;br /&gt;
*Post Panopticon by [[Gabriel Widing]]&lt;br /&gt;
*Temporary Utopias: The Political Reality of Fiction by [[Tova Gerge]]&lt;br /&gt;
*Infinite Possibilities:  Mellan Himmel och Hav From a Science Fiction Point of View by [[Karin Tidbeck]]&lt;br /&gt;
*Creating Music for Live-Action Role-Play by [[Henrik Summanen]]&lt;br /&gt;
&lt;br /&gt;
OPENINGS&lt;br /&gt;
&lt;br /&gt;
*Positive Power Drama: A Theoretical and Practical Approach on Emotive Larping by [[Eliot Wieslander]]&lt;br /&gt;
*Participatory Education: What and Why by [[Elge Larsson]]&lt;br /&gt;
*The Storyteller&#039;s Manifesto by [[Aksel Westlund]]&lt;br /&gt;
*Battle Against Primitivism by [[Juhana Pettersson]]&lt;br /&gt;
*Genesi: Larp Art, Basic Theories by [[Christopher Sandberg]]&lt;br /&gt;
*About the Community of Role-Players by [[Merja Leppälahti]]&lt;br /&gt;
&lt;br /&gt;
==Downloads==&lt;br /&gt;
&lt;br /&gt;
*[//www.nordiclarp.org/wiki/images/8/84/2004-Beyond.Role.and.Play.pdf Beyond Role and Play] (PDF)&lt;br /&gt;
&lt;br /&gt;
[[Category:Books]]&lt;br /&gt;
[[Category:2004 books]]&lt;br /&gt;
[[Category:Knutepunkt-books]]&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=As_Larp_Grows_Up&amp;diff=6635</id>
		<title>As Larp Grows Up</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=As_Larp_Grows_Up&amp;diff=6635"/>
		<updated>2025-11-01T21:05:16Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: Text replacement - &amp;quot;//nordiclarp.org/w/&amp;quot; to &amp;quot;//www.nordiclarp.org/wiki/&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox book&lt;br /&gt;
| name = As Larp Grows Up&lt;br /&gt;
| image = 2003-As.Larp.Grows.Up.jpg&lt;br /&gt;
| author = {{Unbulleted list|[[Morten Gade]]|[[Line Thorup]]|[[Mikkel Sander]]}}&lt;br /&gt;
| country = Denmark&lt;br /&gt;
| published = 2003&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;As Larp Grows Up&#039;&#039;&#039; was published in conjunction with the [[Knudepunkt 2003]] conference.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Content==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Introduction&#039;&#039;&#039; by ﻿Line Thorup, Mikkel Sander and Morten Gade&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Classics===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[[The three way model|The Three Way Model]]&#039;&#039;&#039; Revision of the Threefold Model by [[Petter Bøckman]]&lt;br /&gt;
&lt;br /&gt;
A classic and controversial theory originally from tabletop thinkers of how there are three main ways to approach larping, the gamist, dramatist and immersionist angles.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The Dogma 99 Manifesto&#039;&#039;&#039; The Vow of Chastity by [[Eirik Fatland]], [[Lars Wingård]]&lt;br /&gt;
&lt;br /&gt;
Ten commandments for a new purist way of making larps that take away much of the baggage from our tabletop origins and put power in the hands of the players. And a really thorough follow-up explanation, by the authors.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[[The Manifesto of the Turku School]]&#039;&#039;&#039; by [[Mike Pohjola]]&lt;br /&gt;
&lt;br /&gt;
The original &amp;quot;Immersionism good, everything else bad&amp;quot; manifesto, that aims at larp as an artform. It has a lovely pretentious tone, covering up some good and some bad advice to players.&lt;br /&gt;
&lt;br /&gt;
===That&#039;s Larp!===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Why do Bad Larps Happen to Good People?&#039;&#039;&#039; by [[Johanna Koljonen]] &lt;br /&gt;
&lt;br /&gt;
An attempt to explore the differences in creative agendas and assumptions among roleplayers in different cultures, as well as the root definition of roleplaying and larp.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The Meilahti School: Thoughts on Role-playing&#039;&#039;&#039; by [[Henri Hakkarainen]] &amp;amp; [[Jaakko Stenros]] &lt;br /&gt;
&lt;br /&gt;
A great attempt at defining roleplaying. It covers a lot of good views, though it&#039;s scope is limited to gamemastered games in some form.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Interaction: The Key Element of larp&#039;&#039;&#039; by [[Morten Gade]] &lt;br /&gt;
&lt;br /&gt;
A descriptive look at larp through the lens of interactions between the elements that constitute it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Relation Theory&#039;&#039;&#039; by [[Ryan Rohde Hansen]] &lt;br /&gt;
&lt;br /&gt;
A look at how the dynamic nature of larp emerges from a set of very simple starting situations, also some observations on the relationships of players. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The Diegetic Rooms of Larp&#039;&#039;&#039; by [[Carsten Andreasen]] &lt;br /&gt;
&lt;br /&gt;
An article explaining the differences and overlaps between fiction and real world, or diegesis / non-diegesis, plus the states of being and understandings of the players in that crossing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Role-playing as Interactive Construction of Subjective Diegeses&#039;&#039;&#039; by [[Markus Montola]]&lt;br /&gt;
&lt;br /&gt;
A primer in understanding the concept of diegesis, how it is constructed and how players will always be co-creators.&lt;br /&gt;
&lt;br /&gt;
===The real world===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The use of history in larp&#039;&#039;&#039; by Xenia Salomonsen &lt;br /&gt;
&lt;br /&gt;
An overview of historical correct or inspired larps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Institutional development of Larp in Oslo&#039;&#039;&#039; by Ragnhild Hutchison &lt;br /&gt;
&lt;br /&gt;
An economic take on the role of institutions in larpcreation, using developments in Oslo as an example. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Play is Political&#039;&#039;&#039; by Johan Soderberg &lt;br /&gt;
&lt;br /&gt;
Roleplaying&#039;s position in postmodern living, as an individual escape or artform, as well as some political perspectives.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Learning by Fiction&#039;&#039;&#039; by Thomas Duus Henriksen &lt;br /&gt;
&lt;br /&gt;
A critical look at using roleplay in education, especially the schism in understanding between teachers and larpers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Phantasmagorie, Simulacre and the Danger of Dragonlance&#039;&#039;&#039; by Marie Carsten Pedersen &lt;br /&gt;
&lt;br /&gt;
A modern cultural history look at fantasy larp, especially the worlds created. It looks on the role of escapism, fiction and myth in the act of worldbuilding.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Larp as a Way to Enlightenment&#039;&#039;&#039; by [[Elge Larsson]] &lt;br /&gt;
&lt;br /&gt;
A positive take on the vulnerable mental state in and after larp, looking at it through various religious and psychological lenses.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Zen, Roleplay and Personal Expansion&#039;&#039;&#039; by Denkyu Sebatian Gundel&lt;br /&gt;
&lt;br /&gt;
A look at zen and how it relates to roleplaying, improv and personal growth. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Just do it!===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fuck the Audience&#039;&#039;&#039; by [[Juhana Pettersson]] &lt;br /&gt;
&lt;br /&gt;
A tale of a series of intentionally bad, randomly generated, sometimes fake (vampire) larps.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The Development of Ideas&#039;&#039;&#039; by Christian Badse &lt;br /&gt;
&lt;br /&gt;
How to handle ideas, from inception, through refinement, testing and documentation.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Essentials of project management&#039;&#039;&#039; by Mikkel Sander &lt;br /&gt;
&lt;br /&gt;
Basic guide to the role of  main organizer of larp projects.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The good character description&#039;&#039;&#039; by Martin Enghoff &lt;br /&gt;
&lt;br /&gt;
The essentials of classic character writeups.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Three basic concepts for LARP organizers&#039;&#039;&#039; by Rune Lippert&lt;br /&gt;
&lt;br /&gt;
The values and lessons of the Danish group Einherjerne&#039;s style of simulationist sandbox larps, especially in regards to using minimal rules and creating immediate plots.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Dictionary===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dictionary&#039;&#039;&#039; by [[Petter Bøckman]]&lt;br /&gt;
&lt;br /&gt;
A comprehensive dictionary of various larp terms.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===The Lost Chapters===&lt;br /&gt;
&lt;br /&gt;
Two extra articles&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;The multi-tier game immersion theory&#039;&#039;&#039; by [[J. Tuomas Harviainen]]&lt;br /&gt;
&lt;br /&gt;
Expanding on the concept of immersion, it takes the principle apart and looks at three levels of immersion: Character, reality and narrative, as well as the different &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Postmodernism&#039;&#039;&#039; by [[Elge Larsson]]&lt;br /&gt;
&lt;br /&gt;
What modernism and postmodernism are and how that relates to larp / participatory art in general.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Downloads==&lt;br /&gt;
*[//www.nordiclarp.org/wiki/images/c/c2/2003-As.Larp.Grows.Up.pdf As Larp Grows Up] (PDF)&lt;br /&gt;
[[Category:Books]]&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Dissecting_Larp&amp;diff=6634</id>
		<title>Dissecting Larp</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Dissecting_Larp&amp;diff=6634"/>
		<updated>2025-11-01T21:05:16Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: Text replacement - &amp;quot;//nordiclarp.org/w/&amp;quot; to &amp;quot;//www.nordiclarp.org/wiki/&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox book&lt;br /&gt;
| name = Dissecting Larp&lt;br /&gt;
| image = 2005-Dissecting.Larp.jpg&lt;br /&gt;
| author = {{Unbulleted list|[[Petter Bøckman]]|[[Ragnhild Hutchison]]}}&lt;br /&gt;
| country = Norway&lt;br /&gt;
| published = 2005&lt;br /&gt;
| isbn = 82-997102-1-9&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Dissecting Larp&#039;&#039;&#039; was published in conjunction with the [[Knutepunkt 2005]] conference.&lt;br /&gt;
==Downloads==&lt;br /&gt;
&lt;br /&gt;
*[//www.nordiclarp.org/wiki/images/9/95/2005-Dissecting.Larp.pdf Dissecting Larp] (PDF)&lt;br /&gt;
&lt;br /&gt;
[[Category:Books]]&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=The_Tribunal&amp;diff=6633</id>
		<title>The Tribunal</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=The_Tribunal&amp;diff=6633"/>
		<updated>2025-11-01T21:04:12Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: Text replacement - &amp;quot;http://nordiclarp.org/w/&amp;quot; to &amp;quot;https://www.nordiclarp.org/wiki/&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox larp design &lt;br /&gt;
|first_run={{start and end dates|2010|11|19|2010|11|20}} in Oslo, Norway&lt;br /&gt;
|name=The Tribunal&lt;br /&gt;
|participants=5-10&lt;br /&gt;
|duration=2 hours&lt;br /&gt;
|designers=[[J. Tuomas Harviainen]]&lt;br /&gt;
}}&lt;br /&gt;
&#039;&#039;&#039;The Tribunal&#039;&#039;&#039; is a larp scenario written by [[J. Tuomas Harviainen]] for the first [[The Larpwriter Challenge|Larpwriter Challenge]] in 2010. It was chosen as the winner and was credited for reaching it&#039;s design goal of being a game about the mechanics of oppression in an elegant and easy to grasp design. The character design was applauded for being particularly effective in how it establishes distinctive characters for a short game of this type. &lt;br /&gt;
&lt;br /&gt;
Harviainen received a game developer grant of NOK 4 000 and the possibility to go to Minsk, Belarus to a conference on educatinal larping to hold the game and a workshop on educational game design. The game, along with several other contributions, was also translated to Russian and/or Belarusian to be used by Belarusian NGOs in their work with young people.&lt;br /&gt;
==Downloads==&lt;br /&gt;
* [https://www.nordiclarp.org/wiki/images/a/a3/The_Tribunal.doc The Tribunal] (DOC, 50 KB) Raw script meant to be localized and adapted by game organizers.&lt;br /&gt;
* [https://www.nordiclarp.org/wiki/images/8/8f/The_Tribunal_US.pdf The Tribunal (US)] (PDF, 230 kb) Localized by [[Jason Morningstar]] for play in the US.&lt;br /&gt;
==External Links==&lt;br /&gt;
* [http://leavingmundania.com/2014/08/17/j-tuomas-harviainen-larp-collection/ The J. Tuomas Harviainen Larp Collection] (2014-08-17)&lt;br /&gt;
* [http://nordiclarp.org/2015/02/18/infinite-firing-squads-the-evolution-of-the-tribunal/ Infinite Firing Squads: The Evolution of The Tribunal] (2015-02-18)&lt;br /&gt;
&lt;br /&gt;
[[Category:Larps]]&lt;br /&gt;
[[Category:Larps from Finland]]&lt;br /&gt;
[[Category:2010 larps]]&lt;br /&gt;
[[Category:Chamber larps]]&lt;br /&gt;
[[Category:Chamber larps from Finland]]&lt;br /&gt;
[[Category:2010 chamber larps]]&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Knutpunkt_2014&amp;diff=6632</id>
		<title>Knutpunkt 2014</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Knutpunkt_2014&amp;diff=6632"/>
		<updated>2025-11-01T21:04:12Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: Text replacement - &amp;quot;http://nordiclarp.org/w/&amp;quot; to &amp;quot;https://www.nordiclarp.org/wiki/&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Knutpunkt_2014.png|200px|thumb|Knutpunkt 2014]]&lt;br /&gt;
&#039;&#039;&#039;Knutepunkt 2014&#039;&#039;&#039; was a [[Knutepunkt]]-conference held in the Gulbrannagården outside Halmstad, Sweden {{start and end dates|2014|4|3|2014|4|6}}.&lt;br /&gt;
&lt;br /&gt;
313 participants came from 28 countries.&lt;br /&gt;
&lt;br /&gt;
==Publications==&lt;br /&gt;
For 2014, two [[Knutepunkt-books]] was published:&lt;br /&gt;
* [[The Foundation Stone of Nordic Larp]]&lt;br /&gt;
* [[The Cutting Edge of Nordic Larp]]&lt;br /&gt;
&lt;br /&gt;
==Program==&lt;br /&gt;
The program featured panels, talks, discussion, workshops, larps and other items. Check out the [https://www.nordiclarp.org/wiki/images/3/36/Knutpunkt_2014_-_Schedule_-_Version_1.4.pdf shedule as pdf] or the [https://www.nordiclarp.org/wiki/images/2/2a/Knutpunkt_2014_-_Program_Folder.pdf program folder as pdf].&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
* [http://knutpunkt.org Knutpunkt.org - Offical website]&lt;br /&gt;
* [http://nordiclarp.org/2014/04/07/knutpunkt-2014-summary/ Summary of Knutpunkt: Sessions, video, presentation, blogs etc]&lt;br /&gt;
[[Category:Knutepunkt runs]]&lt;br /&gt;
[[Category:Knutpunkt runs in Sweden]]&lt;br /&gt;
{{DEFAULTSORT:KP 2014}}&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Knutepunkt_2013&amp;diff=6631</id>
		<title>Knutepunkt 2013</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Knutepunkt_2013&amp;diff=6631"/>
		<updated>2025-11-01T21:04:11Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: Text replacement - &amp;quot;http://nordiclarp.org/w/&amp;quot; to &amp;quot;https://www.nordiclarp.org/wiki/&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[File:Knutepunkt2013-logo.png|200px|thumb|Knutepunkt 2013]]&lt;br /&gt;
&#039;&#039;&#039;Knutepunkt 2013&#039;&#039;&#039; was a [[Knutepunkt]]-conference held in the &#039;&#039;[Haraldvangen kurs og konferansesenter]&#039;&#039; next to the lake Hurdalsjøen Norway {{start and end dates|2013|4|18|2013|4|21}}.&lt;br /&gt;
&lt;br /&gt;
308 participants came from 22 countries.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Publication - The official Knutepunkt book series==&lt;br /&gt;
[[File:2013-Knutepunkt-books.jpg|right|thumb|The official Knutepunkt books series of Knutepunkt 2013]]&lt;br /&gt;
For the conference, a compilation of four [[Knutepunkt-books]] was published as &#039;&#039;The official book series of Knutepunkt 2013&#039;&#039;. They were edited by [[Karete Jacobsen Meland]] and [[Katrine Øverlie Svela]], and cover and illustrations were made by graphic designer [[Rebecca Egebjerg]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;[[Crossing Habitual Borders]]&#039;&#039;&lt;br /&gt;
* &#039;&#039;[[Crossing Physical Borders]]&#039;&#039;&lt;br /&gt;
* &#039;&#039;[[Crossing Theoretical Borders]]&#039;&#039;&lt;br /&gt;
* &#039;&#039;[[Exploring Borders]]&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Statistics==&lt;br /&gt;
&lt;br /&gt;
===Newcomers===&lt;br /&gt;
91 out of 308 registered participants had not been to Knutepunkt before.&lt;br /&gt;
&lt;br /&gt;
===Ages===&lt;br /&gt;
150 participants were under the age of 30.&lt;br /&gt;
&lt;br /&gt;
88 were 25 or younger.&lt;br /&gt;
&lt;br /&gt;
14 participants were 20 years or younger.&lt;br /&gt;
&lt;br /&gt;
===Visiting countries===&lt;br /&gt;
Participants from 22 countries.&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable sortable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Country&lt;br /&gt;
! Participants&lt;br /&gt;
|-&lt;br /&gt;
|Belarus&lt;br /&gt;
|10&lt;br /&gt;
|-&lt;br /&gt;
|Bulgaria&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|Czech Republic&lt;br /&gt;
|8&lt;br /&gt;
|-&lt;br /&gt;
|Denmark&lt;br /&gt;
|47&lt;br /&gt;
|-&lt;br /&gt;
|Finland&lt;br /&gt;
|33&lt;br /&gt;
|-&lt;br /&gt;
|France&lt;br /&gt;
|9&lt;br /&gt;
|-&lt;br /&gt;
|Germany&lt;br /&gt;
|15&lt;br /&gt;
|-&lt;br /&gt;
|Greece&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|Ireland&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|Israel&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|Italy&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|Latvia&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|Netherlands&lt;br /&gt;
|7&lt;br /&gt;
|-&lt;br /&gt;
|Norway&lt;br /&gt;
|84&lt;br /&gt;
|-&lt;br /&gt;
|Palestine&lt;br /&gt;
|8&lt;br /&gt;
|-&lt;br /&gt;
|Poland&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|Portugal&lt;br /&gt;
|1&lt;br /&gt;
|-&lt;br /&gt;
|Russia&lt;br /&gt;
|6&lt;br /&gt;
|-&lt;br /&gt;
|Slovakia&lt;br /&gt;
|3&lt;br /&gt;
|-&lt;br /&gt;
|Sweden&lt;br /&gt;
|53&lt;br /&gt;
|-&lt;br /&gt;
|United Kingdom&lt;br /&gt;
|2&lt;br /&gt;
|-&lt;br /&gt;
|United States&lt;br /&gt;
|12&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Program==&lt;br /&gt;
The program featured panels, talks, discussion, workshops, larps and other items. You can [https://www.nordiclarp.org/wiki/images/8/83/Programblekke_web-1.pdf read the program pdf here]. &lt;br /&gt;
&lt;br /&gt;
==A Week in Norway==&lt;br /&gt;
Prior to the conference A Week in Norway was held 15th-18th April. Activities included larps by participants of the [[Larp Exchange Academy]] and others designers, workshops, and [[Nordic Larp Talks]].&lt;br /&gt;
&lt;br /&gt;
==Organizers==&lt;br /&gt;
[[Irene Tanke]] (head organizer),&lt;br /&gt;
[[Martin Nielsen]] (vice head organizer)&lt;br /&gt;
[[Elin Nilsen]] (program)&lt;br /&gt;
[[Tor Kjetil Edland]] (practical)&lt;br /&gt;
[[Ståle Askerød Johansen]] (information)&lt;br /&gt;
[[Magnar Grønvik Müller]] (funding)&lt;br /&gt;
[[Ane Marie Anderson]] (Week in)&lt;br /&gt;
[[Frida Sofie Jansen]] (potato)&lt;br /&gt;
&lt;br /&gt;
[[Karete Jacobsen Meland]] (book)&lt;br /&gt;
[[Katrine Øverlie Svela]] (book)&lt;br /&gt;
[[Trine Lise Lindahl]] ([[Nordic Larp Talks]])&lt;br /&gt;
&lt;br /&gt;
==External Links==&lt;br /&gt;
* [http://knutepunkt.org Knutepunkt.org - Offical website]&lt;br /&gt;
[[Category:Knutepunkt runs]]&lt;br /&gt;
[[Category:Knutepunkt runs in Norway]]&lt;br /&gt;
{{DEFAULTSORT:KP 2013}}&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Once_Upon_a_Nordic_Larp..._Twenty_Years_of_Playing_Stories&amp;diff=6630</id>
		<title>Once Upon a Nordic Larp... Twenty Years of Playing Stories</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Once_Upon_a_Nordic_Larp..._Twenty_Years_of_Playing_Stories&amp;diff=6630"/>
		<updated>2025-11-01T21:03:37Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: Text replacement - &amp;quot;https://nordiclarp.org/w/&amp;quot; to &amp;quot;https://www.nordiclarp.org/wiki/&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox book|name=Once Upon a Nordic Larp... Twenty Years of Playing Stories|image=OnceUponaNordicLarp-TwentyYearsofPlayingStories.jpg|author={{Unbulleted list|[[Martine Svanevik]]|[[Linn Carin Andreassen]]|[[Simon Brind]]|[[Elin Nilsen]]|[[Grethe Sofie Bulterud Strand]]}}|published=2017 (Knutepunkt 2017)|pages=404|isbn=978-87-92507-36-5|country=Norway}}&lt;br /&gt;
&#039;&#039;&#039;Once Upon a Nordic Larp... Twenty Years of Playing Stories&#039;&#039;&#039; is the official [[Knutepunkt-books|book]] published in conjunction with [[Knutepunkt 2017]].&lt;br /&gt;
&lt;br /&gt;
Described in the book as:&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Being a complex grimoire of received wisdom, forbidden wisdom, and questionable wisdom; techniques (both meta- and otherwise); lies, damn lies, and associated ephemera. It was written by an eclectic mix of wonderful people from across the globe and edited by [[Martine Svanevik]], [[Linn Carin Andreassen]], [[Simon Brind]], [[Elin Nilsen]], and [[Grethe Sofie Bulterud Strand]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
==Articles==&lt;br /&gt;
* &#039;&#039;Introduction&#039;&#039; by [[Martine Svanevik]]&lt;br /&gt;
===Yesterday===&lt;br /&gt;
* &#039;&#039;Let’s Larp This! &#039;&#039; by [[Grethe Strand]], told by [[Hanne Grasmo]]&lt;br /&gt;
* &#039;&#039;All Our Yesterdays &#039;&#039; by [[Charlotte Ashby]]&lt;br /&gt;
* &#039;&#039;A Tale of Knutepunkt Theorycrafting &#039;&#039; by [[J. Tuomas Harviainen]]&lt;br /&gt;
* &#039;&#039;Response to J. Tuomas Harviainen &#039;&#039; by [[Karete Jacobsen Meland]]&lt;br /&gt;
* &#039;&#039;Three Roads (of Translation) Not Taken&#039;&#039; by [[Tadeu Rodrigues Iuama]]&lt;br /&gt;
* &#039;&#039;The Classical Roots of Larp&#039;&#039; by [[Mike Pohjola]]&lt;br /&gt;
===Today===&lt;br /&gt;
* &#039;&#039;Hamlet, Vampires and the Italian Alps&#039;&#039; by [[Juhana Pettersson]]&lt;br /&gt;
* [https://nordiclarp.org/2017/02/27/ludo-narrative-dissonance-and-harmony-in-larps/ Ludo-narrative Dissonance and Harmony in Larps] by [[Hélène Henry]]&lt;br /&gt;
* &#039;&#039;Pre-larp Communication&#039;&#039; by [[Alma Elofsson]] and [[Mimmi Lundkvist]]&lt;br /&gt;
* [https://nordiclarp.org/2017/03/01/keeping-volunteers-alive/ Keeping Volunteers Alive] by [[Agatha Świstak]]&lt;br /&gt;
* &#039;&#039;The Workshop Pyramid&#039;&#039; by [[Maryia Karachun]], [[Yauheni Karachun]], [[Olga Rudak]] and [[Nastassia Sinitsyna]]&lt;br /&gt;
* &#039;&#039;Beyond Play&#039;&#039; by [[Simo Järvelä]] and [[Karete Jacobsen Meland]]&lt;br /&gt;
* &#039;&#039;Response to Simo Järvelä and Karete Jacobsen Meland&#039;&#039; by [[Grethe Sofie Bulterud Strand]]&lt;br /&gt;
* &#039;&#039;Reply to Grethe Sofie Bulterud Strand&#039;&#039; by [[Karete Jacobsen Meland]] and [[Simo Järvelä]]&lt;br /&gt;
* &#039;[https://larpx.com/2017/09/22/sing-in-me-muse-and-through-me-tell-the-story/ Sing in Me, Muse, and Through Me Tell the Story...&#039;] by [[User:Harryharrold|Harry Harrold]]&lt;br /&gt;
* &#039;&#039;Do You Want to Play Ball?&#039;&#039; by [[Josefin Westborg]] and [[Carl Nordblom]]&lt;br /&gt;
* &#039;&#039;Designing for Emotions&#039;&#039; by [[Olga Vorobyeva]]&lt;br /&gt;
* [https://nordiclarp.org/2017/02/18/playing-stories-others/ Playing the Stories of Others] by [[Kaisa Kangas]]&lt;br /&gt;
* [https://nordiclarp.org/2017/02/16/history-herstory-and-theirstory-representation-of-gender-and-class-in-larps-with-a-historical-setting/ History, Herstory and Theirstory: For Thought] by [[Mo Holkar]]&lt;br /&gt;
* &#039;&#039;Body Playground Framework&#039;&#039; by [[Blaz Branc]]&lt;br /&gt;
* &#039;&#039;Playing in Love&#039;&#039; by [[Charles Bo Nielsen]]&lt;br /&gt;
* [https://nordiclarp.org/2017/02/22/telling-character-stories/ Telling Character Stories] by [[Monika Weißenfels]]&lt;br /&gt;
* &#039;&#039;Making Heroes&#039;&#039; by [[John Shockley]]&lt;br /&gt;
* &#039;&#039;Playing Around the Event&#039;&#039; by [[Charlotte Ashby]]&lt;br /&gt;
* &#039;&#039;Response to Charlotte Ashby&#039;&#039; by [[Matt Pennington]]&lt;br /&gt;
* &#039;&#039;Reply to Matt Pennington&#039;&#039; by [[Charlotte Ashby]]&lt;br /&gt;
* [https://nordiclarp.org/2017/02/14/the-absence-of-disabled-bodies-in-larp/ The Absence of Disabled Bodies in Larp] by [[Shoshana Kessock]]&lt;br /&gt;
* [https://nordiclarp.org/2017/02/17/food-thought-narrative-food-larps/ Food for Thought: Narrative Through Food at Larps] by [[Siri Sandquist]] and [[Rosalind Göthberg]]&lt;br /&gt;
* [https://nordiclarp.org/2017/02/19/youtube-and-larp/ YouTube and Larp] by [[Mo Mo O’Brien]]&lt;br /&gt;
* [https://nordiclarp.org/2017/02/20/character-based-design-narrative-tools-french-style-romanesque-larp/ Character-based Design and Narrative Tools in the French Style Romanesque Larp] by [[Muriel Algayres]]&lt;br /&gt;
* [https://nordiclarp.org/2017/02/21/loyalty-to-character/ Loyalty to Character] by [[Charles Bo Nielsen]]&lt;br /&gt;
* [https://nordiclarp.org/2017/02/21/response-charles-b-nielsen/ Response to Charles B. Nielsen] by [[Martine Svanevik]]&lt;br /&gt;
* [https://nordiclarp.org/2017/02/21/reply-martine-svanevik/ Reply to Martine Svanevik] by [[Charles Bo Nielsen]]&lt;br /&gt;
* [https://nordiclarp.org/2017/02/15/moment-based-story-design/ Moment-based Story Design] by [[Ian Thomas]]&lt;br /&gt;
* &#039;&#039;Curious Pastimes&#039;&#039; by [[Emmylou Laird]]&lt;br /&gt;
* &#039;&#039;Will to Live&#039;&#039; by [[Rob Williams]]&lt;br /&gt;
* &#039;&#039;Context, Context, Context&#039;&#039; by [[Jamie Harper]]&lt;br /&gt;
* &#039;&#039;Larp Tourism&#039;&#039; by [[Claus Raasted]]&lt;br /&gt;
* &#039;&#039;Tensions Between Transmedia Fandom and Live-Action Role-Play&#039;&#039; by [[Evan Torner]]&lt;br /&gt;
* &#039;&#039;Meanwhile in the South&#039;&#039; by [[Andrea Giovannucci]], translation by [[Wendy Columbo]]&lt;br /&gt;
* &#039;&#039;Tell Us a Story&#039;&#039; by [[Ian Andrews]]&lt;br /&gt;
* &#039;&#039;Response to Ian Andrews&#039;&#039; by [[Simon Brind]]&lt;br /&gt;
* &#039;&#039;Reply to Simon Brind&#039;&#039; by [[Ian Andrews]]&lt;br /&gt;
&lt;br /&gt;
===Tomorrow===&lt;br /&gt;
* &#039;&#039;On Ripping Off and Selling Out&#039;&#039; by [[Eirik Fatland]]&lt;br /&gt;
* &#039;&#039;Larp in the Year 2037&#039;&#039; by [[Christopher Amherst]]&lt;br /&gt;
* &#039;&#039;Thinking Outside the Black Box&#039;&#039; by [[Eva Wei]] &amp;amp; [[Rosalind Göthberg]]&lt;br /&gt;
* &#039;&#039;Beyond Playing to Lose and Narrativism&#039;&#039; by [[Jeppe Bergmann Hamming]] &amp;amp; [[Maria Bergmann Hamming]]&lt;br /&gt;
* &#039;&#039;An Invitation to Dance&#039;&#039; by [[Lorenzo Trenti]]&lt;br /&gt;
* &#039;&#039;Art and Larp&#039;&#039; by [[Nina Runa Essendrop]]&lt;br /&gt;
* &#039;&#039;Larp and I — Til Death Do Us Part&#039;&#039; by [[Hanne Grasmo]]&lt;br /&gt;
&lt;br /&gt;
==Downloads==&lt;br /&gt;
* [https://www.nordiclarp.org/wiki/images/d/d4/2017_OnceUponANordicLarp.pdf Once Upon a Nordic Larp... Twenty Years of Playing Stories] (PDF)&lt;br /&gt;
[[Category:Books]]&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=M%C3%A1ty%C3%A1s_Harty%C3%A1ndi&amp;diff=6629</id>
		<title>Mátyás Hartyándi</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=M%C3%A1ty%C3%A1s_Harty%C3%A1ndi&amp;diff=6629"/>
		<updated>2025-11-01T21:03:37Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: Text replacement - &amp;quot;https://nordiclarp.org/w/&amp;quot; to &amp;quot;https://www.nordiclarp.org/wiki/&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A core member of the third generation of Hungarians involved in the Nordic larp scene since 2016.&lt;br /&gt;
&lt;br /&gt;
The first Hungarian to compete in Fastaval with his design ([https://alexandria.dk/en/data?scenarie=9077 Memento Morrison], 2020), and the first debuting with a larp in the KP/SK scene (2021).&lt;br /&gt;
&lt;br /&gt;
As a hobbyist, he translated various larps into Hungarian.&lt;br /&gt;
&lt;br /&gt;
As a scholar, he explores the history, theory, and application of roleplaying in a broad approach that goes beyond larping. His submitted PhD dissertation on leadership development methods integrates various roleplaying traditions, including gaming simulations, larps, and Moreno-based psychodrama and sociodrama.&lt;br /&gt;
&lt;br /&gt;
As a business consultant, trainer, and coach he uses various roleplaying techniques and methods in leadership development and change management processes.&lt;br /&gt;
&lt;br /&gt;
Psychodramatist, member of the International Simulation And Gaming Association (ISAGA), and Associate Editor of &#039;&#039;Simulation &amp;amp; Gaming&#039;&#039;, a Scimago Q2-ranked academic journal.&lt;br /&gt;
&lt;br /&gt;
Found as [https://www.facebook.com/HaRPGandi.Matyas/ Mátyás HaRPGandi] on Facebook, a pun no one else seems to recognize and appreciate.&lt;br /&gt;
&lt;br /&gt;
He lives in Budapest, Hungary.&lt;br /&gt;
&lt;br /&gt;
==Articles==&lt;br /&gt;
&lt;br /&gt;
*[https://www.nordiclarp.org/wiki/images/3/34/KP25_PDF_-_small_single_pages.pdf Bleed Before It Was Cool] (Knutepunkt 2025 Companion Book)&lt;br /&gt;
*[https://nordiclarp.org/2024/04/29/larp-the-colonist/ Larp: The Colonist] (Solmukohta 2024 Companion Book)&lt;br /&gt;
*[https://nordiclarp.org/2022/10/31/the-chinese-hotpot-of-larp/ The Chinese Hotpot of Larp] (Knutpunkt 2022 Magazine)&lt;br /&gt;
*[https://www.nordiclarp.org/wiki/images/b/b3/KP22_Distance_of_Touch_Magazine.pdf Tribes and Kingdoms] (Knutpunkt 2022 Magazine)&lt;br /&gt;
*[https://nordiclarp.org/2021/01/18/personal-perspectives/ Overcoming Larp Shyness] (Solmukohta 2020 Companion Book)&lt;br /&gt;
&lt;br /&gt;
[https://www.researchgate.net/profile/Matyas-Hartyandi/research Academic publication list]&lt;br /&gt;
&lt;br /&gt;
==Talks==&lt;br /&gt;
&lt;br /&gt;
*The Groundhog Day Method: Leadership Development With Larping (Edu-larp Conference 2023)&lt;br /&gt;
*[https://www.youtube.com/watch?v=ztJaAD8faZ8 Early Forms of Educational Role-playing in Hungary] (with Bálint Márk Turi; Transformative Play Initiative Seminar 2022)&lt;br /&gt;
*[https://www.youtube.com/watch?v=l_MGPiIyVCM Educational Role Playing Traditions Before Edularp] (Edu-larp Conference 2021)&lt;br /&gt;
*[https://www.youtube.com/watch?v=7AcN2E4Fi-g The Magical Success of Chinese Larp] (Knutepunkt 2021)&lt;br /&gt;
*One Hundred Years of Attitude: Organized Role-playing and Larping in Hungary (with Nándor Laklia and Bálint Márk Túri, Knutepunkt 2021)&lt;br /&gt;
*[https://www.youtube.com/watch?v=uffi5i9cy_k Larp: Oddity, Hypernym or what?] (Solmukohta 2020)&lt;br /&gt;
*When the Grass is Not Greener: Simulation &amp;amp; Sensitivity Training in Edularps (Østerskov International Edu-Larp Conference 2017)&lt;br /&gt;
&lt;br /&gt;
[https://www.youtube.com/@EPICLEVER Hungarian YouTube channel]&lt;br /&gt;
&lt;br /&gt;
==Program items==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;Unveiling Power Dynamics in Nordic Larp&#039;&#039;. A critical workshop about hidden power structures (Knutepunkt 2025)&lt;br /&gt;
*&#039;&#039;Rise &amp;amp; Reflect: Making sense of Knutepunkt.&#039;&#039; A self-reflective silent coaching session about last night / being at KP (Knutepunkt 2025)&lt;br /&gt;
*&#039;&#039;Larping &amp;amp; Business&#039;&#039;. A loosely linked series of 3 short business related program items (with Gijs van Bilsen and Stefan Deutch; Solmukohta 2024)&lt;br /&gt;
*&#039;&#039;Group Coaching: Sophomore Sadness&#039;&#039;. A supportive session on navigating the complexities of returning to SK/KP (Solmukohta 2024)&lt;br /&gt;
*&#039;&#039;Group Coaching: Winning Solmukohta.&#039;&#039; A dramatic exploration of how to thrive at Solmukohta (Solmukohta 2024)&lt;br /&gt;
*&#039;&#039;Not Labeled As Larp: Embodied Role-playing Traditions&#039;&#039;. An open panel on embodied role-playing forms (with Melanie Dorey, Mike Pohjola, Bálint Márk Túri, and Fanny Hajdú; Portal 11 2023)&lt;br /&gt;
*&#039;&#039;Using Larp in Business Context&#039;&#039;. An open space workshop about larps in the learning and development field (with Gijs van Bilsen; Knudepunkt 2023)&lt;br /&gt;
*&#039;&#039;Good Morning Collective Wisdom!&#039;&#039; A series of group coaching sessions in the morning (Knudepunkt 2023)&lt;br /&gt;
*&#039;&#039;Leadership Research, Larp &amp;amp; Funny Hats&#039;&#039;. A workshop on leadership research and larps (Knutpunkt 2022)&lt;br /&gt;
*&#039;&#039;The Groundhog Day Social Exercise&#039;&#039;. A social &#039;workout&#039; with strangers for introverts (Knutpunkt 2022)&lt;br /&gt;
*&#039;&#039;A Taoist Spell to Libeartion&#039;&#039;. Movement meditation workshop based on the five Chinese &#039;elements&#039; (Knutepunkt 2021)&lt;br /&gt;
*&#039;&#039;[https://alexandria.dk/en/data?scenarie=9077 Memento Morrison]&#039;&#039;. A Hungarian Nordic larp (Knutepunkt 2021)&lt;br /&gt;
&lt;br /&gt;
==Translations==&lt;br /&gt;
&lt;br /&gt;
*Eltávozott ([https://scenariofestival.se/wp-content/uploads/2018/11/gone.pdf Væk / Gone] by Klaus Meier Olsen)&lt;br /&gt;
*Feldúlva ([https://alexandria.dk/da/data?scenarie=4080 Forrykt / Deranged] by Jeppe Bergmann Hamming &amp;amp; Maria Bergmann Hamming)&lt;br /&gt;
*Hadbíróság ([https://alexandria.dk/da/data?scenarie=7920 The Tribunal] by J. Tuomas Harviainen)&lt;br /&gt;
*Homonkulusz ([https://alexandria.dk/en/data?scenarie=12364 Homonculus] by Ash Kreider)&lt;br /&gt;
*Régi hallgató, utolsó betelefonáló ([https://alexandria.dk/da/data?scenarie=12370 Long Time Listener, Last Time Caller] by Jeff Dieterle)&lt;br /&gt;
*parts of [https://alexandria.dk/da/data?scenarie=3429 Imperiet]&lt;br /&gt;
&lt;br /&gt;
Many other tabletop story games, PbtA games, scenarios, and indie RPGs.&lt;br /&gt;
&lt;br /&gt;
==Founder==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;Development &amp;amp; Design Ltd&#039;&#039;: A for-profit company utilizing roleplaying in consulting, designing, and training services (2024-)&lt;br /&gt;
*[https://epiclever.itch.io/atlasz-eletmudij &#039;&#039;ATLAS RPG Lifetime Award&#039;&#039;]: Award for non-profit community achievements in the Hungarian RPG scene (2023-)&lt;br /&gt;
*&#039;&#039;[https://www.facebook.com/epiclever.workshop EPICLEVER]&#039;&#039;: A Hungarian RPG research community (2020-)&lt;br /&gt;
*&#039;&#039;LVDVS MAXIMUS&#039;&#039;: A Hungarian game-based and playful education center (2014-2020)&lt;br /&gt;
*&#039;&#039;LFX&#039;&#039;: The first Hungarian online tabletop RPG community (2014-2016)&lt;br /&gt;
*&#039;&#039;Véletlen Találkozások&#039;&#039; [Random Encounters]: The first Hungarian OSR convention (2010-2013)&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=The_Cutting_Edge_of_Nordic_Larp&amp;diff=6628</id>
		<title>The Cutting Edge of Nordic Larp</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=The_Cutting_Edge_of_Nordic_Larp&amp;diff=6628"/>
		<updated>2025-11-01T21:03:32Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: Text replacement - &amp;quot;https://nordiclarp.org/w/&amp;quot; to &amp;quot;https://www.nordiclarp.org/wiki/&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Infobox book|published=2014 (Knutpunkt)|image=The Cutting Edge of Nordic Larp.jpg|isbn=978-91-637-5217-9|isbn_note=(ISBND {{ISBNT|978-91-637-5218-6}})|name=The Cutting Edge of Nordic Larp|author=[[Jon Back]]|country=Sweden}}&lt;br /&gt;
&#039;&#039;&#039;The Cutting Edge of Nordic Larp&#039;&#039;&#039;, published in 2014, edited by [[Jon Back]], is one of the two [[Knutepunkt-books]] of [[Knutpunkt 2014]]. Graphic design &#039;&#039;Mats Sjögren&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Downloads==&lt;br /&gt;
&lt;br /&gt;
*[https://www.nordiclarp.org/wiki/images/e/e8/2014_The_Cutting_Edge_of_Nordic_Larp.pdf 2014_The_Cutting_Edge_of_Nordic_Larp.pdf]  (PDF, 2.72 MB)&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
&lt;br /&gt;
*[[The Foundation Stone of Nordic Larp]]&lt;br /&gt;
&lt;br /&gt;
==Video presentation==&lt;br /&gt;
Presentation about the The Knutepunkt 2014 Book by [[Eleanor Saitta]] at the [[Nordic Larp Talks]] 2014.&lt;br /&gt;
&lt;br /&gt;
{{#ev:youtube|nkv28QWKdKE}}&lt;br /&gt;
[[Category:Books]]&lt;br /&gt;
{{DEFAULTSORT:Cutting Edge of Nordic Larp}}&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Template:Code&amp;diff=3092</id>
		<title>Template:Code</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Template:Code&amp;diff=3092"/>
		<updated>2025-10-25T23:39:36Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#tag:syntaxhighlight|{{{code|{{{1}}}}}}|lang={{{lang|{{{2|text}}}}}}|class={{{class|}}}|style={{{style|}}}|inline=1}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Add categories to the /doc subpage, interwikis to Wikidata, not here --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Template:Fix&amp;diff=3090</id>
		<title>Template:Fix</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Template:Fix&amp;diff=3090"/>
		<updated>2025-10-25T23:39:30Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#switch:{{{subst|¬}}}&lt;br /&gt;
 |¬={{#invoke:Category handler|main&lt;br /&gt;
  |template=[[Category:Templates needing substitution checking]]&lt;br /&gt;
  |nocat={{{nocat|&amp;lt;noinclude&amp;gt;true&amp;lt;/noinclude&amp;gt;}}}&lt;br /&gt;
 }}&lt;br /&gt;
 |SUBST=[[Category:Pages with incorrectly substituted templates]]&lt;br /&gt;
}}{{#invoke:Category handler|main&lt;br /&gt;
 |main={{Fix/category&lt;br /&gt;
  |cat-date={{{cat-date|}}} &lt;br /&gt;
  |cat={{{cat|}}} &lt;br /&gt;
  |cat-date2={{{cat-date2|}}} &lt;br /&gt;
  |cat2={{{cat2|}}} &lt;br /&gt;
  |cat-date3={{{cat-date3|}}} &lt;br /&gt;
  |cat3={{{cat3|}}} &lt;br /&gt;
  |date={{{date|}}}&lt;br /&gt;
 }}&lt;br /&gt;
 |template={{#if:{{{name|}}}|{{#ifeq:{{{name}}}|{{ROOTPAGENAME}}||{{#if:{{{date|}}}||[[Category:Templates including undated clean-up tags]]}}}}}} &lt;br /&gt;
 |subpage=no&lt;br /&gt;
}}{{#if:{{{text|}}}&lt;br /&gt;
 |&amp;lt;sup class=&amp;quot;noprint Inline-Template {{{class|}}}&amp;quot; style=&amp;quot;white-space:nowrap;&amp;quot;&amp;gt;&amp;amp;#91;&amp;lt;i&amp;gt;{{#if:{{{pre-text|}}}&lt;br /&gt;
  |{{{pre-text}}}&amp;amp;#32;&lt;br /&gt;
 }}[[{{{link|Wikipedia:Cleanup}}}|&amp;lt;span title=&amp;quot;{{#invoke:string|replace|source={{delink|1={{{title|{{{link|Wikipedia:Cleanup}}}}}}{{#if:{{{date|}}}|&amp;amp;#32;({{{date}}})}}}}|pattern=&amp;quot; |replace=&amp;amp;quot; |plain=true}}&amp;quot;&amp;gt;{{{text|}}}&amp;lt;/span&amp;gt;]]{{#if:{{{post-text|}}}&lt;br /&gt;
  |&amp;amp;#32;{{{post-text}}}&lt;br /&gt;
 }}&amp;lt;/i&amp;gt;&amp;amp;#93;&amp;lt;/sup&amp;gt;|{{{special|}}}&lt;br /&gt;
}}{{#invoke:Check for unknown parameters|check|unknown=[[Category:Pages using Template:Fix with unknown parameters|_VALUE_{{PAGENAME}}]]|preview=Page using [[Template:Fix]] with unknown parameter &amp;quot;_VALUE_&amp;quot;|ignoreblank=y| cat | cat-date | cat-date2 | cat-date3 | cat2 | cat3 | class | date | link | name | nocat | post-text | pre-text | special | subst | text | title }}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;!-- Add cats and interwikis to the /doc subpage, not here! --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Template:Incorrect_redirect_template&amp;diff=3088</id>
		<title>Template:Incorrect redirect template</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Template:Incorrect_redirect_template&amp;diff=3088"/>
		<updated>2025-10-25T23:39:24Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#ifeq:&amp;lt;noinclude&amp;gt;yes&amp;lt;/noinclude&amp;gt;&amp;lt;includeonly&amp;gt;&lt;br /&gt;
	{{#if:{{#invoke:redirect|isRedirect|{{FULLPAGENAME}}}}&lt;br /&gt;
		|yes&lt;br /&gt;
		|{{#switch:{{NAMESPACE}}&lt;br /&gt;
			|Category&lt;br /&gt;
			|User=yes&lt;br /&gt;
			|Wikipedia={{#switch:{{PAGENAME}}&lt;br /&gt;
				|Sandbox&lt;br /&gt;
				|Template index/Redirect pages&lt;br /&gt;
				|WikiProject Scouting/Templates=no&lt;br /&gt;
				|#default=yes&lt;br /&gt;
			|#default=no&lt;br /&gt;
			}}&lt;br /&gt;
		}}&lt;br /&gt;
	}}&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
	|yes&lt;br /&gt;
	|{{Mbox&lt;br /&gt;
		|style=border:2px var(--border-color-error, #f54739) solid;&lt;br /&gt;
		|type=delete&lt;br /&gt;
		|image=[[File:Stop hand.svg|45px]]&lt;br /&gt;
		|text={{Error|The above [[WP:RCAT|rcat template]] should only be used to categorize redirects that are {{#ifeq:{{{3}}}|outside|outside|in}} the &#039;&#039;{{{1}}}&#039;&#039; namespace{{#ifeq:{{yesno|{{{plural1|}}}}}|yes|s}}{{#if:{{{2|}}}|{{nbsp}}{{#ifeq:{{{3}}}|outside|and|or}} the &#039;&#039;{{{2}}}&#039;&#039; namespace{{#ifeq:{{yesno|{{{plural2|}}}}}|yes|s}}.|.}}}}&lt;br /&gt;
	}}&amp;lt;includeonly&amp;gt;[[Category:Pages with templates in the wrong namespace]]&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Template:ISSN_link&amp;diff=3086</id>
		<title>Template:ISSN link</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Template:ISSN_link&amp;diff=3086"/>
		<updated>2025-10-25T23:39:18Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#if:{{{1|}}}|{{#if:{{{2|}}}|[https://www.worldcat.org/search?fq=x0:jrnl&amp;amp;q=n2:{{#if:1|{{{1}}}}} {{#if:1|{{{1}}}}}]&amp;amp;nbsp;(print)&amp;lt;includeonly&amp;gt;{{#invoke:check isxn|check_issn|1={{{1|}}}|error={{Please check ISSN}}}}&amp;lt;/includeonly&amp;gt;{{{br|&amp;lt;br&amp;gt;}}} [https://www.worldcat.org/search?fq=x0:jrnl&amp;amp;q=n2:{{#if:1|{{{2}}}}} {{#if:1|{{{2}}}}}]&amp;amp;nbsp;(web)&amp;lt;includeonly&amp;gt;{{#invoke:check isxn|check_issn|1={{{2|}}}|error={{Please check ISSN}}}}&amp;lt;/includeonly&amp;gt;|[https://www.worldcat.org/search?fq=x0:jrnl&amp;amp;q=n2:{{#if:1|{{{1}}}}} {{#if:1|{{{1}}}}}]&amp;lt;includeonly&amp;gt;{{#invoke:check isxn|check_issn|1={{{1|}}}|error={{Please check ISSN}}}}&amp;lt;/includeonly&amp;gt;}}}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&amp;lt;!-- * INTERNAL NOTE:&lt;br /&gt;
     *&lt;br /&gt;
     * This template uses WorldCat, with the benefit that the link format&lt;br /&gt;
     *&lt;br /&gt;
     *   https://www.worldcat.org/search?fq=x0:jrnl&amp;amp;q=n2:[item ISSN]&lt;br /&gt;
     *&lt;br /&gt;
     * is _documented_ (see worldcat.org) and thus unlikely to change.&lt;br /&gt;
     *&lt;br /&gt;
     * {{#if:1| {{{1|}}} }} is equivalent to {{trim|{{{1|}}}}}&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;!-- Add categories to the /doc subpage, not here! --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Template:Module_link&amp;diff=3084</id>
		<title>Template:Module link</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Template:Module_link&amp;diff=3084"/>
		<updated>2025-10-25T23:39:12Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;&amp;amp;#123;&amp;amp;#123;{{{{{|safesubst:}}}#invoke:Separated entries|main|[[Module:{{{1}}}{{{section|}}}|#invoke:{{{1}}}]]|{{{2|&#039;&#039;function&#039;&#039;}}}|separator=&amp;amp;#124;}}&amp;amp;#125;&amp;amp;#125;&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;{{documentation}}&amp;lt;!-- Categories go on the /doc subpage and interwikis go on Wikidata. --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Template:Template_link_interwiki&amp;diff=3082</id>
		<title>Template:Template link interwiki</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Template:Template_link_interwiki&amp;diff=3082"/>
		<updated>2025-10-25T23:39:07Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;!-- Subst of {{Tl2}} follows --&amp;gt;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{&amp;lt;/nowiki&amp;gt;[[:{{ safesubst:&amp;lt;noinclude/&amp;gt;#if: {{{sister|}}} | {{{sister}}}: }}{{ safesubst:&amp;lt;noinclude/&amp;gt;#if: {{{lang|}}} | {{{lang}}}: }}{{ safesubst:&amp;lt;noinclude/&amp;gt;ns:Template }}:{{{1}}}|{{{1}}}]]{{ safesubst:&amp;lt;noinclude/&amp;gt;#if: {{{2|}}} | &amp;amp;#124;{{{2}}} }}{{ safesubst:&amp;lt;noinclude/&amp;gt;#if: {{{3|}}} | &amp;amp;#124;{{{3}}} }}{{ safesubst:&amp;lt;noinclude/&amp;gt;#if: {{{4|}}} | &amp;amp;#124;{{{4}}} }}{{ safesubst:&amp;lt;noinclude/&amp;gt;#if: {{{5|}}} | &amp;amp;#124;{{{5}}} }}{{ safesubst:&amp;lt;noinclude/&amp;gt;#if: {{{6|}}} | &amp;amp;#124;{{{6}}} }}{{ safesubst:&amp;lt;noinclude/&amp;gt;#if: {{{7|}}} | &amp;amp;#124;{{{7}}} }}{{ safesubst:&amp;lt;noinclude/&amp;gt;#if: {{{8|}}} | &amp;amp;#124;{{{8}}} }}{{ safesubst:&amp;lt;noinclude/&amp;gt;#if: {{{9|}}} | &amp;amp;#124;{{{9}}} }}&amp;lt;nowiki&amp;gt;}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;lt;!-- Subst of {{Tl2}} ends --&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;!-- Add categories and interwikis to the /doc subpage, not here! --&amp;gt;&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Template:Category_link_without_namespace&amp;diff=3080</id>
		<title>Template:Category link without namespace</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Template:Category_link_without_namespace&amp;diff=3080"/>
		<updated>2025-10-25T23:39:02Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[:Category:{{PAGENAME:{{{1}}}}}|{{{2|{{PAGENAME:{{{1}}}}}}}}]]&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Template:Category_link_with_count&amp;diff=3078</id>
		<title>Template:Category link with count</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Template:Category_link_with_count&amp;diff=3078"/>
		<updated>2025-10-25T23:38:57Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[:Category:{{#invoke:string|replace|1={{{1}}}|2=^:?[Cc]ategory:|3=|plain=false}}|&amp;lt;!--&lt;br /&gt;
--&amp;gt;{{#if:{{{name|}}}|{{{name}}}|Category:{{#invoke:string|replace|1={{{1}}}|2=^:?[Cc]ategory:|3=|plain=false}}}}&amp;lt;!--&lt;br /&gt;
--&amp;gt;]]&amp;amp;nbsp;({{PAGESINCATEGORY:{{#invoke:string|replace|1={{{1}}}|2=^:?[Cc]ategory:|3=|plain=false}}|{{{2|all}}}}})&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Template:Clc&amp;diff=3076</id>
		<title>Template:Clc</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Template:Clc&amp;diff=3076"/>
		<updated>2025-10-25T23:38:52Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:Category link with count]]&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Template:C&amp;diff=3074</id>
		<title>Template:C</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Template:C&amp;diff=3074"/>
		<updated>2025-10-25T23:38:46Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:Category link without namespace]]&lt;br /&gt;
&lt;br /&gt;
{{Redirect category shell|&lt;br /&gt;
{{R from move}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Template:Tl2&amp;diff=3072</id>
		<title>Template:Tl2</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Template:Tl2&amp;diff=3072"/>
		<updated>2025-10-25T23:38:42Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:Template link interwiki]]&lt;br /&gt;
&lt;br /&gt;
{{Redirect category shell|&lt;br /&gt;
{{R from move}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Template:Rcat_shell&amp;diff=3070</id>
		<title>Template:Rcat shell</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Template:Rcat_shell&amp;diff=3070"/>
		<updated>2025-10-25T23:38:37Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:Redirect category shell]]&lt;br /&gt;
&lt;br /&gt;
{{Redirect category shell|&lt;br /&gt;
{{R from high-use template}}&lt;br /&gt;
{{R to redirect template}}&lt;br /&gt;
{{R from template shortcut}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Template:PAGENAMEBASE&amp;diff=3068</id>
		<title>Template:PAGENAMEBASE</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Template:PAGENAMEBASE&amp;diff=3068"/>
		<updated>2025-10-25T23:38:31Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{safesubst:&amp;lt;noinclude/&amp;gt;#invoke:String|replace|{{{1|{{safesubst:&amp;lt;noinclude/&amp;gt;PAGENAME}}}}}|%s+%b()$||1|false}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Template:Ml&amp;diff=3066</id>
		<title>Template:Ml</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Template:Ml&amp;diff=3066"/>
		<updated>2025-10-25T23:38:27Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:Module link]]&lt;br /&gt;
&lt;br /&gt;
{{Redirect category shell|&lt;br /&gt;
{{R from move}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Template:Cl&amp;diff=3064</id>
		<title>Template:Cl</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Template:Cl&amp;diff=3064"/>
		<updated>2025-10-25T23:38:21Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#REDIRECT [[Template:Category link]]&lt;br /&gt;
{{R from move}}&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Template:Trim&amp;diff=3062</id>
		<title>Template:Trim</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Template:Trim&amp;diff=3062"/>
		<updated>2025-10-25T23:38:15Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;includeonly&amp;gt;{{safesubst:#if:1|{{{1|}}}}}&amp;lt;/includeonly&amp;gt;&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Template:Remove_first_word&amp;diff=3060</id>
		<title>Template:Remove first word</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Template:Remove_first_word&amp;diff=3060"/>
		<updated>2025-10-25T23:38:08Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{&amp;lt;includeonly&amp;gt;safesubst:&amp;lt;/includeonly&amp;gt;#invoke:String|replace|source={{{1}}}|pattern=^[^{{{sep|%s}}}]*{{{sep|%s}}}*|replace=|plain=false}}&amp;lt;noinclude&amp;gt;{{Documentation}}&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
	<entry>
		<id>https://www.nordiclarp.org/wiki/index.php?title=Template:Ifsubst&amp;diff=3058</id>
		<title>Template:Ifsubst</title>
		<link rel="alternate" type="text/html" href="https://www.nordiclarp.org/wiki/index.php?title=Template:Ifsubst&amp;diff=3058"/>
		<updated>2025-10-25T23:34:33Z</updated>

		<summary type="html">&lt;p&gt;Nordiclarpwikiadmin: 1 revision imported&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{ safesubst:&amp;lt;noinclude/&amp;gt;#if:{{{demo|}}}&lt;br /&gt;
|{{ safesubst:&amp;lt;noinclude/&amp;gt;#ifeq:{{{demo}}} |no&lt;br /&gt;
 |{{{no|{{{2|}}}}}}&lt;br /&gt;
 |{{{yes|{{{1|}}}}}}&lt;br /&gt;
}}&lt;br /&gt;
|{{ safesubst:&amp;lt;noinclude/&amp;gt;#ifeq:{{ safesubst:&amp;lt;noinclude/&amp;gt;NAMESPACE}}|{{NAMESPACE}}&lt;br /&gt;
 |{{{no|{{{2|}}}}}}&lt;br /&gt;
 |{{{yes|{{{1|}}}}}}&lt;br /&gt;
}}}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{Documentation}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;/div&gt;</summary>
		<author><name>Nordiclarpwikiadmin</name></author>
	</entry>
</feed>