<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FPeter_coxhead%2FTests</id>
	<title>Module:Sandbox/Peter coxhead/Tests - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ASandbox%2FPeter_coxhead%2FTests"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Peter_coxhead/Tests&amp;action=history"/>
	<updated>2026-05-26T19:22:34Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.5</generator>
	<entry>
		<id>https://stockhub.co/index.php?title=Module:Sandbox/Peter_coxhead/Tests&amp;diff=145977&amp;oldid=prev</id>
		<title>imported&gt;Legoktm: Replace Module:No globals with require( &quot;strict&quot; )</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Sandbox/Peter_coxhead/Tests&amp;diff=145977&amp;oldid=prev"/>
		<updated>2022-10-23T21:11:46Z</updated>

		<summary type="html">&lt;p&gt;Replace &lt;a href=&quot;/research/Module:No_globals&quot; title=&quot;Module:No globals&quot;&gt;Module:No globals&lt;/a&gt; with require( &amp;quot;strict&amp;quot; )&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;require(&amp;#039;strict&amp;#039;)&lt;br /&gt;
local TaxonItalics = require(&amp;#039;Module:TaxonItalics&amp;#039;)&lt;br /&gt;
local ItalicTitle = require(&amp;#039;Module:Italic title&amp;#039;)&lt;br /&gt;
local p = {}&lt;br /&gt;
local l = {} -- separate out local functions&lt;br /&gt;
&lt;br /&gt;
function l.show(items)&lt;br /&gt;
	local result = &amp;quot;&amp;quot;&lt;br /&gt;
	for i = 1,#items,1 do&lt;br /&gt;
		result = result .. &amp;quot;|&amp;quot; .. items[i] .. &amp;quot;&amp;lt;sub&amp;gt;&amp;quot; .. mw.ustring.len(items[i]) .. &amp;quot;&amp;lt;/sub&amp;gt;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	return result .. &amp;quot;|&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- *****************************************************************************&lt;br /&gt;
-- ========= Constants for states =========&lt;br /&gt;
local startState = 0&lt;br /&gt;
local italState = 1&lt;br /&gt;
local whiteSpState = 2&lt;br /&gt;
local nonItalState = 3&lt;br /&gt;
local entityState = 4&lt;br /&gt;
local endState = 9&lt;br /&gt;
&lt;br /&gt;
-- Split a string representing a taxon name into &amp;#039;units&amp;#039;.&lt;br /&gt;
function l.doSplitTaxonName(str)&lt;br /&gt;
	-- connecting terms that are not italicized&lt;br /&gt;
	local cTerms = {&lt;br /&gt;
		--subsp.&lt;br /&gt;
		subspecies = &amp;quot;subsp.&amp;quot;,&lt;br /&gt;
		[&amp;quot;subsp.&amp;quot;] = &amp;quot;subsp.&amp;quot;,&lt;br /&gt;
		subsp = &amp;quot;subsp.&amp;quot;,&lt;br /&gt;
    	[&amp;quot;ssp.&amp;quot;] = &amp;quot;subsp.&amp;quot;,&lt;br /&gt;
    	ssp = &amp;quot;subsp.&amp;quot;,&lt;br /&gt;
    	--var.&lt;br /&gt;
    	varietas = &amp;quot;var.&amp;quot;,&lt;br /&gt;
    	[&amp;quot;var.&amp;quot;] = &amp;quot;var.&amp;quot;,&lt;br /&gt;
    	var = &amp;quot;var.&amp;quot;,&lt;br /&gt;
    	--subvar.&lt;br /&gt;
    	subvarietas = &amp;quot;subvar.&amp;quot;,&lt;br /&gt;
    	[&amp;quot;subvar.&amp;quot;] = &amp;quot;subvar.&amp;quot;,&lt;br /&gt;
    	subvar = &amp;quot;subvar.&amp;quot;,&lt;br /&gt;
    	--f.&lt;br /&gt;
    	forma = &amp;quot;f.&amp;quot;,&lt;br /&gt;
    	[&amp;quot;f.&amp;quot;] = &amp;quot;f.&amp;quot;,&lt;br /&gt;
    	f = &amp;quot;f.&amp;quot;,&lt;br /&gt;
    	--subf.&lt;br /&gt;
    	subforma = &amp;quot;subf.&amp;quot;,&lt;br /&gt;
    	[&amp;quot;subf.&amp;quot;] = &amp;quot;subf.&amp;quot;,&lt;br /&gt;
    	subf = &amp;quot;subf.&amp;quot;,&lt;br /&gt;
		--subg.&lt;br /&gt;
    	subgenus = &amp;quot;subg.&amp;quot;,&lt;br /&gt;
    	[&amp;quot;subg.&amp;quot;] = &amp;quot;subg.&amp;quot;,&lt;br /&gt;
    	subg = &amp;quot;subg.&amp;quot;,&lt;br /&gt;
    	--sect.&lt;br /&gt;
    	section = &amp;quot;sect.&amp;quot;,&lt;br /&gt;
    	[&amp;quot;sect.&amp;quot;] = &amp;quot;sect.&amp;quot;,&lt;br /&gt;
    	sect = &amp;quot;sect.&amp;quot;,&lt;br /&gt;
    	--subsect.&lt;br /&gt;
    	subsection = &amp;quot;subsect.&amp;quot;,&lt;br /&gt;
    	[&amp;quot;subsect.&amp;quot;] = &amp;quot;subsect.&amp;quot;,&lt;br /&gt;
    	subsect = &amp;quot;subsect.&amp;quot;,&lt;br /&gt;
    	--ser.&lt;br /&gt;
    	series = &amp;quot;ser.&amp;quot;,&lt;br /&gt;
    	[&amp;quot;ser.&amp;quot;] = &amp;quot;ser.&amp;quot;,&lt;br /&gt;
    	ser = &amp;quot;ser.&amp;quot;,&lt;br /&gt;
    	--subser.&lt;br /&gt;
    	subseries = &amp;quot;subser.&amp;quot;,&lt;br /&gt;
    	[&amp;quot;subser.&amp;quot;] = &amp;quot;subser.&amp;quot;,&lt;br /&gt;
    	subser = &amp;quot;subser.&amp;quot;,&lt;br /&gt;
    	--cf.&lt;br /&gt;
    	cf = &amp;quot;cf.&amp;quot;,&lt;br /&gt;
    	[&amp;quot;cf.&amp;quot;] = &amp;quot;cf.&amp;quot;,&lt;br /&gt;
    	[&amp;quot;c.f.&amp;quot;] = &amp;quot;cf.&amp;quot;&lt;br /&gt;
    	}&lt;br /&gt;
	local specialChrs = &amp;#039;[%(%)×%+]&amp;#039; -- pattern listing all specially treated characters&lt;br /&gt;
	local units = {}&lt;br /&gt;
	local states = {}&lt;br /&gt;
	local state = startState&lt;br /&gt;
	local j = 0&lt;br /&gt;
	local currUnit = &amp;#039;&amp;#039;&lt;br /&gt;
	local chr&lt;br /&gt;
	-- startUnit starts a new unit to be taken from the string str&lt;br /&gt;
	local startUnit = function (nextState)&lt;br /&gt;
		currUnit = chr&lt;br /&gt;
		state = nextState&lt;br /&gt;
	end&lt;br /&gt;
	-- saveUnit saves the current unit taken from the string str and starts a&lt;br /&gt;
	-- new one&lt;br /&gt;
	local saveUnit = function (nextState)&lt;br /&gt;
			-- check for words that don&amp;#039;t get italicized (?at this position)&lt;br /&gt;
		if state == italState and cTerms[currUnit] then&lt;br /&gt;
			currUnit = cTerms[currUnit]&lt;br /&gt;
			state = nonItalState&lt;br /&gt;
		end&lt;br /&gt;
		j = j + 1&lt;br /&gt;
		units[j] = currUnit&lt;br /&gt;
		states[j] = state&lt;br /&gt;
		currUnit = chr&lt;br /&gt;
		state = nextState&lt;br /&gt;
	end&lt;br /&gt;
	local n = mw.ustring.len(str)&lt;br /&gt;
	local i = 1&lt;br /&gt;
	while i &amp;lt;= n do&lt;br /&gt;
		chr = mw.ustring.sub(str, i, i)&lt;br /&gt;
		if state == startState then&lt;br /&gt;
			if chr == &amp;#039; &amp;#039; then&lt;br /&gt;
				startUnit(whiteSpState)&lt;br /&gt;
			elseif mw.ustring.match(chr, specialChrs) then -- chr == &amp;#039;(&amp;#039; or chr == &amp;#039;)&amp;#039; or chr == &amp;#039;×&amp;#039; or chr == &amp;#039;+&amp;#039; &lt;br /&gt;
				startUnit(nonItalState)&lt;br /&gt;
			elseif chr == &amp;#039;&amp;amp;&amp;#039; then&lt;br /&gt;
				startUnit(entityState)&lt;br /&gt;
			else -- other kind of character&lt;br /&gt;
				startUnit(italState)&lt;br /&gt;
			end&lt;br /&gt;
		elseif state == whiteSpState then&lt;br /&gt;
			if chr == &amp;#039; &amp;#039; then&lt;br /&gt;
				-- ignore&lt;br /&gt;
			elseif mw.ustring.match(chr, specialChrs) then -- chr == &amp;#039;(&amp;#039; or chr == &amp;#039;)&amp;#039; or chr == &amp;#039;×&amp;#039; or chr == &amp;#039;+&amp;#039; &lt;br /&gt;
				saveUnit(nonItalState)&lt;br /&gt;
			elseif chr == &amp;#039;&amp;amp;&amp;#039; then&lt;br /&gt;
				saveUnit(entityState)&lt;br /&gt;
			else -- other kind of character&lt;br /&gt;
				saveUnit(italState)&lt;br /&gt;
			end&lt;br /&gt;
		elseif state == nonItalState then&lt;br /&gt;
			if chr == &amp;#039; &amp;#039; then&lt;br /&gt;
				saveUnit(whiteSpState)&lt;br /&gt;
			elseif mw.ustring.match(chr, specialChrs) then -- chr == &amp;#039;(&amp;#039; or chr == &amp;#039;)&amp;#039; or chr == &amp;#039;×&amp;#039; or chr == &amp;#039;+&amp;#039; &lt;br /&gt;
				saveUnit(nonItalState)&lt;br /&gt;
			elseif chr == &amp;#039;&amp;amp;&amp;#039; then&lt;br /&gt;
				saveUnit(entityState)&lt;br /&gt;
			else -- other kind of character&lt;br /&gt;
				saveUnit(italState)&lt;br /&gt;
			end&lt;br /&gt;
		elseif state == entityState then&lt;br /&gt;
			if chr == &amp;#039;;&amp;#039; then&lt;br /&gt;
				currUnit = currUnit .. chr&lt;br /&gt;
				chr = &amp;#039;&amp;#039;&lt;br /&gt;
				-- nonbreaking spaces are treated a whitespace&lt;br /&gt;
				if currUnit == &amp;#039;&amp;amp;nbsp;&amp;#039; or currUnit == &amp;#039;&amp;amp;#160;&amp;#039; or currUnit == &amp;#039;&amp;amp;#xA0;&amp;#039; or currUnit == &amp;#039;&amp;amp;#x00A0;&amp;#039; then state = whiteSpState end&lt;br /&gt;
				saveUnit(startState)&lt;br /&gt;
			else&lt;br /&gt;
				currUnit = currUnit .. chr&lt;br /&gt;
			end&lt;br /&gt;
		else -- state == italState&lt;br /&gt;
			if chr == &amp;#039; &amp;#039; then&lt;br /&gt;
				saveUnit(whiteSpState)&lt;br /&gt;
			elseif mw.ustring.match(chr, specialChrs) then -- chr == &amp;#039;(&amp;#039; or chr == &amp;#039;)&amp;#039; or chr == &amp;#039;×&amp;#039; or chr == &amp;#039;+&amp;#039; &lt;br /&gt;
				saveUnit(nonItalState)&lt;br /&gt;
			elseif chr == &amp;#039;&amp;amp;&amp;#039; then&lt;br /&gt;
				saveUnit(entityState)&lt;br /&gt;
			else -- other kind of character&lt;br /&gt;
				currUnit = currUnit .. chr&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		i = i + 1&lt;br /&gt;
	end&lt;br /&gt;
	j = j + 1&lt;br /&gt;
	-- save the last unit and its state&lt;br /&gt;
	units[j] = currUnit&lt;br /&gt;
	states[j] = state&lt;br /&gt;
	return units, states&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.italicizeTaxonName(frame)&lt;br /&gt;
    local str = frame.args[1] or &amp;quot;&amp;quot;&lt;br /&gt;
	-- first clean up the name&lt;br /&gt;
    str = mw.ustring.gsub(str, &amp;quot;%s+&amp;quot;, &amp;quot; &amp;quot;)&lt;br /&gt;
    str = mw.ustring.gsub(str, &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
    str = mw.ustring.gsub(str, &amp;quot;&amp;#039;&amp;#039;&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
    str = mw.ustring.gsub(str, &amp;quot;&amp;lt;/?span.-&amp;gt;&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
    -- remove the last &amp;#039;word&amp;#039; if it appears to be a disambiguating term&lt;br /&gt;
    local last = l.lastWord(str)&lt;br /&gt;
    local ln = mw.ustring.len(last)&lt;br /&gt;
    if mw.ustring.match(last, &amp;quot;%([a-z].*%)&amp;quot;) then&lt;br /&gt;
    	str = mw.ustring.sub(str, 1, -ln-1)&lt;br /&gt;
    else&lt;br /&gt;
    	last = &amp;#039;&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
    -- now split up the name into &amp;#039;units&amp;#039;&lt;br /&gt;
    units, states = l.doSplitTaxonName(str)&lt;br /&gt;
    -- finally, put everything back together, correctly italicized&lt;br /&gt;
    return l.joinUnits(units, states) .. last&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function l.joinUnits(units, states)&lt;br /&gt;
    local res = &amp;#039;\n|&amp;#039;&lt;br /&gt;
    local j = 1&lt;br /&gt;
    local n = #units&lt;br /&gt;
    while j &amp;lt;= n do&lt;br /&gt;
    	res = res .. units[j] .. &amp;#039;&amp;lt;sub&amp;gt;&amp;#039; .. tostring(states[j]) .. &amp;#039;&amp;lt;/sub&amp;gt;|&amp;#039;&lt;br /&gt;
    	j = j + 1&lt;br /&gt;
    end&lt;br /&gt;
    res = &amp;#039;\n&amp;#039;&lt;br /&gt;
    states[n+1] = endState&lt;br /&gt;
    states[n+2] = endState&lt;br /&gt;
    local openItalics = true&lt;br /&gt;
    j = 1&lt;br /&gt;
    while j &amp;lt;= n do&lt;br /&gt;
    	-- res = res .. &amp;#039;&amp;lt;sub&amp;gt;&amp;#039; .. tostring(states[j]) .. tostring(italState) .. &amp;#039;&amp;lt;/sub&amp;gt;&amp;#039;&lt;br /&gt;
    	if states[j] == italState then&lt;br /&gt;
    		if openItalics then&lt;br /&gt;
    			res = res .. &amp;quot;&amp;lt;i&amp;gt;&amp;quot; .. units[j]&lt;br /&gt;
    			openItalics = false&lt;br /&gt;
    		else&lt;br /&gt;
    			res = res .. units[j]&lt;br /&gt;
    		end&lt;br /&gt;
    		if not (states[j+1] == whiteSpState and states[j+2] == italState) then&lt;br /&gt;
    			res = res .. &amp;quot;&amp;lt;/i&amp;gt;&amp;quot;&lt;br /&gt;
    			openItalics = true&lt;br /&gt;
    		end&lt;br /&gt;
    	else&lt;br /&gt;
    		res = res .. units[j]&lt;br /&gt;
    	end&lt;br /&gt;
    	j = j + 1&lt;br /&gt;
    end&lt;br /&gt;
    return res&lt;br /&gt;
end&lt;br /&gt;
-- *****************************************************************************&lt;br /&gt;
&lt;br /&gt;
function p.test(frame)&lt;br /&gt;
	local taxon = frame.args[1] or &amp;quot;&amp;quot;&lt;br /&gt;
	local item = frame.args[2] or &amp;quot;&amp;quot;&lt;br /&gt;
	local ok, info = pcall(frame.expandTemplate, frame, { title = &amp;#039;Template:Taxonomy/&amp;#039; .. taxon, args = {[&amp;#039;machine code&amp;#039;] = item } })&lt;br /&gt;
	if ok then&lt;br /&gt;
		return &amp;#039;ok=true; &amp;gt;&amp;#039; .. info .. &amp;#039;&amp;lt;&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		return  &amp;#039;ok=false; &amp;gt;&amp;#039; .. info .. &amp;#039;&amp;lt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.test1(frame)&lt;br /&gt;
	local str = frame.args[1] or &amp;#039;&amp;#039;&lt;br /&gt;
	local pattern =  frame.args[2]  or &amp;quot;%([A-Z].*%)&amp;quot;&lt;br /&gt;
	if mw.ustring.match(str, pattern) then&lt;br /&gt;
		return &amp;#039;matched&amp;#039;&lt;br /&gt;
	else return &amp;#039;not matched&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.test2(frame)&lt;br /&gt;
	local a1 = frame.args[1] or &amp;#039;&amp;#039;&lt;br /&gt;
	local t = {}&lt;br /&gt;
	t[1] = {}&lt;br /&gt;
	t[1].a = a1&lt;br /&gt;
	t[1].e = &amp;#039;Argument 1 = &amp;#039;&lt;br /&gt;
	return t[1].e .. t[1].a&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.test3(frame)&lt;br /&gt;
	local a1 = frame.args[1] or &amp;#039;&amp;#039;&lt;br /&gt;
	local a2 = frame.args[2] or &amp;#039;&amp;#039;&lt;br /&gt;
	local t = mw.text.split( a1, a2, true )&lt;br /&gt;
	res = &amp;#039;&amp;#039;&lt;br /&gt;
	for i = 1, #t do&lt;br /&gt;
		if t[i] == nil then&lt;br /&gt;
			t[i] = &amp;#039;NIL&amp;#039;&lt;br /&gt;
		elseif t[i] == &amp;#039;&amp;#039; then&lt;br /&gt;
			t[i] = &amp;#039;EMPTY&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		res = res .. t[i] .. &amp;#039;&amp;lt;br&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	local tbl = {}&lt;br /&gt;
	tbl[1] = {}&lt;br /&gt;
	tbl[1][9] = &amp;#039;TEST&amp;#039;&lt;br /&gt;
	return res .. &amp;#039;&amp;lt;br&amp;gt;/&amp;#039; .. tbl[1][9].. &amp;#039;&amp;lt;br&amp;gt;/&amp;#039; .. &amp;#039;&amp;lt;br&amp;gt;/&amp;#039; .. table.concat(tbl[1],&amp;#039;,&amp;#039;,9,9)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.test4(frame)&lt;br /&gt;
	local a1 = frame.args[1] or &amp;#039;&amp;#039;&lt;br /&gt;
	local firstCh = mw.ustring.sub(a1,1,1)&lt;br /&gt;
	if firstCh == &amp;#039;[&amp;#039; then firstCh = &amp;#039;*wikilink*&amp;#039; end&lt;br /&gt;
	return &amp;#039;Frame arg1 = &amp;#039;..a1..&amp;#039;, first char = &amp;#039;..firstCh&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.test5(frame)&lt;br /&gt;
	local tab1 = {}&lt;br /&gt;
	local tab2 = {}&lt;br /&gt;
	tab1[1] = &amp;#039;test&amp;#039;&lt;br /&gt;
	tab2[1] = {}&lt;br /&gt;
	tab2[1].k = &amp;#039;test&amp;#039;&lt;br /&gt;
	tab2[1].v = 0&lt;br /&gt;
	return tab1[1]..&amp;#039; &amp;#039;..&amp;#039; &amp;#039;..tab2[1].k..&amp;#039;+&amp;#039;..tab2[1].v&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.existsTest1(frame)&lt;br /&gt;
	local taxon = frame.args[1] or &amp;#039;Life&amp;#039;&lt;br /&gt;
	local res&lt;br /&gt;
	if mw.title.new(&amp;#039;Taxonomy/&amp;#039;..taxon, &amp;#039;Template&amp;#039;).exists then&lt;br /&gt;
		res = &amp;#039;Taxonomy/&amp;#039;..taxon..&amp;#039;exists&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		res = &amp;#039;Taxonomy/&amp;#039;..taxon..&amp;#039;does not exist&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return res&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.existsTest2(frame)&lt;br /&gt;
	local taxon = frame.args[1] or &amp;#039;Life&amp;#039;&lt;br /&gt;
	local template = &amp;#039;Template:Taxonomy/&amp;#039; .. taxon&lt;br /&gt;
	local item = frame.args[2] or &amp;#039;all&amp;#039;&lt;br /&gt;
	local ok, dummy = pcall(frame.expandTemplate, frame, { title = template, args = {[&amp;#039;machine code&amp;#039;] = item } })&lt;br /&gt;
	local res = template&lt;br /&gt;
	if ok then return res .. &amp;#039; exists&amp;#039; else return res .. &amp;#039; does not exist&amp;#039; end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getGenus(frame)&lt;br /&gt;
	local str = frame.args[1] or &amp;#039;&amp;#039;&lt;br /&gt;
	return l.genus(str, 1)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function l.genus(str, init)&lt;br /&gt;
	local res = mw.ustring.match(str, &amp;#039;^[^%s]*&amp;#039;, init)&lt;br /&gt;
	if res == mw.ustring.char(215) then&lt;br /&gt;
		res = res .. &amp;#039; &amp;#039; .. l.genus(str, 3)&lt;br /&gt;
	end&lt;br /&gt;
	return res&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.getLastWord(frame)&lt;br /&gt;
	local str = frame.args[1] or &amp;#039;&amp;#039;&lt;br /&gt;
	return l.lastWord(str)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function l.lastWord(str)&lt;br /&gt;
	local res, n = mw.ustring.gsub(str, &amp;#039;.*%s&amp;#039;, &amp;#039;&amp;#039;, 1)&lt;br /&gt;
	if n == 0 then return str&lt;br /&gt;
	else return res&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.abbreviate(frame)&lt;br /&gt;
	local str = frame.args[1] or &amp;#039;&amp;#039;&lt;br /&gt;
	local res, n = mw.ustring.gsub(str, &amp;#039;([A-Z]).- (.*)&amp;#039;, &amp;#039;%1. %2&amp;#039;)&lt;br /&gt;
	return res .. &amp;#039; (&amp;#039; .. tostring(n) .. &amp;#039; matches)&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.italicTaxonTitle(frame)&lt;br /&gt;
	local pageName = frame.args[1] or &amp;#039;&amp;#039;&lt;br /&gt;
	pageName = frame:expandTemplate{ title = &amp;#039;Taxon italics&amp;#039;, args = {pageName} }&lt;br /&gt;
	return frame:callParserFunction{ name = &amp;#039;DISPLAYTITLE&amp;#039;, args = {pageName} }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.linkCheck(frame)&lt;br /&gt;
	local linkTarget = frame.args[1] or &amp;#039;&amp;#039;&lt;br /&gt;
	local linkText = frame.args[2] or &amp;#039;&amp;#039;&lt;br /&gt;
	local res = true&lt;br /&gt;
	if linkTarget ~= &amp;#039;&amp;#039; and linkText ~= &amp;#039;&amp;#039; and linkTarget ~= linkText then&lt;br /&gt;
		local linkTargetTitle = mw.title.new(linkTarget)&lt;br /&gt;
		local linkTextTitle = mw.title.new(linkText)&lt;br /&gt;
		res = linkTextTitle.redirectTarget == linkTargetTitle&lt;br /&gt;
	end&lt;br /&gt;
	return res&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.parseSpeciesName(frame)&lt;br /&gt;
	local speciesName = frame.args[1] or &amp;#039;&amp;#039;&lt;br /&gt;
	local genus, disambig, species = l.doParseSpeciesName(speciesName)&lt;br /&gt;
	return &amp;#039;genus =&amp;#039;..genus..&amp;#039;, disambig=&amp;#039;..disambig..&amp;#039;, species=&amp;#039;..species&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function l.doParseSpeciesName(speciesName)&lt;br /&gt;
	local genus = &amp;#039;&amp;#039;&lt;br /&gt;
	local disambig = &amp;#039;&amp;#039;&lt;br /&gt;
	local species = &amp;#039;&amp;#039;&lt;br /&gt;
	local words = mw.text.split(speciesName, &amp;quot; &amp;quot;, true)&lt;br /&gt;
	local nWords = #words&lt;br /&gt;
	local currWord = 1&lt;br /&gt;
	if currWord &amp;gt; nWords then return genus, disambig, species end&lt;br /&gt;
	genus = words[currWord]&lt;br /&gt;
	if genus == mw.ustring.char(215) then -- hybrid sign&lt;br /&gt;
		currWord = currWord + 1&lt;br /&gt;
    	if currWord &amp;gt; nWords then return &amp;#039;&amp;#039;, disambig, species end&lt;br /&gt;
		genus = genus .. &amp;#039; &amp;#039; .. words[currWord]&lt;br /&gt;
	end&lt;br /&gt;
	currWord = currWord + 1&lt;br /&gt;
	if currWord &amp;gt; nWords then return genus, disambig, species end&lt;br /&gt;
	local disambig = &amp;#039;&amp;#039;&lt;br /&gt;
	local species = words[currWord]&lt;br /&gt;
	local test = mw.ustring.sub(species,1,1)&lt;br /&gt;
	if mw.ustring.sub(species,1,1) == mw.ustring.char(40) then -- &amp;#039;(&amp;#039;&lt;br /&gt;
		disambig = species&lt;br /&gt;
		currWord = currWord + 1&lt;br /&gt;
		if currWord &amp;gt; nWords then return genus, disambig, &amp;#039;&amp;#039; end&lt;br /&gt;
		species = words[currWord]&lt;br /&gt;
	end&lt;br /&gt;
	if species == mw.ustring.char(215) then -- hybrid sign&lt;br /&gt;
		currWord = currWord + 1&lt;br /&gt;
		if currWord &amp;gt; nWords then return genus, disambig, &amp;#039;&amp;#039; end&lt;br /&gt;
		species = species .. &amp;#039; &amp;#039; .. words[currWord]&lt;br /&gt;
	end&lt;br /&gt;
	return genus, disambig, species&lt;br /&gt;
end&lt;br /&gt;
-- =============================================================================&lt;br /&gt;
function p.infraspeciesboxName(frame)&lt;br /&gt;
	local name = frame.args[1] or &amp;#039;&amp;#039;&lt;br /&gt;
	local genus = frame.args[2] or &amp;#039;&amp;#039;&lt;br /&gt;
	local species = frame.args[3] or &amp;#039;&amp;#039;&lt;br /&gt;
	local ct = frame.args[4] or &amp;#039;&amp;#039;&lt;br /&gt;
    local infraspecies = frame.args[5] or &amp;#039;&amp;#039;&lt;br /&gt;
	local basePageTitle = frame.args[6] or &amp;#039;&amp;#039;&lt;br /&gt;
	local italicTitle = frame.args[7] or &amp;#039;&amp;#039;&lt;br /&gt;
	return l.doinfraspeciesboxName(name, genus, species, ct, infraspecies, basePageTitle, italicTitle)&lt;br /&gt;
end&lt;br /&gt;
	&lt;br /&gt;
function l.doinfraspeciesboxName(name, genus, species, ct, infraspecies, basePageTitle, italicTitle)&lt;br /&gt;
	genus = mw.ustring.gsub(mw.ustring.gsub(genus, &amp;#039;%s+%b()$&amp;#039;, &amp;#039;&amp;#039;, 1), &amp;#039;/.*$&amp;#039;, &amp;#039;&amp;#039;, 1) -- strip any disambig and qualifier&lt;br /&gt;
	local taxon = genus .. &amp;#039; &amp;#039; .. species&lt;br /&gt;
	if ct == &amp;#039;&amp;#039; then taxon = taxon .. &amp;#039; &amp;#039; .. infraspecies&lt;br /&gt;
	else taxon = taxon .. &amp;#039; &amp;#039; .. ct .. &amp;#039; &amp;#039; .. infraspecies&lt;br /&gt;
	end&lt;br /&gt;
	local italicizeP = italicTitle ~= &amp;#039;no&amp;#039; and (basePageTitle == taxon) -- use basePageTitle to match taxon&lt;br /&gt;
	-- deal with taxobox name (i.e. its caption)&lt;br /&gt;
	if name == &amp;#039;&amp;#039; then&lt;br /&gt;
		name = basePageTitle&lt;br /&gt;
		if italicizeP then name = TaxonItalics.italicizeTaxonName(name, false, false) end&lt;br /&gt;
	end&lt;br /&gt;
	-- deal with page title&lt;br /&gt;
	if italicizeP then&lt;br /&gt;
		local pageTitle = mw.title.getCurrentTitle().text -- formatting the page title with DISPLAYTITLE needs the full page title&lt;br /&gt;
		pageTitle  = TaxonItalics.italicizeTaxonName(pageTitle, false, false, true) -- format pageTitle, not italicizing any parenthesized term&lt;br /&gt;
		if italicTitle ~= &amp;#039;test&amp;#039; then &lt;br /&gt;
			mw.getCurrentFrame():callParserFunction(&amp;#039;DISPLAYTITLE&amp;#039;, pageTitle)&lt;br /&gt;
		else&lt;br /&gt;
			name = name .. &amp;#039; \\Italic title\\ &amp;#039; .. pageTitle -- for testing and debugging&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return name&lt;br /&gt;
end&lt;br /&gt;
-- =============================================================================&lt;br /&gt;
&lt;br /&gt;
function p.boldList(frame)&lt;br /&gt;
	local items = {}&lt;br /&gt;
	for i, v in ipairs(frame:getParent().args) do table.insert(items, v)	end&lt;br /&gt;
	local conj = &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot; .. (#items &amp;gt; 2 and &amp;quot;, &amp;quot; or &amp;quot; &amp;quot;) .. (frame.args.conj or &amp;quot;or&amp;quot;) .. &amp;quot; &amp;#039;&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
	return &amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot;..mw.text.listToText(items, &amp;quot;&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;&amp;quot;, conj)..&amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
end &lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;Legoktm</name></author>
	</entry>
</feed>