<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://pool.calebcooper.ie/index.php?action=history&amp;feed=atom&amp;title=Module%3ACs1_documentation_support</id>
	<title>Module:Cs1 documentation support - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://pool.calebcooper.ie/index.php?action=history&amp;feed=atom&amp;title=Module%3ACs1_documentation_support"/>
	<link rel="alternate" type="text/html" href="https://pool.calebcooper.ie/index.php?title=Module:Cs1_documentation_support&amp;action=history"/>
	<updated>2026-04-08T01:18:39Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.8</generator>
	<entry>
		<id>https://pool.calebcooper.ie/index.php?title=Module:Cs1_documentation_support&amp;diff=16535&amp;oldid=prev</id>
		<title>Caleb Cooper: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://pool.calebcooper.ie/index.php?title=Module:Cs1_documentation_support&amp;diff=16535&amp;oldid=prev"/>
		<updated>2022-04-21T06:52:33Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 06:52, 21 April 2022&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Caleb Cooper</name></author>
	</entry>
	<entry>
		<id>https://pool.calebcooper.ie/index.php?title=Module:Cs1_documentation_support&amp;diff=16534&amp;oldid=prev</id>
		<title>wikipedia&gt;Trappist the monk at 23:20, 14 April 2022</title>
		<link rel="alternate" type="text/html" href="https://pool.calebcooper.ie/index.php?title=Module:Cs1_documentation_support&amp;diff=16534&amp;oldid=prev"/>
		<updated>2022-04-14T23:20:52Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://pool.calebcooper.ie/index.php?title=Module:Cs1_documentation_support&amp;amp;diff=16534&amp;amp;oldid=13478&quot;&gt;Show changes&lt;/a&gt;</summary>
		<author><name>wikipedia&gt;Trappist the monk</name></author>
	</entry>
	<entry>
		<id>https://pool.calebcooper.ie/index.php?title=Module:Cs1_documentation_support&amp;diff=13478&amp;oldid=prev</id>
		<title>Caleb Cooper: 1 revision imported</title>
		<link rel="alternate" type="text/html" href="https://pool.calebcooper.ie/index.php?title=Module:Cs1_documentation_support&amp;diff=13478&amp;oldid=prev"/>
		<updated>2020-10-21T17:57:16Z</updated>

		<summary type="html">&lt;p&gt;1 revision imported&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;en&quot;&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Older revision&lt;/td&gt;
				&lt;td colspan=&quot;1&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Revision as of 17:57, 21 October 2020&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-notice&quot; lang=&quot;en&quot;&gt;&lt;div class=&quot;mw-diff-empty&quot;&gt;(No difference)&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;</summary>
		<author><name>Caleb Cooper</name></author>
	</entry>
	<entry>
		<id>https://pool.calebcooper.ie/index.php?title=Module:Cs1_documentation_support&amp;diff=13477&amp;oldid=prev</id>
		<title>wikipedia&gt;Trappist the monk at 16:32, 21 October 2020</title>
		<link rel="alternate" type="text/html" href="https://pool.calebcooper.ie/index.php?title=Module:Cs1_documentation_support&amp;diff=13477&amp;oldid=prev"/>
		<updated>2020-10-21T16:32:19Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;require(&amp;#039;Module:No globals&amp;#039;);&lt;br /&gt;
local getArgs = require (&amp;#039;Module:Arguments&amp;#039;).getArgs;&lt;br /&gt;
&lt;br /&gt;
local cfg = mw.loadData (&amp;#039;Module:Citation/CS1/Configuration&amp;#039;);					-- load the configuration module&lt;br /&gt;
&lt;br /&gt;
local exclusion_lists = {														-- TODO: move these tables into a separate ~/data module and mw.loadData() it&lt;br /&gt;
	[&amp;#039;cite book&amp;#039;] = {&lt;br /&gt;
		[&amp;#039;agency&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;air-date&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;arxiv&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;biorxiv&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;citeseerx&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;class&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;conference&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;conference-format&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;conference-url&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;degree&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;department&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;display-interviewers&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;docket&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;episode&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;interviewer#&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;interviewer-first#&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;interviewer-link#&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;interviewer-mask#&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;ismn&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;issn&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;issue&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;jfm&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;journal&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;jstor&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;mailinglist&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;message-id&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;minutes&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;MR&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;network&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;number&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;RFC&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;script-journal&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;season&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;section&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;sections&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;series-link&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;series-number&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;series-separator&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;sheet&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;sheets&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;SSRN&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;station&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;time&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;time-caption&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;trans-article&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;trans-journal&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;transcript&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;transcript-format&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;transcript-url&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;ZBL&amp;#039;] = true,&lt;br /&gt;
		},&lt;br /&gt;
	[&amp;#039;cite journal&amp;#039;] = {&lt;br /&gt;
		[&amp;#039;agency&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;air-date&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;book-title&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;chapter&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;chapter-format&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;chapter-url&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;chapter-url-access&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;class&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;conference&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;conference-format&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;conference-url&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;contribution&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;contributor#&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;contributor-first#&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;contributor-link#&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;contributor-mask#&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;degree&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;department&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;display-interviewers&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;docket&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;edition&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;editor#&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;editor-first#&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;editor-link#&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;editor-mask#&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;editors&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;encyclopedia&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;episode&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;ignore-isbn-error&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;interviewer#&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;interviewer-first#&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;interviewer-link#&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;interviewer-mask#&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;isbn&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;ismn&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;LCCN&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;mailinglist&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;message-id&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;minutes&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;network&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;script-chapter&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;season&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;section&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;sections&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;series-link&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;series-number&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;series-separator&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;sheet&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;sheets&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;station&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;time&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;time-caption&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;trans-article&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;transcript&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;transcript-format&amp;#039;] = true,&lt;br /&gt;
		[&amp;#039;transcript-url&amp;#039;] = true,&lt;br /&gt;
		},&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
--[[-------------------------&amp;lt; A D D _ T O _ L I S T &amp;gt;---------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
adds code/name pair to code_list and name/code pair to name_list; code/name pairs in override_list replace those&lt;br /&gt;
taken from the MediaWiki list; these are marked with a superscripted dagger.&lt;br /&gt;
&lt;br /&gt;
|script-&amp;lt;param&amp;gt;= lang codes always use override names so dagger is omitted&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function add_to_list (code_list, name_list, override_list, code, name, dagger)&lt;br /&gt;
	if false == dagger then&lt;br /&gt;
		dagger = &amp;#039;&amp;#039;;															-- no dagger for |script-&amp;lt;param&amp;gt;= codes and names&lt;br /&gt;
	else&lt;br /&gt;
		dagger = &amp;#039;&amp;lt;sup&amp;gt;†&amp;lt;/sup&amp;gt;&amp;#039;;												-- dagger for all other lists using override&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if override_list[code] then													-- look in the override table for this code&lt;br /&gt;
		code_list[code] = override_list[code] .. dagger;						-- use the name from the override table; mark with dagger&lt;br /&gt;
		name_list[override_list[code]] = code .. dagger;&lt;br /&gt;
	else&lt;br /&gt;
		code_list[code] = name;													-- use the MediaWiki name and code&lt;br /&gt;
		name_list[name] = code;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[-------------------------&amp;lt; L I S T _ F O R M A T &amp;gt;---------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
formats key/value pair into a string for rendering&lt;br /&gt;
	[&amp;#039;k&amp;#039;] = &amp;#039;v&amp;#039;	→ k: v&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function list_format (result, list)&lt;br /&gt;
	for k, v in pairs (list)	do&lt;br /&gt;
		table.insert (result, k .. &amp;#039;: &amp;#039; .. v);&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[-------------------------&amp;lt; L A N G _ L I S T E R &amp;gt;---------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Module entry point&lt;br /&gt;
&lt;br /&gt;
Crude documentation tool that returns one of several lists of language codes and names.&lt;br /&gt;
&lt;br /&gt;
Used in Template:Citation Style documentation/language/doc&lt;br /&gt;
&lt;br /&gt;
{{#invoke:cs1 documentation support|lang_lister|list=&amp;lt;selector&amp;gt;|lang=&amp;lt;code&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
where &amp;lt;selector&amp;gt; is one of the values:&lt;br /&gt;
	2char – list of ISO 639-1 codes and names sorted by code&lt;br /&gt;
	3char – list of ISO 639-2, -3 codes and names sorted by code&lt;br /&gt;
	ietf – list of IETF language tags and names sorted by tag -- partial support for these by cs1|2 |language= parameter&lt;br /&gt;
	name – list of language names and codes sorted by name -- IETF tags omitted because not supported by cs1|2 |language= parameter&lt;br /&gt;
	all - list all language codes/tags and names sorted by code/tag&lt;br /&gt;
&lt;br /&gt;
where &amp;lt;code&amp;gt; is a MediaWiki supported 2, 3, or ietf-like language code; because of fall-back, language names may&lt;br /&gt;
be the English-language names.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function lang_lister (frame)&lt;br /&gt;
	local lang = (frame.args.lang and &amp;#039;&amp;#039; ~= frame.args.lang) and frame.args.lang or mw.getContentLanguage():getCode()&lt;br /&gt;
	local source_list = mw.language.fetchLanguageNames(lang, &amp;#039;all&amp;#039;);&lt;br /&gt;
	local override = cfg.lang_code_remap;&lt;br /&gt;
	local code_1_list={};&lt;br /&gt;
	local code_2_list={};&lt;br /&gt;
	local ietf_list={};&lt;br /&gt;
	local name_list={};&lt;br /&gt;
	&lt;br /&gt;
	if not ({[&amp;#039;2char&amp;#039;]=true, [&amp;#039;3char&amp;#039;]=true, [&amp;#039;ietf&amp;#039;]=true, [&amp;#039;name&amp;#039;]=true, [&amp;#039;all&amp;#039;]=true})[frame.args.list] then&lt;br /&gt;
		return &amp;#039;&amp;lt;span style=&amp;quot;font-size:100%&amp;quot; class=&amp;quot;error&amp;quot;&amp;gt;unknown list selector: &amp;#039; .. frame.args.list .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for code, name in pairs (source_list) do&lt;br /&gt;
		if &amp;#039;all&amp;#039; == frame.args.list then&lt;br /&gt;
			add_to_list (code_1_list, name_list, override, code, name);			-- use the code_1_list because why not?&lt;br /&gt;
		elseif 2 == code:len() then&lt;br /&gt;
			add_to_list (code_1_list, name_list, override, code, name);&lt;br /&gt;
		elseif 3 == code:len() then&lt;br /&gt;
			add_to_list (code_2_list, name_list, override, code, name);&lt;br /&gt;
		else																	-- ietf codes only partically supported by cs1|2 |language= parameter&lt;br /&gt;
			add_to_list (ietf_list, name_list, override, code, name);&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local result = {};&lt;br /&gt;
	local out = {};&lt;br /&gt;
&lt;br /&gt;
	if &amp;#039;2char&amp;#039; == frame.args.list or &amp;#039;all&amp;#039; == frame.args.list then&lt;br /&gt;
		list_format (result, code_1_list);&lt;br /&gt;
	elseif &amp;#039;3char&amp;#039; == frame.args.list then&lt;br /&gt;
		list_format (result, code_2_list);&lt;br /&gt;
	elseif &amp;#039;ietf&amp;#039; == frame.args.list then&lt;br /&gt;
		list_format (result, ietf_list);&lt;br /&gt;
	else																		--must be &amp;#039;name&amp;#039;&lt;br /&gt;
		list_format (result, name_list);&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	table.sort (result);&lt;br /&gt;
	table.insert (result, 1, &amp;#039;&amp;lt;div class=&amp;quot;div-col columns column-width&amp;quot; style=&amp;quot;column-width:20em&amp;quot;&amp;gt;&amp;#039;);&lt;br /&gt;
	table.insert (out, table.concat (result, &amp;#039;\n*&amp;#039;));&lt;br /&gt;
	table.insert (out, &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;);&lt;br /&gt;
	&lt;br /&gt;
	return table.concat (out, &amp;#039;\n&amp;#039;);&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 _ L I S T E R &amp;gt;------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Module entry point&lt;br /&gt;
&lt;br /&gt;
Crude documentation tool that returns list of language codes and names supported by the various |script-&amp;lt;param&amp;gt;= parameters.&lt;br /&gt;
&lt;br /&gt;
used in Help:CS1 errors&lt;br /&gt;
&lt;br /&gt;
{{#invoke:cs1 documentation support|script_lang_lister}}&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function script_lang_lister ()&lt;br /&gt;
	local lang_code_src = cfg.script_lang_codes ;								-- get list of allowed script language codes&lt;br /&gt;
	local override = cfg.lang_code_remap;&lt;br /&gt;
	local this_wiki_lang = mw.language.getContentLanguage().code;				-- get this wiki&amp;#039;s language&lt;br /&gt;
&lt;br /&gt;
	local code_list = {};														-- interim list of aliases&lt;br /&gt;
	local name_list={};															-- not used; defined here so that we can reuse add_to_list() &lt;br /&gt;
	local out = {};																-- final output (for now an unordered list)&lt;br /&gt;
	&lt;br /&gt;
	for _, code in ipairs (lang_code_src) do									-- loop through the list of codes&lt;br /&gt;
		local name = mw.language.fetchLanguageName (code, this_wiki_lang);		-- get the language name associated with this code&lt;br /&gt;
		add_to_list (code_list, name_list, override, code, name, false);		-- name_list{} not used but provided so that we can reuse add_to_list(); don&amp;#039;t add superscript dagger&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local result = {};&lt;br /&gt;
	local out = {};&lt;br /&gt;
&lt;br /&gt;
	list_format (result, code_list);&lt;br /&gt;
&lt;br /&gt;
	table.sort (result);&lt;br /&gt;
	table.insert (result, 1, &amp;#039;&amp;lt;div class=&amp;quot;div-col columns column-width&amp;quot; style=&amp;quot;column-width:20em&amp;quot;&amp;gt;&amp;#039;);&lt;br /&gt;
	table.insert (out, table.concat (result, &amp;#039;\n*&amp;#039;));&lt;br /&gt;
	table.insert (out, &amp;#039;&amp;lt;/div&amp;gt;&amp;#039;);&lt;br /&gt;
	&lt;br /&gt;
	return table.concat (out, &amp;#039;\n&amp;#039;);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; A L I A S _ L I S T E R &amp;gt;------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
experimental code that lists parameters and their aliases.  Perhaps basis for some sort of documentation?&lt;br /&gt;
&lt;br /&gt;
{{#invoke:cs1 documentation support|alias_lister}}&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function alias_lister ()&lt;br /&gt;
	local alias_src = cfg.aliases;												-- get master list of aliases&lt;br /&gt;
	local key;																	-- key for k/v in a new table&lt;br /&gt;
	local list = {};															-- interim list of aliases&lt;br /&gt;
	local out = {};																-- final output (for now an unordered list)&lt;br /&gt;
	&lt;br /&gt;
	for _, aliases in pairs (alias_src) do										-- loop throu the master list of aliases&lt;br /&gt;
		if &amp;#039;table&amp;#039; == type (aliases) then										-- table only when there are aliases&lt;br /&gt;
			for i, alias in ipairs (aliases) do									-- loop through all of the aliases&lt;br /&gt;
				if 1 == i then													-- first &amp;#039;alias&amp;#039; is the canonical parameter name&lt;br /&gt;
					key = alias;												-- so it becomes the key in list&lt;br /&gt;
				else&lt;br /&gt;
					list[key] = list[key] and (list[key] .. &amp;#039;, &amp;#039; .. alias) or alias;	-- make comma-separated list of aliases&lt;br /&gt;
					list[alias] = &amp;#039;see &amp;#039; .. key;								-- make a back reference from this alias to the canonical parameter&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for k, v in pairs (list) do													-- loop through the list to make a simple unordered list&lt;br /&gt;
		table.insert (out, table.concat ({&amp;#039;*&amp;#039;, k, &amp;#039;: &amp;#039;, v}));&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	table.sort (out);															-- sort it&lt;br /&gt;
	return table.concat (out, &amp;#039;\010&amp;#039;);											-- concatenate with \n&lt;br /&gt;
--	return (mw.dumpObject (list))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; C A N O N I C A L _ P A R A M _ L I S T E R &amp;gt;----------------------------------&lt;br /&gt;
&lt;br /&gt;
experimental code that lists canonical parameter names.  Perhaps basis for some sort of documentation?&lt;br /&gt;
&lt;br /&gt;
returns a comma separated, alpha sorted, list of the canonical parameters.  If given a template name, excludes&lt;br /&gt;
parameters listed in that template&amp;#039;s exclusion_list[&amp;lt;template&amp;gt;]{} table (if a table has been defined).&lt;br /&gt;
&lt;br /&gt;
{{#invoke:cs1 documentation support|canonical_param_lister|&amp;lt;template&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function canonical_param_lister (frame)&lt;br /&gt;
	local template = frame.args[1];&lt;br /&gt;
	if &amp;#039;&amp;#039; == template then&lt;br /&gt;
		template = nil;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if template then&lt;br /&gt;
		template = mw.text.trim (template:lower());&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local alias_src = cfg.aliases;												-- get master list of aliases&lt;br /&gt;
	local id_src = cfg.id_handlers;												-- get master list of identifiers&lt;br /&gt;
	&lt;br /&gt;
	local list = {};															-- interim list of aliases&lt;br /&gt;
	local out = {};																-- final output (for now an unordered list)&lt;br /&gt;
	&lt;br /&gt;
	for _, aliases in pairs (alias_src) do										-- loop through the master list of aliases&lt;br /&gt;
		local name;&lt;br /&gt;
		if &amp;#039;table&amp;#039; == type (aliases) then										-- table only when there are aliases&lt;br /&gt;
			name = aliases[1];													-- first member of an aliases table is declared canonical&lt;br /&gt;
		else&lt;br /&gt;
			name = aliases;														-- for those parameters that do not have any aliases, the parameter is declared canonical&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if not template then													-- no template name, add this parameter&lt;br /&gt;
			table.insert (list, name);&lt;br /&gt;
		elseif not exclusion_lists[template] then								-- template name but no exclusion list&lt;br /&gt;
			table.insert (list, name);&lt;br /&gt;
		elseif not exclusion_lists[template][name] then							-- template name and exclusion list but name not in list&lt;br /&gt;
			table.insert (list, name);&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for k, ids in pairs (id_src) do												-- spin through the list of identifiers&lt;br /&gt;
		local name = id_src[k].parameters[1];									-- get the first (left-most) parameter name&lt;br /&gt;
		local access = id_src[k].custom_access;									-- get the access-icon parameter if it exists for this identifier&lt;br /&gt;
		if not template then													-- no template name&lt;br /&gt;
			table.insert (list, name);											-- add this parameter&lt;br /&gt;
			if access then&lt;br /&gt;
				table.insert (list, access);									-- add this access-icon parameter&lt;br /&gt;
			end&lt;br /&gt;
		elseif not exclusion_lists[template] then								-- template name but no exclusion list&lt;br /&gt;
			table.insert (list, name);&lt;br /&gt;
			if access then&lt;br /&gt;
				table.insert (list, access);&lt;br /&gt;
			end&lt;br /&gt;
		elseif not exclusion_lists[template][name] then							-- template name and exclusion list but name not in list&lt;br /&gt;
			table.insert (list, name);&lt;br /&gt;
			if access then&lt;br /&gt;
				table.insert (list, access);&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	for _, param in ipairs (list) do											-- loop through the list to make a simple unordered list&lt;br /&gt;
		table.insert (out, table.concat ({&amp;#039;*&amp;#039;, param}));&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local function comp( a, b )													-- used in following table.sort()&lt;br /&gt;
		return a:lower() &amp;lt; b:lower();&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	table.sort (out, comp);														-- sort the list&lt;br /&gt;
	return table.concat (out, &amp;#039;\010&amp;#039;);											-- concatenate with \n&lt;br /&gt;
--	return (mw.dumpObject (list))&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; C A N O N I C A L _ N A M E _ G E T &amp;gt;------------------------------------------&lt;br /&gt;
&lt;br /&gt;
returns first (canonical) name when metaparameter is assigned a table of names&lt;br /&gt;
returns name when metaparameter is assigned a single name&lt;br /&gt;
returns empty string when metaparameter name not found in alias_src{}, id_src{}, or id_src[meta].custom_access&lt;br /&gt;
&lt;br /&gt;
metaparameter &amp;lt;metaparam&amp;gt; is the key in Module:Citation/CS1 aliases{} table or id_handlers{} table.  Because access-icon&lt;br /&gt;
don&amp;#039;t have &amp;lt;metaparam&amp;gt; keys, per se, we create pseudo &amp;lt;metaparam&amp;gt; keys by appending &amp;#039;access&amp;#039; to the identifier &amp;lt;metaparam&amp;gt;:&lt;br /&gt;
	the &amp;lt;metaparam&amp;gt; for |doi-access= is, for the purposes of this function, DOIaccess, etc&lt;br /&gt;
&lt;br /&gt;
Some lists of aliases might be better served when a particular alias is identified as the canonical alias for a &lt;br /&gt;
particular use case.  If, for example, &amp;lt;metaparam&amp;gt; Perodical lists:&lt;br /&gt;
	&amp;#039;journal&amp;#039;, &amp;#039;magazine&amp;#039;, &amp;#039;newspaper&amp;#039;, &amp;#039;periodical&amp;#039;, &amp;#039;website&amp;#039;, &amp;#039;work&amp;#039;&lt;br /&gt;
that order works fine for {{cite journal}} documentation but doesn&amp;#039;t work so well for {{cite magazine}}, {{cite news}},&lt;br /&gt;
or {{cite web}}.  So, for using this function to document {{cite magazine}} the returned value should be the&lt;br /&gt;
parameter best suited for that template so we can specify magazine in the override (frame.args[2])&lt;br /&gt;
&lt;br /&gt;
While for this function, it would be just as simple to not use the function, this mechanism is implemented here &lt;br /&gt;
to match similar functionality in alias_names_get() (there are slight differences)&lt;br /&gt;
	&amp;lt;override&amp;gt; must exist in the alias list&lt;br /&gt;
	does not apply to the access icon parameters (ignored - these have no aliases)&lt;br /&gt;
&lt;br /&gt;
(and which would be best for {{cite news}}? |newspaper= or |work=? can&amp;#039;t solve all of the worlds problems at once).&lt;br /&gt;
&lt;br /&gt;
output format is controlled by |format=&lt;br /&gt;
	plain - renders in plain text in a &amp;lt;span&amp;gt; tag; may have id attribute&lt;br /&gt;
	para - renders as it would in {{para|&amp;lt;param&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
{{#invoke:cs1 documentation support|canonical_name_get|&amp;lt;metaparam&amp;gt;|&amp;lt;override&amp;gt;|id=&amp;lt;attribute&amp;gt;|format=[plain|para]}}&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function canonical_name_get (frame)&lt;br /&gt;
	local alias_src = cfg.aliases;												-- get master list of aliases&lt;br /&gt;
	local id_src = cfg.id_handlers;												-- get master list of identifiers&lt;br /&gt;
	local args = getArgs (frame);&lt;br /&gt;
&lt;br /&gt;
	local name;&lt;br /&gt;
	local meta = args[1]&lt;br /&gt;
	local override = args[2];&lt;br /&gt;
&lt;br /&gt;
	local access;																-- for id-access parameters&lt;br /&gt;
	if meta:match (&amp;#039;^(%u+)access&amp;#039;) then											-- the metaparameter (which is not used in ~/Configuration) is id_handlers key concatenated with access: BIBCODEaccess&lt;br /&gt;
		meta, access = meta:gsub (&amp;#039;^(%u+)access&amp;#039;, &amp;#039;%1&amp;#039;);						-- strip &amp;#039;access&amp;#039; text from meta and use returned count value as a flag&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if alias_src[meta] then&lt;br /&gt;
		name = alias_src[meta];													-- name is a string or a table&lt;br /&gt;
		if &amp;#039;table&amp;#039; == type (name) then											-- table only when there are aliases&lt;br /&gt;
			if not override then&lt;br /&gt;
				name = name[1];													-- first member of an aliases table is declared canonical&lt;br /&gt;
			else&lt;br /&gt;
				for _, v in ipairs (name) do									-- here when override is set; spin throu the aliases to make sure override matches alias in table&lt;br /&gt;
					if v == override then&lt;br /&gt;
						name = v;												-- declare override to be the canonical param for this use case&lt;br /&gt;
						break;&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
	elseif id_src[meta]then														-- if there is an id handler&lt;br /&gt;
		if access then															-- and if this is a request for the handler&amp;#039;s custom access parameter&lt;br /&gt;
			if id_src[meta].custom_access then									-- if there is a custom access parameter&lt;br /&gt;
				name = id_src[meta].custom_access;								-- use it&lt;br /&gt;
			else&lt;br /&gt;
				return &amp;#039;&amp;#039;;														-- nope, return empty string&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			if not override then&lt;br /&gt;
				name = id_src[meta].parameters[1];								-- get canonical id handler parameter&lt;br /&gt;
			else&lt;br /&gt;
				for _, v in ipairs (id_src[meta].parameters) do					-- here when override is set; spin throu the aliases to make sure override matches alias in table&lt;br /&gt;
					if v == override then&lt;br /&gt;
						name = v;												-- declare override to be the canonical param for this use case&lt;br /&gt;
						break;&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;&amp;#039;;																-- metaparameter not specified, or no such metaparameter&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if &amp;#039;plain&amp;#039; == args.format then												-- format and return the output&lt;br /&gt;
		if args.id then&lt;br /&gt;
			return string.format (&amp;#039;&amp;lt;span id=&amp;quot;%s&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt;&amp;#039;, args.id, name);	-- plain text with id attribute&lt;br /&gt;
		else&lt;br /&gt;
			return name;														-- plain text&lt;br /&gt;
		end&lt;br /&gt;
	elseif &amp;#039;para&amp;#039; == args.format then&lt;br /&gt;
		return string.format (&amp;#039;&amp;lt;code class=&amp;quot;nowrap&amp;quot;&amp;gt;|%s=&amp;lt;/code&amp;gt;&amp;#039;, name);		-- same as {{para|&amp;lt;param&amp;gt;}}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return string.format (&amp;#039;&amp;lt;b id=&amp;quot;%s&amp;quot;&amp;gt;%s&amp;lt;/b&amp;gt;&amp;#039;, args.id or &amp;#039;&amp;#039;, name);			-- because {{csdoc}} bolds param names&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; A L I A S _ N A M E S _ G E T &amp;gt;------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
returns list of aliases for metaparameter &amp;lt;metaparam&amp;gt;&lt;br /&gt;
returns empty string when there are no aliases&lt;br /&gt;
returns empty string when &amp;lt;metaparam&amp;gt; name not found in alias_src{} or id_src{}; access icon parameters have no aliases so ignored&lt;br /&gt;
&lt;br /&gt;
metaparameter &amp;lt;metaparam&amp;gt; is the key in Module:Citation/CS1 aliases{} table or id_handlers{} table.&lt;br /&gt;
&lt;br /&gt;
Some lists of aliases might be better served when a particular alias is identified as the canonical alias for a &lt;br /&gt;
particular use case.  If, for example, &amp;lt;metaparam&amp;gt; Perodical lists:&lt;br /&gt;
	&amp;#039;journal&amp;#039;, &amp;#039;magazine&amp;#039;, &amp;#039;newspaper&amp;#039;, &amp;#039;periodical&amp;#039;, &amp;#039;website&amp;#039;, &amp;#039;work&amp;#039;&lt;br /&gt;
that order works fine for {{cite journal}} documentation but doesn&amp;#039;t work so well for {{cite magazine}}, {{cite news}},&lt;br /&gt;
or {{cite web}}.  So, for using this function to document {{cite magazine}} the returned value should be the&lt;br /&gt;
aliases that are not best suited for that template so we can specify magazine in the override (frame.args[2])&lt;br /&gt;
to be the canonical parameter so it won&amp;#039;t be listed with the rest of the aliases (normal canonical journal will be)&lt;br /&gt;
&lt;br /&gt;
	&amp;lt;override&amp;gt; must exist in the alias list except:&lt;br /&gt;
		when &amp;lt;override&amp;gt; value is &amp;#039;all&amp;#039;, returns the canonical parameter plus all of the aliases&lt;br /&gt;
&lt;br /&gt;
output format is controlled by |format=&lt;br /&gt;
	plain - renders in plain text in a &amp;lt;span&amp;gt; tag; may have id attribute&lt;br /&gt;
	para - renders as it would in {{para|&amp;lt;param&amp;gt;}}&lt;br /&gt;
	when not specified, refurns the default bold format used for {{csdoc}}&lt;br /&gt;
&lt;br /&gt;
{{#invoke:cs1 documentation support|alias_name_get|&amp;lt;metaparam&amp;gt;|&amp;lt;override&amp;gt;|format=[plain|para]}}&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function alias_names_get (frame)&lt;br /&gt;
	local alias_src = cfg.aliases;												-- get master list of aliases&lt;br /&gt;
	local id_src = cfg.id_handlers;												-- get master list of identifiers&lt;br /&gt;
	local args = getArgs (frame);&lt;br /&gt;
	&lt;br /&gt;
	local meta = args[1];&lt;br /&gt;
	local override = args[2];&lt;br /&gt;
&lt;br /&gt;
	local out = {};&lt;br /&gt;
	local source;																-- selected parameter or id aliases list&lt;br /&gt;
	local aliases;&lt;br /&gt;
&lt;br /&gt;
	source = alias_src[meta] or (id_src[meta] and id_src[meta].parameters);&lt;br /&gt;
	if not source then&lt;br /&gt;
		if meta:match (&amp;#039;%u+access&amp;#039;) then&lt;br /&gt;
			return &amp;#039;no&amp;#039; == args.none and &amp;#039;&amp;#039; or &amp;#039;none&amp;#039;;							-- custom access parameters don&amp;#039;t have aliases&lt;br /&gt;
		else&lt;br /&gt;
			return &amp;#039;&amp;#039;;															-- no such meta&lt;br /&gt;
		end&lt;br /&gt;
	elseif not source[2] then													-- id_source[meta] is always a table; if no second member, no aliases&lt;br /&gt;
		return &amp;#039;no&amp;#039; == args.none and &amp;#039;&amp;#039; or &amp;#039;none&amp;#039;;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if not override then&lt;br /&gt;
		aliases = source;														-- normal skip-canonical param case&lt;br /&gt;
	else&lt;br /&gt;
		local flag = &amp;#039;all&amp;#039; == override and true or nil;							-- so that we know that &amp;lt;override&amp;gt; parameter is a valid alias; spoof when override == &amp;#039;all&amp;#039;&lt;br /&gt;
		aliases = {[1] = &amp;#039;&amp;#039;};													-- spoof to push alias_src[meta][1] and id_src[meta][1] into aliases[2]&lt;br /&gt;
		for _, v in ipairs (source) do											-- here when override is set; spin through the aliases to make sure override matches alias in table&lt;br /&gt;
			if v ~= override then&lt;br /&gt;
				table.insert (aliases, v);										-- add all but overridden param to the the aliases list for this use case&lt;br /&gt;
			else&lt;br /&gt;
				flag = true;													-- set the flag so we know that &amp;lt;override&amp;gt; is a valid alias&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		if not flag then&lt;br /&gt;
			aliases = {}														-- unset the table as error indicator&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if &amp;#039;table&amp;#039; == type (aliases) then											-- table only when there are aliases&lt;br /&gt;
		for i, alias in ipairs (aliases) do&lt;br /&gt;
			if 1 ~= i then														-- aliases[1] is the canonical name; don&amp;#039;t include it&lt;br /&gt;
				if &amp;#039;plain&amp;#039; == args.format then									-- format and return the output&lt;br /&gt;
					table.insert (out, alias);									-- plain text&lt;br /&gt;
				elseif &amp;#039;para&amp;#039; == args.format then&lt;br /&gt;
					table.insert (out, string.format (&amp;#039;&amp;lt;code class=&amp;quot;nowrap&amp;quot;&amp;gt;|%s=&amp;lt;/code&amp;gt;&amp;#039;, alias));	-- same as {{para|&amp;lt;param&amp;gt;}}&lt;br /&gt;
				else&lt;br /&gt;
					table.insert (out, string.format (&amp;quot;&amp;#039;&amp;#039;&amp;#039;%s&amp;#039;&amp;#039;&amp;#039;&amp;quot;, alias));		-- because csdoc bolds param names&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		return table.concat (out, &amp;#039;, &amp;#039;);										-- make pretty list and quit&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return &amp;#039;no&amp;#039; == args.none and &amp;#039;&amp;#039; or &amp;#039;none&amp;#039;;									-- no metaparameter with that name or no aliases&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S _ B O O K _ C I T E _ T E M P L A T E &amp;gt;------------------------------------&lt;br /&gt;
&lt;br /&gt;
fetch the title of the current page; if it is a preprint template, return true; empty string else&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local book_cite_templates = {&lt;br /&gt;
	[&amp;#039;citation&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;cite book&amp;#039;] = true,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
local function is_book_cite_template ()&lt;br /&gt;
	local title = mw.title.getCurrentTitle().rootText;							-- get title of current page without namespace and without sub-pages; from Template:Cite book/new -&amp;gt; Cite book&lt;br /&gt;
	&lt;br /&gt;
	title = title and title:lower() or &amp;#039;&amp;#039;;&lt;br /&gt;
	return book_cite_templates[title] or &amp;#039;&amp;#039;;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S _ L I M I T E D _ P A R A M _ T E M P L A T E &amp;gt;----------------------------&lt;br /&gt;
&lt;br /&gt;
fetch the title of the current page; if it is a preprint template, return true; empty string else&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local limited_param_templates = {												-- if ever there is a need to fetch info from ~/Whitelist then&lt;br /&gt;
	[&amp;#039;cite arxiv&amp;#039;] = true,														-- this list could also be fetched from there&lt;br /&gt;
	[&amp;#039;cite biorxiv&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;citeseerx&amp;#039;] = true,&lt;br /&gt;
	[&amp;#039;ssrn&amp;#039;] = true,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
local function is_limited_param_template ()&lt;br /&gt;
	local title = mw.title.getCurrentTitle().rootText;							-- get title of current page without namespace and without sub-pages; from Template:Cite book/new -&amp;gt; Cite book&lt;br /&gt;
	&lt;br /&gt;
	title = title and title:lower() or &amp;#039;&amp;#039;;&lt;br /&gt;
	return limited_param_templates[title] or &amp;#039;&amp;#039;;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; H E A D E R _ M A K E &amp;gt;--------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
makes a section header from &amp;lt;header_text&amp;gt; and &amp;lt;level&amp;gt;; &amp;lt;level&amp;gt; defaults to 2; cannot be less than 2&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function _header_make (args)&lt;br /&gt;
	if not args[1] then&lt;br /&gt;
		return &amp;#039;&amp;#039;;																-- no header text&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local level = args[2] and tonumber (args[2]) or 2;&lt;br /&gt;
	&lt;br /&gt;
	level = string.rep (&amp;#039;=&amp;#039;, level);&lt;br /&gt;
	return level .. args[1] .. level;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; H E A D E R _ M A K E &amp;gt;--------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Entry from an {{#invoke:}}&lt;br /&gt;
makes a section header from &amp;lt;header_text&amp;gt; and &amp;lt;level&amp;gt;; &amp;lt;level&amp;gt; defaults to 2; cannot be less than 2&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function header_make (frame)&lt;br /&gt;
	local args = getArgs (frame);&lt;br /&gt;
	return _header_make (args);&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I D _ L I M I T S _ G E T &amp;gt;----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
return the limit values for named identifier parameters that have &amp;lt;id&amp;gt; limits (pmc, pmid, ssrn, s2cid); the return&lt;br /&gt;
value used in template documentation and error message help-text&lt;br /&gt;
&lt;br /&gt;
{{#invoke:Cs1 documentation support|id_limits_get|&amp;lt;id&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function id_limits_get (frame)&lt;br /&gt;
	local args = getArgs (frame);&lt;br /&gt;
	local handlers = cfg.id_handlers;											-- get id_handlers {} table from ~/Configuration&lt;br /&gt;
&lt;br /&gt;
	return args[1] and handlers[args[1]:upper()].id_limit or &amp;#039;&amp;#039;;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; C A T _ L I N K _ M A K E &amp;gt;----------------------------------------------------&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function cat_link_make (cat)&lt;br /&gt;
	return table.concat ({&amp;#039;[[:Category:&amp;#039;, cat, &amp;#039;]]&amp;#039;});&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; C S 1 _ C A T _ L I S T E R &amp;gt;--------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
This is a crude tool that reads the category names from Module:Citation/CS1/Configuration, makes links of them,&lt;br /&gt;
and then lists them in sorted lists.  A couple of parameters control the rendering of the output:&lt;br /&gt;
	|select=	-- (required) takes one of three values: error, maint, prop&lt;br /&gt;
	|sandbox=	-- takes one value: no&lt;br /&gt;
	|hdr-lvl=	-- base header level (number of == that make a header); default:2 min:2&lt;br /&gt;
&lt;br /&gt;
This tool will automatically attempt to load a sandbox version of ~/Configuration if one exists.&lt;br /&gt;
Setting |sandbox=no will defeat this.&lt;br /&gt;
&lt;br /&gt;
{{#invoke:cs1 documentation support|cat_lister|select=&amp;lt;error|maint|prop&amp;gt;|sandbox=&amp;lt;no&amp;gt;}}&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function cat_lister (frame)&lt;br /&gt;
	local args = getArgs (frame);&lt;br /&gt;
&lt;br /&gt;
	local list_live_cats = {};													-- list of live categories&lt;br /&gt;
	local list_sbox_cats = {};													-- list of sandbox categories&lt;br /&gt;
	&lt;br /&gt;
	local live_sbox_out = {}													-- list of categories that are common to live and sandbox modules&lt;br /&gt;
	local live_not_in_sbox_out = {}												-- list of categories in live but not sandbox&lt;br /&gt;
	local sbox_not_in_live_out = {}												-- list of categories in sandbox but not live&lt;br /&gt;
	&lt;br /&gt;
	local out = {};																-- final output assembled here&lt;br /&gt;
	&lt;br /&gt;
	local sandbox;																-- boolean; true: evaluate the sandbox module&lt;br /&gt;
	local hdr_lvl;																-- &lt;br /&gt;
	&lt;br /&gt;
	local sb_cfg;&lt;br /&gt;
	local sandbox, sb_cfg = pcall (mw.loadData, &amp;#039;Module:Citation/CS1/Configuration/sandbox&amp;#039;);	-- get sandbox configuration&lt;br /&gt;
&lt;br /&gt;
	local cat;&lt;br /&gt;
&lt;br /&gt;
	local select = args.select;&lt;br /&gt;
	if &amp;#039;no&amp;#039; == args.sandbox then												-- list sandbox?&lt;br /&gt;
		sandbox = false;														-- no, live only&lt;br /&gt;
	end&lt;br /&gt;
	if hdr_lvl then																-- if set and&lt;br /&gt;
		if tonumber (hdr_lvl) then												-- can be converted to number&lt;br /&gt;
			if 2 &amp;gt; tonumber (hdr_lvl) then										-- min is 2&lt;br /&gt;
				hdr_lvl = 2;													-- so set to min&lt;br /&gt;
			end&lt;br /&gt;
		else																	-- can&amp;#039;t be converted&lt;br /&gt;
			hdr_lvl = 2;														-- so default to min&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		hdr_lvl = 2;															-- not set so default to min&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if &amp;#039;error&amp;#039; == select or &amp;#039;maint&amp;#039; == select then								-- error and main categorys handling different from poperties cats&lt;br /&gt;
		for _, t in pairs (cfg.error_conditions) do								-- get the live module&amp;#039;s categories&lt;br /&gt;
			if (&amp;#039;error&amp;#039; == select and t.message) or (&amp;#039;maint&amp;#039; == select and not t.message) then&lt;br /&gt;
				cat = t.category:gsub (&amp;#039;|(.*)$&amp;#039;, &amp;#039;&amp;#039;);							-- strip sort key if any&lt;br /&gt;
				list_live_cats[cat] = 1;										-- add to the list&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
		if sandbox then															-- if ~/sandbox module exists and |sandbox= not set to &amp;#039;no&amp;#039;&lt;br /&gt;
			for _, t in pairs (sb_cfg.error_conditions) do						-- get the sandbox module&amp;#039;s categories&lt;br /&gt;
				if (&amp;#039;error&amp;#039; == select and t.message) or (&amp;#039;maint&amp;#039; == select and not t.message) then&lt;br /&gt;
					cat = t.category:gsub (&amp;#039;|(.*)$&amp;#039;, &amp;#039;&amp;#039;);						-- strip sort key if any&lt;br /&gt;
					list_sbox_cats[cat] = 1;									-- add to the list&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		&lt;br /&gt;
	elseif &amp;#039;prop&amp;#039; == select then												-- prop cats&lt;br /&gt;
		for _, cat in pairs (cfg.prop_cats) do									-- get the live module&amp;#039;s categories&lt;br /&gt;
			cat = cat:gsub (&amp;#039;|(.*)$&amp;#039;, &amp;#039;&amp;#039;);										-- strip sort key if any&lt;br /&gt;
			list_live_cats[cat] = 1;											-- add to the list&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if sandbox then															-- if ~/sandbox module exists and |sandbox= not set to &amp;#039;no&amp;#039;&lt;br /&gt;
			for _, cat in pairs (sb_cfg.prop_cats) do							-- get the live module&amp;#039;s categories&lt;br /&gt;
				cat = cat:gsub (&amp;#039;|(.*)$&amp;#039;, &amp;#039;&amp;#039;);									-- strip sort key if any&lt;br /&gt;
				list_sbox_cats[cat] = 1;										-- add to the list&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;&amp;lt;span style=\&amp;quot;font-size:100%; font-style:normal;\&amp;quot; class=\&amp;quot;error\&amp;quot;&amp;gt;error: unknown selector: &amp;#039; .. select .. &amp;#039;&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	end	&lt;br /&gt;
&lt;br /&gt;
	for k, _ in pairs (list_live_cats) do										-- separate live/sbox common cats from cats not in sbox&lt;br /&gt;
		if not list_sbox_cats[k] and sandbox then&lt;br /&gt;
			table.insert (live_not_in_sbox_out, cat_link_make (k));				-- in live but not in sbox&lt;br /&gt;
		else&lt;br /&gt;
			table.insert (live_sbox_out, cat_link_make (k));					-- in both live and sbox&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	for k, _ in pairs (list_sbox_cats) do										-- separate sbox/live common cats from cats not in live&lt;br /&gt;
		if not list_live_cats[k] then&lt;br /&gt;
			table.insert (sbox_not_in_live_out, cat_link_make (k));				-- in sbox but not in live&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local function comp (a, b)													-- local function for case-agnostic category name sorting&lt;br /&gt;
		return a:lower() &amp;lt; b:lower();&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local header;																-- initialize section header with name of selected category list&lt;br /&gt;
	if &amp;#039;error&amp;#039; == select then&lt;br /&gt;
		header = &amp;#039;error&amp;#039;;&lt;br /&gt;
	elseif &amp;#039;maint&amp;#039; == select then&lt;br /&gt;
		header = &amp;#039;maintenance&amp;#039;;&lt;br /&gt;
	else&lt;br /&gt;
		header = &amp;#039;properties&amp;#039;;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	header = table.concat ({													-- build the main header&lt;br /&gt;
		&amp;#039;Live &amp;#039;,																-- always include this&lt;br /&gt;
		((sandbox and &amp;#039;and sandbox &amp;#039;) or &amp;#039;&amp;#039;),									-- if sandbox evaluated, mention that&lt;br /&gt;
		header,																	-- add the list name&lt;br /&gt;
		&amp;#039; categories (&amp;#039;,														-- finish the name and add&lt;br /&gt;
		#live_sbox_out,															-- count of categories listed&lt;br /&gt;
		&amp;#039;)&amp;#039;																		-- close&lt;br /&gt;
	})&lt;br /&gt;
&lt;br /&gt;
	header = table.concat ({													-- make a useable header&lt;br /&gt;
		_header_make ({header, hdr_lvl}),&lt;br /&gt;
		&amp;#039;\n&amp;lt;div class=&amp;quot;div-col columns column-width&amp;quot; style=&amp;quot;column-width:30em&amp;quot;&amp;gt;&amp;#039;	-- opening &amp;lt;div&amp;gt; for columns&lt;br /&gt;
		});&lt;br /&gt;
&lt;br /&gt;
	table.sort (live_sbox_out, comp);											-- sort case agnostic acsending&lt;br /&gt;
	table.insert (live_sbox_out, 1, header);									-- insert the header at the top&lt;br /&gt;
	table.insert (out, table.concat (live_sbox_out, &amp;#039;\n*&amp;#039;));					-- make a big string of unordered list markup&lt;br /&gt;
	table.insert (out, &amp;#039;&amp;lt;/div&amp;gt;\n&amp;#039;);												-- close the &amp;lt;/div&amp;gt; and add new line so the next header works&lt;br /&gt;
&lt;br /&gt;
	if 0 ~= #live_not_in_sbox_out then											-- when there is something in the table&lt;br /&gt;
		header = table.concat ({												-- build header for subsection&lt;br /&gt;
			&amp;#039;In live but not in sandbox (&amp;#039;,&lt;br /&gt;
			#live_not_in_sbox_out,&lt;br /&gt;
			&amp;#039;)&amp;#039;&lt;br /&gt;
			});&lt;br /&gt;
	&lt;br /&gt;
		header = table.concat ({												-- make a useable header&lt;br /&gt;
			_header_make ({header, hdr_lvl+1}),&lt;br /&gt;
			&amp;#039;\n&amp;lt;div class=&amp;quot;div-col columns column-width&amp;quot; style=&amp;quot;column-width:30em&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
			});&lt;br /&gt;
	&lt;br /&gt;
		table.sort (live_not_in_sbox_out, comp);&lt;br /&gt;
		table.insert (live_not_in_sbox_out, 1, header);&lt;br /&gt;
		table.insert (out, table.concat (live_not_in_sbox_out, &amp;#039;\n*&amp;#039;));&lt;br /&gt;
		table.insert (out, &amp;#039;&amp;lt;/div&amp;gt;\n&amp;#039;);&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if 0 ~= #sbox_not_in_live_out then											-- when there is something in the table&lt;br /&gt;
		header = table.concat ({												-- build header for subsection&lt;br /&gt;
			&amp;#039;In sandbox but not in live (&amp;#039;,&lt;br /&gt;
			#sbox_not_in_live_out,&lt;br /&gt;
			&amp;#039;)&amp;#039;&lt;br /&gt;
			});&lt;br /&gt;
	&lt;br /&gt;
		header = table.concat ({												-- make a useable header&lt;br /&gt;
			_header_make ({header, hdr_lvl+1}),&lt;br /&gt;
			&amp;#039;\n&amp;lt;div class=&amp;quot;div-col columns column-width&amp;quot; style=&amp;quot;column-width:30em&amp;quot;&amp;gt;&amp;#039;&lt;br /&gt;
			});&lt;br /&gt;
	&lt;br /&gt;
		table.sort (sbox_not_in_live_out, comp);&lt;br /&gt;
		table.insert (sbox_not_in_live_out, 1, header);&lt;br /&gt;
		table.insert (out, table.concat (sbox_not_in_live_out, &amp;#039;\n*&amp;#039;));&lt;br /&gt;
		table.insert (out, &amp;#039;&amp;lt;/div&amp;gt;\n&amp;#039;);&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return table.concat (out);													-- concat into a huge string 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   F U N C T I O N S &amp;gt;------------------------------------------&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
return {&lt;br /&gt;
	alias_lister = alias_lister,&lt;br /&gt;
	alias_names_get = alias_names_get,&lt;br /&gt;
	canonical_param_lister = canonical_param_lister,&lt;br /&gt;
	canonical_name_get = canonical_name_get,&lt;br /&gt;
	cat_lister = cat_lister,&lt;br /&gt;
	header_make = header_make,&lt;br /&gt;
	id_limits_get = id_limits_get,&lt;br /&gt;
	is_book_cite_template = is_book_cite_template,&lt;br /&gt;
	is_limited_param_template = is_limited_param_template,&lt;br /&gt;
	lang_lister = lang_lister,&lt;br /&gt;
	script_lang_lister = script_lang_lister,&lt;br /&gt;
	};&lt;/div&gt;</summary>
		<author><name>wikipedia&gt;Trappist the monk</name></author>
	</entry>
</feed>