<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://www.wikiw.cn/index.php?action=history&amp;feed=atom&amp;title=%E6%A8%A1%E5%9D%97%3ACitation%2FCS1%2FPeople</id>
	<title>模块:Citation/CS1/People - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://www.wikiw.cn/index.php?action=history&amp;feed=atom&amp;title=%E6%A8%A1%E5%9D%97%3ACitation%2FCS1%2FPeople"/>
	<link rel="alternate" type="text/html" href="https://www.wikiw.cn/index.php?title=%E6%A8%A1%E5%9D%97:Citation/CS1/People&amp;action=history"/>
	<updated>2026-04-08T20:31:12Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.44.0</generator>
	<entry>
		<id>https://www.wikiw.cn/index.php?title=%E6%A8%A1%E5%9D%97:Citation/CS1/People&amp;diff=2056&amp;oldid=prev</id>
		<title>imported&gt;Antigng：​已保护“Module:Citation/CS1/People”：​高风险模块（[编辑=仅允许管理员]（无限期）[移动=仅允许管理员]（无限期））</title>
		<link rel="alternate" type="text/html" href="https://www.wikiw.cn/index.php?title=%E6%A8%A1%E5%9D%97:Citation/CS1/People&amp;diff=2056&amp;oldid=prev"/>
		<updated>2022-04-26T16:37:18Z</updated>

		<summary type="html">&lt;p&gt;已保护“&lt;a href=&quot;/index.php?title=%E6%A8%A1%E5%9D%97:Citation/CS1/People&quot; title=&quot;模块:Citation/CS1/People&quot;&gt;Module:Citation/CS1/People&lt;/a&gt;”：​&lt;a href=&quot;/index.php?title=WP:HRT&amp;amp;action=edit&amp;amp;redlink=1&quot; class=&quot;new&quot; title=&quot;WP:HRT（页面不存在）&quot;&gt;高风险模块&lt;/a&gt;（[编辑=仅允许管理员]（无限期）[移动=仅允许管理员]（无限期））&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&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;
local cfg;&lt;br /&gt;
local in_array, is_set;&lt;br /&gt;
local append_error, add_maint_cat, select_one;&lt;br /&gt;
local make_internal_link;&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; A D D _ V A N C _ E R R O R &amp;gt;----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Adds a single Vancouver system error message to the template&amp;#039;s output regardless of how many error actually exist.&lt;br /&gt;
To prevent duplication, added_vanc_errs is nil until an error message is emitted.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local added_vanc_errs = false;															-- flag so we only emit one Vancouver error / category&lt;br /&gt;
local function add_vanc_error ()&lt;br /&gt;
	if not added_vanc_errs then&lt;br /&gt;
		added_vanc_errs = true;													-- note that we&amp;#039;ve added this category&lt;br /&gt;
		append_error( &amp;#039;vancouver&amp;#039;, {});&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; I S _ G O O D _ V A N C _ N A M E &amp;gt;--------------------------------------------&lt;br /&gt;
&lt;br /&gt;
For Vancouver Style, author/editor names are supposed to be rendered in Latin (read ASCII) characters.  When a name&lt;br /&gt;
uses characters that contain diacritical marks, those characters are to converted to the corresponding Latin character.&lt;br /&gt;
When a name is written using a non-Latin alphabet or logogram, that name is to be transliterated into Latin characters.&lt;br /&gt;
These things are not currently possible in this module so are left to the editor to do.&lt;br /&gt;
&lt;br /&gt;
This test allows |first= and |last= names to contain any of the letters defined in the four Unicode Latin character sets&lt;br /&gt;
	[http://www.unicode.org/charts/PDF/U0000.pdf C0 Controls and Basic Latin] 0041–005A, 0061–007A&lt;br /&gt;
	[http://www.unicode.org/charts/PDF/U0080.pdf C1 Controls and Latin-1 Supplement] 00C0–00D6, 00D8–00F6, 00F8–00FF&lt;br /&gt;
	[http://www.unicode.org/charts/PDF/U0100.pdf Latin Extended-A] 0100–017F&lt;br /&gt;
	[http://www.unicode.org/charts/PDF/U0180.pdf Latin Extended-B] 0180–01BF, 01C4–024F&lt;br /&gt;
&lt;br /&gt;
|lastn= also allowed to contain hyphens, spaces, and apostrophes. (http://www.ncbi.nlm.nih.gov/books/NBK7271/box/A35029/)&lt;br /&gt;
|firstn= also allowed to contain hyphens, spaces, apostrophes, and periods&lt;br /&gt;
&lt;br /&gt;
At the time of this writing, I had to write the &amp;#039;if nil == mw.ustring.find ...&amp;#039; test ouside of the code editor and paste it here&lt;br /&gt;
because the code editor gets confused between character insertion point and cursor position.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function is_good_vanc_name (last, first)&lt;br /&gt;
	if nil == mw.ustring.find (last, &amp;quot;^[A-Za-zÀ-ÖØ-öø-ƿǄ-ɏ%-%s%&amp;#039;]*$&amp;quot;) or nil == mw.ustring.find (first, &amp;quot;^[A-Za-zÀ-ÖØ-öø-ƿǄ-ɏ%-%s%&amp;#039;%.]*$&amp;quot;) then&lt;br /&gt;
		add_vanc_error ();&lt;br /&gt;
		return false;															-- not a string of latin characters; Vancouver required Romanization&lt;br /&gt;
	end;&lt;br /&gt;
	return true;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; R E D U C E _ T O _ I N I T I A L S &amp;gt;------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Attempts to convert names to initials in support of |name-list-format=vanc.  &lt;br /&gt;
&lt;br /&gt;
Names in |firstn= may be separated by spaces or hyphens, or for initials, a period. See http://www.ncbi.nlm.nih.gov/books/NBK7271/box/A35062/.&lt;br /&gt;
&lt;br /&gt;
Vancouver style requires family rank designations (Jr, II, III, etc) to be rendered as Jr, 2nd, 3rd, etc.  This form is not&lt;br /&gt;
currently supported by this code so correctly formed names like Smith JL 2nd are converted to Smith J2. See http://www.ncbi.nlm.nih.gov/books/NBK7271/box/A35085/.&lt;br /&gt;
&lt;br /&gt;
This function uses ustring functions because firstname initials may be any of the unicode Latin characters accepted by is_good_vanc_name ().&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function reduce_to_initials(first)&lt;br /&gt;
	if mw.ustring.match(first, &amp;quot;^%u%u$&amp;quot;) then return first end;					-- when first contains just two upper-case letters, nothing to do&lt;br /&gt;
	local initials = {}&lt;br /&gt;
	local i = 0;																-- counter for number of initials&lt;br /&gt;
	for word in mw.ustring.gmatch(first, &amp;quot;[^%s%.%-]+&amp;quot;) do						-- names separated by spaces, hyphens, or periods&lt;br /&gt;
		table.insert(initials, mw.ustring.sub(word,1,1))						-- Vancouver format does not include full stops.&lt;br /&gt;
		i = i + 1;																-- bump the counter &lt;br /&gt;
		if 2 &amp;lt;= i then break; end												-- only two initials allowed in Vancouver system; if 2, quit&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(initials)												-- Vancouver format does not include spaces.&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; L I S T  _ P E O P L E &amp;gt;-------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Formats a list of people (e.g. authors / editors) &lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function list_people(control, people, etal, list_name)					-- TODO: why is list_name here?  not used in this function&lt;br /&gt;
	local sep;&lt;br /&gt;
	local namesep;&lt;br /&gt;
	local format = control.format&lt;br /&gt;
	local maximum = control.maximum&lt;br /&gt;
	local lastauthoramp = control.lastauthoramp;&lt;br /&gt;
	local text = {}&lt;br /&gt;
&lt;br /&gt;
	if &amp;#039;vanc&amp;#039; == format then													-- Vancouver-like author/editor name styling?&lt;br /&gt;
		sep = &amp;#039;,&amp;#039;;																-- name-list separator between authors is a comma&lt;br /&gt;
		namesep = &amp;#039; &amp;#039;;															-- last/first separator is a space&lt;br /&gt;
	else&lt;br /&gt;
		sep = &amp;#039;;&amp;#039;																-- name-list separator between authors is a semicolon&lt;br /&gt;
		namesep = &amp;#039;, &amp;#039;															-- last/first separator is &amp;lt;comma&amp;gt;&amp;lt;space&amp;gt;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if sep:sub(-1,-1) ~= &amp;quot; &amp;quot; then sep = sep .. &amp;quot; &amp;quot; end&lt;br /&gt;
	if is_set (maximum) and maximum &amp;lt; 1 then return &amp;quot;&amp;quot;, 0; end					-- returned 0 is for EditorCount; not used for authors&lt;br /&gt;
	&lt;br /&gt;
	for i,person in ipairs(people) do&lt;br /&gt;
		if is_set(person.last) then&lt;br /&gt;
			local mask = person.mask&lt;br /&gt;
			local one&lt;br /&gt;
			local sep_one = sep;&lt;br /&gt;
			if is_set (maximum) and i &amp;gt; maximum then&lt;br /&gt;
				etal = true;&lt;br /&gt;
				break;&lt;br /&gt;
			elseif (mask ~= nil) then&lt;br /&gt;
				local n = tonumber(mask)&lt;br /&gt;
				if (n ~= nil) then&lt;br /&gt;
					one = string.rep(&amp;quot;&amp;amp;mdash;&amp;quot;,n)&lt;br /&gt;
				else&lt;br /&gt;
					one = mask;&lt;br /&gt;
					sep_one = &amp;quot; &amp;quot;;&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				one = person.last&lt;br /&gt;
				local first = person.first&lt;br /&gt;
				if is_set(first) then &lt;br /&gt;
					if ( &amp;quot;vanc&amp;quot; == format ) then								-- if vancouver format&lt;br /&gt;
						one = one:gsub (&amp;#039;%.&amp;#039;, &amp;#039;&amp;#039;);								-- remove periods from surnames (http://www.ncbi.nlm.nih.gov/books/NBK7271/box/A35029/)&lt;br /&gt;
						if not person.corporate and is_good_vanc_name (one, first) then					-- and name is all Latin characters; corporate authors not tested&lt;br /&gt;
							first = reduce_to_initials(first)					-- attempt to convert first name(s) to initials&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					one = one .. namesep .. first &lt;br /&gt;
				end&lt;br /&gt;
				if is_set(person.link) and person.link ~= control.page_name then&lt;br /&gt;
					one = make_internal_link(person.link, one, person.origin);	-- link author/editor if this page is not the author&amp;#039;s/editor&amp;#039;s page&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			table.insert( text, one )&lt;br /&gt;
			table.insert( text, sep_one )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local count = #text / 2;													-- (number of names + number of separators) divided by 2&lt;br /&gt;
	if count &amp;gt; 0 then &lt;br /&gt;
		if count &amp;gt; 1 and is_set(lastauthoramp) and not etal then&lt;br /&gt;
			text[#text-2] = &amp;quot; &amp;amp; &amp;quot;;												-- replace last separator with ampersand text&lt;br /&gt;
		end&lt;br /&gt;
		text[#text] = nil;														-- erase the last separator&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local result = table.concat(text)											-- construct list&lt;br /&gt;
	if etal and is_set (result) then											-- etal may be set by |display-authors=etal but we might not have a last-first list&lt;br /&gt;
		result = result .. sep .. &amp;#039; &amp;#039; .. cfg.messages[&amp;#039;et al&amp;#039;];					-- we&amp;#039;ve go a last-first list and etal so add et al.&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return result, count&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; G E T _ D I S P L A Y _ A U T H O R S _ E D I T O R S &amp;gt;------------------------&lt;br /&gt;
&lt;br /&gt;
Returns a number that may or may not limit the length of the author or editor name lists.&lt;br /&gt;
&lt;br /&gt;
When the value assigned to |display-authors= is a number greater than or equal to zero, return the number and&lt;br /&gt;
the previous state of the &amp;#039;etal&amp;#039; flag (false by default but may have been set to true if the name list contains&lt;br /&gt;
some variant of the text &amp;#039;et al.&amp;#039;).&lt;br /&gt;
&lt;br /&gt;
When the value assigned to |display-authors= is the keyword &amp;#039;etal&amp;#039;, return a number that is one greater than the&lt;br /&gt;
number of authors in the list and set the &amp;#039;etal&amp;#039; flag true.  This will cause the list_people() to display all of&lt;br /&gt;
the names in the name list followed by &amp;#039;et al.&amp;#039;&lt;br /&gt;
&lt;br /&gt;
In all other cases, returns nil and the previous state of the &amp;#039;etal&amp;#039; flag.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function get_display_authors_editors (max, count, list_name, etal)&lt;br /&gt;
	if is_set (max) then&lt;br /&gt;
		if &amp;#039;etal&amp;#039; == max:lower():gsub(&amp;quot;[ &amp;#039;%.]&amp;quot;, &amp;#039;&amp;#039;) then						-- the :gsub() portion makes &amp;#039;etal&amp;#039; from a variety of &amp;#039;et al.&amp;#039; spellings and stylings&lt;br /&gt;
			max = count + 1;													-- number of authors + 1 so display all author name plus et al.&lt;br /&gt;
			etal = true;														-- overrides value set by extract_names()&lt;br /&gt;
		elseif max:match (&amp;#039;^%d+$&amp;#039;) then											-- if is a string of numbers&lt;br /&gt;
			max = tonumber (max);												-- make it a number&lt;br /&gt;
			if max &amp;gt;= count and &amp;#039;authors&amp;#039; == list_name then	-- AUTHORS ONLY		-- if |display-xxxxors= value greater than or equal to number of authors/editors&lt;br /&gt;
				add_maint_cat (&amp;#039;disp_auth_ed&amp;#039;, list_name);&lt;br /&gt;
			end&lt;br /&gt;
		else																	-- not a valid keyword or number&lt;br /&gt;
			append_error( &amp;#039;invalid_param_val&amp;#039;, {&amp;#039;display-&amp;#039; .. list_name, max});		&lt;br /&gt;
																				-- add error message&lt;br /&gt;
			max = nil;															-- unset&lt;br /&gt;
		end&lt;br /&gt;
	elseif &amp;#039;authors&amp;#039; == list_name then		-- AUTHORS ONLY	need to clear implicit et al category&lt;br /&gt;
		max = count + 1;														-- number of authors + 1&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return max, etal;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; N A M E _ H A S _ E T A L &amp;gt;----------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
Evaluates the content of author and editor name parameters for variations on the theme of et al.  If found,&lt;br /&gt;
the et al. is removed, a flag is set to true and the function returns the modified name and the flag.&lt;br /&gt;
&lt;br /&gt;
This function never sets the flag to false but returns it&amp;#039;s previous state because it may have been set by&lt;br /&gt;
previous passes through this function or by the parameters |display-authors=etal or |display-editors=etal&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function name_has_etal (name, etal, nocat)&lt;br /&gt;
&lt;br /&gt;
	if is_set (name) then														-- name can be nil in which case just return&lt;br /&gt;
		local etal_pattern = &amp;quot;[;,]? *[\&amp;quot;&amp;#039;]*%f[%a][Ee][Tt] *[Aa][Ll][%.\&amp;quot;&amp;#039;]*$&amp;quot;	-- variations on the &amp;#039;et al&amp;#039; theme&lt;br /&gt;
		local others_pattern = &amp;quot;[;,]? *%f[%a]and [Oo]thers&amp;quot;;					-- and alternate to et al.&lt;br /&gt;
		&lt;br /&gt;
		if name:match (etal_pattern) then										-- variants on et al.&lt;br /&gt;
			name = name:gsub (etal_pattern, &amp;#039;&amp;#039;);								-- if found, remove&lt;br /&gt;
			etal = true;														-- set flag (may have been set previously here or by |display-authors=etal)&lt;br /&gt;
			if not nocat then													-- no categorization for |vauthors=&lt;br /&gt;
				add_maint_cat (&amp;#039;etal&amp;#039;);											-- and add a category if not already added&lt;br /&gt;
			end&lt;br /&gt;
		elseif name:match (others_pattern) then									-- if not &amp;#039;et al.&amp;#039;, then &amp;#039;and others&amp;#039;?&lt;br /&gt;
			name = name:gsub (others_pattern, &amp;#039;&amp;#039;);								-- if found, remove&lt;br /&gt;
			etal = true;														-- set flag (may have been set previously here or by |display-authors=etal)&lt;br /&gt;
			if not nocat then													-- no categorization for |vauthors=&lt;br /&gt;
				add_maint_cat (&amp;#039;etal&amp;#039;);											-- and add a category if not already added&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return name, etal;															-- &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; E X T R A C T _ N A M E S &amp;gt;----------------------------------------------------&lt;br /&gt;
Gets name list from the input arguments&lt;br /&gt;
&lt;br /&gt;
Searches through args in sequential order to find |lastn= and |firstn= parameters (or their aliases), and their matching link and mask parameters.&lt;br /&gt;
Stops searching when both |lastn= and |firstn= are not found in args after two sequential attempts: found |last1=, |last2=, and |last3= but doesn&amp;#039;t&lt;br /&gt;
find |last4= and |last5= then the search is done.&lt;br /&gt;
&lt;br /&gt;
This function emits an error message when there is a |firstn= without a matching |lastn=.  When there are &amp;#039;holes&amp;#039; in the list of last names, |last1= and |last3=&lt;br /&gt;
are present but |last2= is missing, an error message is emitted. |lastn= is not required to have a matching |firstn=.&lt;br /&gt;
&lt;br /&gt;
When an author or editor parameter contains some form of &amp;#039;et al.&amp;#039;, the &amp;#039;et al.&amp;#039; is stripped from the parameter and a flag (etal) returned&lt;br /&gt;
that will cause list_people() to add the static &amp;#039;et al.&amp;#039; text from Module:Citation/CS1/Configuration.  This keeps &amp;#039;et al.&amp;#039; out of the &lt;br /&gt;
template&amp;#039;s metadata.  When this occurs, the page is added to a maintenance category.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function extract_names(args, list_name)&lt;br /&gt;
	local names = {};			-- table of names&lt;br /&gt;
	local last;					-- individual name components&lt;br /&gt;
	local first;&lt;br /&gt;
	local link;&lt;br /&gt;
	local mask;&lt;br /&gt;
	local i = 1;				-- loop counter/indexer&lt;br /&gt;
	local n = 1;				-- output table indexer&lt;br /&gt;
	local count = 0;			-- used to count the number of times we haven&amp;#039;t found a |last= (or alias for authors, |editor-last or alias for editors)&lt;br /&gt;
	local etal=false;			-- return value set to true when we find some form of et al. in an author parameter&lt;br /&gt;
&lt;br /&gt;
	local err_msg_list_name = list_name:match (&amp;quot;(%w+)List&amp;quot;) .. &amp;#039;s list&amp;#039;;		-- modify AuthorList or EditorList for use in error messages if necessary&lt;br /&gt;
	while true do&lt;br /&gt;
		last = select_one( args, cfg.aliases[list_name .. &amp;#039;-Last&amp;#039;], &amp;#039;redundant_parameters&amp;#039;, i );		-- search through args for name components beginning at 1&lt;br /&gt;
		first = select_one( args, cfg.aliases[list_name .. &amp;#039;-First&amp;#039;], &amp;#039;redundant_parameters&amp;#039;, i );&lt;br /&gt;
		link = select_one( args, cfg.aliases[list_name .. &amp;#039;-Link&amp;#039;], &amp;#039;redundant_parameters&amp;#039;, i );&lt;br /&gt;
		mask = select_one( args, cfg.aliases[list_name .. &amp;#039;-Mask&amp;#039;], &amp;#039;redundant_parameters&amp;#039;, i );&lt;br /&gt;
&lt;br /&gt;
		last, etal = name_has_etal (last, etal, false);								-- find and remove variations on et al.&lt;br /&gt;
		first, etal = name_has_etal (first, etal, false);								-- find and remove variations on et al.&lt;br /&gt;
&lt;br /&gt;
		if first and not last then												-- if there is a firstn without a matching lastn&lt;br /&gt;
			append_error( &amp;#039;first_missing_last&amp;#039;, {err_msg_list_name, i});		-- add this error message&lt;br /&gt;
		elseif not first and not last then										-- if both firstn and lastn aren&amp;#039;t found, are we done?&lt;br /&gt;
			count = count + 1;													-- number of times we haven&amp;#039;t found last and first&lt;br /&gt;
			if 2 &amp;lt;= count then													-- two missing names and we give up&lt;br /&gt;
				break;															-- normal exit or there is a two-name hole in the list; can&amp;#039;t tell which&lt;br /&gt;
			end&lt;br /&gt;
		else																	-- we have last with or without a first&lt;br /&gt;
			names[n] = {&lt;br /&gt;
				last = last, &lt;br /&gt;
				first = first, &lt;br /&gt;
				link = link, &lt;br /&gt;
				mask = mask, &lt;br /&gt;
				origin = list_name:match (&amp;quot;(%w+)List&amp;quot;):lower() .. &amp;#039;-link&amp;#039; .. i,&lt;br /&gt;
				corporate=false&lt;br /&gt;
			};																	-- add this name to our names list (corporate for |vauthors= only)&lt;br /&gt;
			n = n + 1;															-- point to next location in the names table&lt;br /&gt;
			if 1 == count then													-- if the previous name was missing&lt;br /&gt;
				append_error( &amp;#039;missing_name&amp;#039;, {err_msg_list_name, i-1});		-- add this error message&lt;br /&gt;
			end&lt;br /&gt;
			count = 0;															-- reset the counter, we&amp;#039;re looking for two consecutive missing names&lt;br /&gt;
		end&lt;br /&gt;
		i = i + 1;																-- point to next args location&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return names, etal;															-- all done, return our list of names&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; P A R S E _ V A U T H O R S _ V E D I T O R S &amp;gt;--------------------------------&lt;br /&gt;
&lt;br /&gt;
This function extracts author / editor names from |vauthors= or |veditors= and finds matching |xxxxor-maskn= and&lt;br /&gt;
|xxxxor-linkn= in args.  It then returns a table of assembled names just as extract_names() does.&lt;br /&gt;
&lt;br /&gt;
Author / editor names in |vauthors= or |veditors= must be in Vancouver system style. Corporate or institutional names&lt;br /&gt;
may sometimes be required and because such names will often fail the is_good_vanc_name() and other format compliance&lt;br /&gt;
tests, are wrapped in doubled paranethese ((corporate name)) to suppress the format tests.&lt;br /&gt;
&lt;br /&gt;
This function sets the vancouver error when a reqired comma is missing and when there is a space between an author&amp;#039;s initials.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function parse_vauthors_veditors (args, vparam, list_name)&lt;br /&gt;
	local names = {};															-- table of names assembled from |vauthors=, |author-maskn=, |author-linkn=&lt;br /&gt;
	local v_name_table = {};&lt;br /&gt;
	local etal = false;															-- return value set to true when we find some form of et al. vauthors parameter&lt;br /&gt;
	local last, first, link, mask;&lt;br /&gt;
	local corporate = false;&lt;br /&gt;
&lt;br /&gt;
	vparam, etal = name_has_etal (vparam, etal, true);							-- find and remove variations on et al. do not categorize (do it here because et al. might have a period)&lt;br /&gt;
	if vparam:find (&amp;#039;%[%[&amp;#039;) or vparam:find (&amp;#039;%]%]&amp;#039;)	then						-- no wikilinking vauthors names&lt;br /&gt;
		add_vanc_error ();&lt;br /&gt;
	end&lt;br /&gt;
	v_name_table = mw.text.split(vparam, &amp;quot;%s*,%s*&amp;quot;)								-- names are separated by commas&lt;br /&gt;
&lt;br /&gt;
	for i, v_name in ipairs(v_name_table) do&lt;br /&gt;
		if v_name:match (&amp;#039;^%(%(.+%)%)$&amp;#039;) then									-- corporate authors are wrapped in doubled parenthese to supress vanc formatting and error detection&lt;br /&gt;
			first = &amp;#039;&amp;#039;;															-- set to empty string for concatenation and because it may have been set for previous author/editor&lt;br /&gt;
			last = v_name:match (&amp;#039;^%(%((.+)%)%)$&amp;#039;)&lt;br /&gt;
			corporate = true;&lt;br /&gt;
		elseif string.find(v_name, &amp;quot;%s&amp;quot;) then&lt;br /&gt;
		    lastfirstTable = {}&lt;br /&gt;
		    lastfirstTable = mw.text.split(v_name, &amp;quot;%s&amp;quot;)&lt;br /&gt;
		    first = table.remove(lastfirstTable);								-- removes and returns value of last element in table which should be author intials&lt;br /&gt;
		    last  = table.concat(lastfirstTable, &amp;quot; &amp;quot;)							-- returns a string that is the concatenation of all other names that are not initials&lt;br /&gt;
		    if mw.ustring.match (last, &amp;#039;%a+%s+%u+%s+%a+&amp;#039;) or mw.ustring.match (v_name, &amp;#039; %u %u$&amp;#039;) then&lt;br /&gt;
				add_vanc_error ();												-- matches last II last; the case when a comma is missing or a space between two intiials&lt;br /&gt;
			end&lt;br /&gt;
		else&lt;br /&gt;
			first = &amp;#039;&amp;#039;;															-- set to empty string for concatenation and because it may have been set for previous author/editor&lt;br /&gt;
			last = v_name;														-- last name or single corporate name?  Doesn&amp;#039;t support multiword corporate names? do we need this?&lt;br /&gt;
		end&lt;br /&gt;
																&lt;br /&gt;
		if is_set (first) and not mw.ustring.match (first, &amp;quot;^%u?%u$&amp;quot;) then		-- first shall contain one or two upper-case letters, nothing else&lt;br /&gt;
			add_vanc_error ();&lt;br /&gt;
		end&lt;br /&gt;
																				-- this from extract_names ()&lt;br /&gt;
		link = select_one( args, cfg.aliases[list_name .. &amp;#039;-Link&amp;#039;], &amp;#039;redundant_parameters&amp;#039;, i );&lt;br /&gt;
		mask = select_one( args, cfg.aliases[list_name .. &amp;#039;-Mask&amp;#039;], &amp;#039;redundant_parameters&amp;#039;, i );&lt;br /&gt;
		names[i] = {last = last, first = first, link = link, mask = mask, corporate=corporate};		-- add this assembled name to our names list&lt;br /&gt;
	end&lt;br /&gt;
	return names, etal;															-- all done, return our list of names&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; S E L E C T _ A U T H O R S _ E D I T O R S _ F R O M _  S O U R C E &amp;gt;------------------&lt;br /&gt;
&lt;br /&gt;
Select one of |authors=, |authorn= / |lastn / firstn=, or |vauthors= as the source of the author name list or&lt;br /&gt;
select one of |editors=, |editorn= / editor-lastn= / |editor-firstn= or |veditors= as the source of the editor name list.&lt;br /&gt;
&lt;br /&gt;
Only one of these appropriate three will be used.  The hierarchy is: |authorn= (and aliases) highest and |authors= lowest and&lt;br /&gt;
similarly, |editorn= (and aliases) highest and |editors= lowest&lt;br /&gt;
&lt;br /&gt;
When looking for |authorn= / |editorn= parameters, test |xxxxor1= and |xxxxor2= (and all of their aliases); stops after the second&lt;br /&gt;
test which mimicks the test used in extract_names() when looking for a hole in the author name list.  There may be a better&lt;br /&gt;
way to do this, I just haven&amp;#039;t discovered what that way is.&lt;br /&gt;
&lt;br /&gt;
Emits an error message when more than one xxxxor name source is provided.&lt;br /&gt;
&lt;br /&gt;
In this function, vxxxxors = vauthors or veditors; xxxxors = authors or editors as appropriate.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function select_authors_editors_from_source (vxxxxors, xxxxors, args, list_name, vparam, name_list_format)&lt;br /&gt;
	local lastfirst = false;&lt;br /&gt;
	if select_one( args, cfg.aliases[list_name .. &amp;#039;-Last&amp;#039;], &amp;#039;none&amp;#039;, 1 ) or		-- do this twice incase we have a first 1 without a last1&lt;br /&gt;
		select_one( args, cfg.aliases[list_name .. &amp;#039;-Last&amp;#039;], &amp;#039;none&amp;#039;, 2 ) then&lt;br /&gt;
			lastfirst = true;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if ( is_set ( vxxxxors ) and true == lastfirst ) or								-- these are the three error conditions&lt;br /&gt;
		( is_set ( vxxxxors ) and is_set ( xxxxors ) ) or&lt;br /&gt;
		( lastfirst and is_set ( xxxxors ) ) then&lt;br /&gt;
			local err_name;&lt;br /&gt;
			if &amp;#039;AuthorList&amp;#039; == list_name then									-- figure out which name should be used in error message&lt;br /&gt;
				err_name = &amp;#039;author&amp;#039;;&lt;br /&gt;
			else&lt;br /&gt;
				err_name = &amp;#039;editor&amp;#039;;&lt;br /&gt;
			end&lt;br /&gt;
			append_error( &amp;#039;redundant_parameters&amp;#039;, {err_name .. &amp;#039;-name-list parameters&amp;#039;});				&lt;br /&gt;
																				-- add error message&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local x, xxxxor_etal;&lt;br /&gt;
	if not lastfirst then&lt;br /&gt;
		if is_set ( vxxxxors ) then&lt;br /&gt;
			x, xxxxor_etal = parse_vauthors_veditors ( args, vparam, list_name );&lt;br /&gt;
																				-- fetch author list from |vxxxxor=, |xxxxor-linkn=, and |xxxxor-maskn=&lt;br /&gt;
			return x, xxxxor_etal, nil , &amp;#039;vanc&amp;#039;;&lt;br /&gt;
		elseif is_set ( xxxxors ) then&lt;br /&gt;
			return {}, nil, xxxxors, name_list_format;							-- use content of |xxxxor=&lt;br /&gt;
		end&lt;br /&gt;
	end;&lt;br /&gt;
	x, xxxxor_etal = extract_names ( args, list_name );							-- fetch xxxxor list from |xxxxorn= / |lastn= / |firstn=, |xxxxor-linkn=, and |xxxxor-maskn=, or&lt;br /&gt;
	return x, xxxxor_etal, nil, name_list_format;								-- no xxxxors at all; this allows missing xxxxor name test to run in case there is a first without last &lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function get_people (handle, para, args, page_name)&lt;br /&gt;
&lt;br /&gt;
	local author_etal;&lt;br /&gt;
	local a	= {};																-- authors list from |lastn= / |firstn= pairs or |vauthors=&lt;br /&gt;
	local Authors;&lt;br /&gt;
	&lt;br /&gt;
	local NameListFormat = para.namelistformat;&lt;br /&gt;
	&lt;br /&gt;
	a, author_etal, Authors, NameListFormat = select_authors_editors_from_source(&lt;br /&gt;
		handle.vauthors, &lt;br /&gt;
		handle.authors, &lt;br /&gt;
		args, &lt;br /&gt;
		&amp;#039;AuthorList&amp;#039;, &lt;br /&gt;
		args.vauthors, &lt;br /&gt;
		NameListFormat&lt;br /&gt;
		);&lt;br /&gt;
&lt;br /&gt;
	local Coauthors = handle.coauthors;&lt;br /&gt;
&lt;br /&gt;
	local editor_etal;&lt;br /&gt;
	local e	= {};																-- editors list from |editor-lastn= / |editor-firstn= pairs or |veditors=&lt;br /&gt;
	local Editors;&lt;br /&gt;
	e, editor_etal, Editors, NameListFormat = select_authors_editors_from_source(&lt;br /&gt;
		handle.veditors, &lt;br /&gt;
		handle.editors, &lt;br /&gt;
		args, &lt;br /&gt;
		&amp;#039;EditorList&amp;#039;, &lt;br /&gt;
		args.veditors, &lt;br /&gt;
		NameListFormat&lt;br /&gt;
		);&lt;br /&gt;
&lt;br /&gt;
	local t = {};																-- translators list from |translator-lastn= / translator-firstn= pairs&lt;br /&gt;
	local Translators;															-- assembled translators name list&lt;br /&gt;
	t = extract_names (args, &amp;#039;TranslatorList&amp;#039;);									-- fetch translator list from |translatorn= / |translator-lastn=, -firstn=, -linkn=, -maskn=&lt;br /&gt;
	&lt;br /&gt;
	local c = {};																-- contributors list from |contributor-lastn= / contributor-firstn= pairs&lt;br /&gt;
	local Contributors;															-- assembled contributors name list&lt;br /&gt;
	local Contribution = handle.contribution;&lt;br /&gt;
	if para.contributorsvalid then&lt;br /&gt;
		c = extract_names (args, &amp;#039;ContributorList&amp;#039;);							-- fetch contributor list from |contributorn= / |contributor-lastn=, -firstn=, -linkn=, -maskn=&lt;br /&gt;
		&lt;br /&gt;
		if 0 &amp;lt; #c then&lt;br /&gt;
			if not is_set (Contribution) then									-- |contributor= requires |contribution=&lt;br /&gt;
				append_error( &amp;#039;contributor_missing_required_param&amp;#039;, {&amp;#039;contribution&amp;#039;});&lt;br /&gt;
																				-- add missing contribution error message&lt;br /&gt;
				c = {};															-- blank the contributors&amp;#039; table; it is used as a flag later&lt;br /&gt;
			end&lt;br /&gt;
			if 0 == #a then														-- |contributor= requires |author=&lt;br /&gt;
				append_error( &amp;#039;contributor_missing_required_param&amp;#039;, {&amp;#039;author&amp;#039;});-- add missing author error message&lt;br /&gt;
				c = {};															-- blank the contributors&amp;#039; table; it is used as a flag later&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	else																		-- if not a book cite&lt;br /&gt;
		if select_one (args, cfg.aliases[&amp;#039;ContributorList-Last&amp;#039;], &amp;#039;redundant_parameters&amp;#039;, 1 ) then	-- are there contributor name list parameters?&lt;br /&gt;
			append_error( &amp;#039;contributor_ignored&amp;#039;, {});							-- add contributor ignored error message&lt;br /&gt;
		end&lt;br /&gt;
		Contribution = nil;														-- unset&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local LastAuthorAmp = para.lastauthoramp;&lt;br /&gt;
	if (in_array (NameListFormat, {&amp;#039;&amp;amp;&amp;#039;, &amp;#039;amp&amp;#039;})) then&lt;br /&gt;
		LastAuthorAmp = &amp;#039;yes&amp;#039;;													-- override |lastauthoramp = if |name-list-format = is set to &amp;#039;&amp;amp;&amp;#039; or &amp;#039;amp&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local EditorCount;															-- used only for choosing {ed.) or (eds.) annotation at end of editor name-list&lt;br /&gt;
	do&lt;br /&gt;
		local last_first_list;&lt;br /&gt;
		local maximum;&lt;br /&gt;
		local control = { &lt;br /&gt;
			format = NameListFormat,											-- empty string, &amp;#039;vanc&amp;#039;, or &amp;#039;amp&amp;#039;&lt;br /&gt;
			maximum = nil,														-- as if display-authors or display-editors not set&lt;br /&gt;
			lastauthoramp = LastAuthorAmp,&lt;br /&gt;
			page_name = page_name											-- get current page name so that we don&amp;#039;t wikilink to it via editorlinkn&lt;br /&gt;
		};&lt;br /&gt;
&lt;br /&gt;
		do																		-- do editor name list first because coauthors can modify control table&lt;br /&gt;
			maximum , editor_etal = get_display_authors_editors (para.displayeditors, #e, &amp;#039;editors&amp;#039;, editor_etal);&lt;br /&gt;
			--[[ Preserve old-style implicit et al.&lt;br /&gt;
			临时修复&amp;quot;Category:含有旧式缩略标签的引用的页面 in editors&amp;quot;的问题，中文版目前与英文版逻辑不一样，暂时不需要这个分类。等以后更新时再看怎么处理 --2017.6.23 shizhao&lt;br /&gt;
			&lt;br /&gt;
			if not is_set(maximum) and #e == 4 then &lt;br /&gt;
				maximum = 3;&lt;br /&gt;
				append_error(&amp;#039;implict_etal_editor&amp;#039;, {});&lt;br /&gt;
			end&lt;br /&gt;
			]]&lt;br /&gt;
&lt;br /&gt;
			control.maximum = maximum;&lt;br /&gt;
			&lt;br /&gt;
			last_first_list, EditorCount = list_people(control, e, editor_etal, &amp;#039;editor&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
			if is_set (Editors) then&lt;br /&gt;
				if editor_etal then&lt;br /&gt;
					Editors = Editors .. &amp;#039; &amp;#039; .. cfg.messages[&amp;#039;et al&amp;#039;];			-- add et al. to editors parameter beause |display-editors=etal&lt;br /&gt;
					EditorCount = 2;											-- with et al., |editors= is multiple names; spoof to display (eds.) annotation&lt;br /&gt;
				else&lt;br /&gt;
					EditorCount = 2;											-- we don&amp;#039;t know but assume |editors= is multiple names; spoof to display (eds.) annotation&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				Editors = last_first_list;										-- either an author name list or an empty string&lt;br /&gt;
			end&lt;br /&gt;
&lt;br /&gt;
			if 1 == EditorCount and (true == editor_etal or 1 &amp;lt; #e) then		-- only one editor displayed but includes etal then &lt;br /&gt;
				EditorCount = 2;												-- spoof to display (eds.) annotation&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		do																		-- now do translators&lt;br /&gt;
			control.maximum = #t;												-- number of translators&lt;br /&gt;
			Translators = list_people(control, t, false, &amp;#039;translator&amp;#039;);			-- et al not currently supported&lt;br /&gt;
		end&lt;br /&gt;
		do																		-- now do contributors&lt;br /&gt;
			control.maximum = #c;												-- number of contributors&lt;br /&gt;
			Contributors = list_people(control, c, false, &amp;#039;contributor&amp;#039;);		-- et al not currently supported&lt;br /&gt;
		end&lt;br /&gt;
		do																		-- now do authors&lt;br /&gt;
			control.maximum , author_etal = get_display_authors_editors (para.displayauthors, #a, &amp;#039;authors&amp;#039;, author_etal);&lt;br /&gt;
&lt;br /&gt;
			if is_set(Coauthors) then											-- if the coauthor field is also used, prevent ampersand and et al. formatting.&lt;br /&gt;
				para.lastauthoramp = nil;&lt;br /&gt;
				control.maximum = #a + 1;&lt;br /&gt;
			end&lt;br /&gt;
			&lt;br /&gt;
			last_first_list = list_people(control, a, author_etal, &amp;#039;author&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
			if is_set (Authors) then&lt;br /&gt;
				Authors, author_etal = name_has_etal (Authors, author_etal, false);	-- find and remove variations on et al.&lt;br /&gt;
				if author_etal then&lt;br /&gt;
					Authors = Authors .. &amp;#039; &amp;#039; .. cfg.messages[&amp;#039;et al&amp;#039;];			-- add et al. to authors parameter&lt;br /&gt;
				end&lt;br /&gt;
			else&lt;br /&gt;
				Authors = last_first_list;										-- either an author name list or an empty string&lt;br /&gt;
			end&lt;br /&gt;
		end																		-- end of do&lt;br /&gt;
		&lt;br /&gt;
		if is_set(Authors) then&lt;br /&gt;
			if is_set(Coauthors) then&lt;br /&gt;
				if &amp;#039;vanc&amp;#039; == NameListFormat then								-- separate authors and coauthors with proper name-list-separator&lt;br /&gt;
					Authors = Authors .. &amp;#039;, &amp;#039; .. Coauthors;&lt;br /&gt;
				else&lt;br /&gt;
					Authors = Authors .. &amp;#039;; &amp;#039; .. Coauthors;&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		elseif is_set(Coauthors) then											-- coauthors aren&amp;#039;t displayed if one of authors=, authorn=, or lastn= isn&amp;#039;t specified&lt;br /&gt;
			append_error(&amp;#039;coauthors_missing_author&amp;#039;, {});						-- emit error message&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local multiple_editors = EditorCount &amp;gt;1;&lt;br /&gt;
	&lt;br /&gt;
	local has_contributors = false;&lt;br /&gt;
	local NameList = {};														-- holds selected contributor, author, editor name list&lt;br /&gt;
	&lt;br /&gt;
	if #c &amp;gt; 0 then																-- if there is a contributor list&lt;br /&gt;
		NameList = c;															-- select it&lt;br /&gt;
		has_contributor = true;&lt;br /&gt;
	elseif #a &amp;gt; 0 then															-- or an author list&lt;br /&gt;
		NameList = a;&lt;br /&gt;
	elseif #e &amp;gt; 0 then															-- or an editor list&lt;br /&gt;
		NameList = e;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return Authors, Contributors, Editors, Translators, Contribution, NameList, multiple_editors, has_contributors;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; T E R M I N A T E _ N A M E _ L I S T &amp;gt;----------------------------------------&lt;br /&gt;
&lt;br /&gt;
This function terminates a name list (author, contributor, editor) with a separator character (sepc) and a space&lt;br /&gt;
when the last character is not a sepc character or when the last three characters are not sepc followed by two&lt;br /&gt;
closing square brackets (close of a wikilink).  When either of these is true, the name_list is terminated with a&lt;br /&gt;
single space character.&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
local function terminate_name_list (name_list, sepc)&lt;br /&gt;
	if (string.sub (name_list,-1,-1) == sepc) or (string.sub (name_list,-3,-1) == sepc .. &amp;#039;]]&amp;#039;) then	-- if last name in list ends with sepc char&lt;br /&gt;
		return name_list .. &amp;quot; &amp;quot;;												-- don&amp;#039;t add another&lt;br /&gt;
	else&lt;br /&gt;
		return name_list .. sepc .. &amp;#039; &amp;#039;;										-- otherwise terninate the name list&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[--------------------------&amp;lt; F O R M A T _ P E O P L E &amp;gt;------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
local function format_people (Authors, Editors, Contributors, multiple_editors, use_in, sepc)&lt;br /&gt;
	if is_set (Authors) then&lt;br /&gt;
		Authors = terminate_name_list (Authors, sepc);							-- when no date, terminate with 0 or 1 sepc and a space&lt;br /&gt;
		if is_set (Editors) then&lt;br /&gt;
			local in_text = &amp;quot; &amp;quot;;&lt;br /&gt;
			local post_text = &amp;quot;&amp;quot;;&lt;br /&gt;
			if use_in then&lt;br /&gt;
				in_text = in_text .. &amp;quot; &amp;quot; .. cfg.messages[&amp;#039;in&amp;#039;];&lt;br /&gt;
				if (sepc ~= &amp;#039;.&amp;#039;) then in_text = in_text:lower() end				-- lowercase for cs2&lt;br /&gt;
			else&lt;br /&gt;
				if multiple_editors then&lt;br /&gt;
					post_text = &amp;quot;, &amp;quot; .. cfg.messages[&amp;#039;editors&amp;#039;];&lt;br /&gt;
				else&lt;br /&gt;
					post_text = &amp;quot;, &amp;quot; .. cfg.messages[&amp;#039;editor&amp;#039;];&lt;br /&gt;
				end&lt;br /&gt;
			end &lt;br /&gt;
			Editors = terminate_name_list (Editors .. in_text .. post_text, sepc);	&lt;br /&gt;
																				-- terminate with 0 or 1 sepc and a space&lt;br /&gt;
		end&lt;br /&gt;
		if is_set (Contributors) then											-- book cite and we&amp;#039;re citing the intro, preface, etc&lt;br /&gt;
			local by_text = sepc .. &amp;#039; &amp;#039; .. cfg.messages[&amp;#039;by&amp;#039;] .. &amp;#039; &amp;#039;;&lt;br /&gt;
			if (sepc ~= &amp;#039;.&amp;#039;) then by_text = by_text:lower() end					-- lowercase for cs2&lt;br /&gt;
			Authors = by_text .. Authors;										-- author follows title so tweak it here&lt;br /&gt;
			if is_set (Editors) then											-- when Editors make sure that Authors gets terminated&lt;br /&gt;
				Authors = terminate_name_list (Authors, sepc);					-- terminate with 0 or 1 sepc and a space&lt;br /&gt;
			end&lt;br /&gt;
			Contributors = terminate_name_list (Contributors, sepc);			-- terminate with 0 or 1 sepc and a space&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		if is_set (Editors) then&lt;br /&gt;
			if multiple_editors then&lt;br /&gt;
				Editors = Editors .. &amp;quot; (&amp;quot; .. cfg.messages[&amp;#039;editors&amp;#039;] .. &amp;quot;)&amp;quot; .. sepc .. &amp;quot; &amp;quot;&lt;br /&gt;
			else&lt;br /&gt;
				Editors = Editors .. &amp;quot; (&amp;quot; .. cfg.messages[&amp;#039;editor&amp;#039;] .. &amp;quot;)&amp;quot; .. sepc .. &amp;quot; &amp;quot;&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return Authors, Editors, Contributors;&lt;br /&gt;
end&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, utilities_page_ptr, error_page_ptr, links_page_ptr)&lt;br /&gt;
	cfg = cfg_table_ptr;&lt;br /&gt;
	&lt;br /&gt;
	is_set = utilities_page_ptr.is_set;&lt;br /&gt;
	in_array = utilities_page_ptr.in_array;&lt;br /&gt;
	&lt;br /&gt;
	add_maint_cat = error_page_ptr.add_maint_cat;&lt;br /&gt;
	append_error = error_page_ptr.append_error;&lt;br /&gt;
	select_one = error_page_ptr.select_one;&lt;br /&gt;
	&lt;br /&gt;
	make_internal_link = links_page_ptr.make_internal_link;&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;
	get_people = get_people,&lt;br /&gt;
	format_people = format_people,&lt;br /&gt;
	&lt;br /&gt;
	set_selected_modules = set_selected_modules&lt;br /&gt;
	}&lt;/div&gt;</summary>
		<author><name>imported&gt;Antigng</name></author>
	</entry>
</feed>