<?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%3ATaxonbar%2Fsandbox2</id>
	<title>Module:Taxonbar/sandbox2 - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://stockhub.co/index.php?action=history&amp;feed=atom&amp;title=Module%3ATaxonbar%2Fsandbox2"/>
	<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Taxonbar/sandbox2&amp;action=history"/>
	<updated>2026-04-17T01:12:57Z</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:Taxonbar/sandbox2&amp;diff=147175&amp;oldid=prev</id>
		<title>imported&gt;WOSlinker: use require(&#039;strict&#039;) instead of require(&#039;Module:No globals&#039;)</title>
		<link rel="alternate" type="text/html" href="https://stockhub.co/index.php?title=Module:Taxonbar/sandbox2&amp;diff=147175&amp;oldid=prev"/>
		<updated>2022-10-21T10:01:26Z</updated>

		<summary type="html">&lt;p&gt;use require(&amp;#039;strict&amp;#039;) instead of require(&amp;#039;Module:No globals&amp;#039;)&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;
&lt;br /&gt;
local conf = require( &amp;quot;Module:Taxonbar/conf&amp;quot; )&lt;br /&gt;
&lt;br /&gt;
local function getIdsFromWikidata( item, property )&lt;br /&gt;
	local ids = {}&lt;br /&gt;
	if not item.claims[property] then&lt;br /&gt;
		return ids&lt;br /&gt;
	end&lt;br /&gt;
	for _, statement in pairs( item.claims[property] ) do&lt;br /&gt;
		if statement.mainsnak.datavalue then&lt;br /&gt;
			table.insert( ids, statement.mainsnak.datavalue.value )&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return ids&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function getLink( property, val )&lt;br /&gt;
	local link = &amp;quot;&amp;quot;&lt;br /&gt;
	if mw.ustring.find( val, &amp;#039;//&amp;#039; ) then&lt;br /&gt;
		link = val&lt;br /&gt;
	else&lt;br /&gt;
		if type(property) == &amp;#039;number&amp;#039; then&lt;br /&gt;
			local entityObject = mw.wikibase.getEntity(&amp;#039;P&amp;#039;..property)&lt;br /&gt;
			local dataType = entityObject.datatype&lt;br /&gt;
			if dataType == &amp;quot;external-id&amp;quot; then&lt;br /&gt;
				local formatterURL = entityObject:getBestStatements(&amp;#039;P1630&amp;#039;)[1]&lt;br /&gt;
				if formatterURL then link = formatterURL.mainsnak.datavalue.value end&lt;br /&gt;
			elseif dataType == &amp;quot;url&amp;quot; then&lt;br /&gt;
				local subjectItem = entityObject:getBestStatements(&amp;#039;P1629&amp;#039;)[1]&lt;br /&gt;
				if subjectItem then&lt;br /&gt;
					local officialWebsite = mw.wikibase.getEntityObject(subjectItem.mainsnak.datavalue.value.id):getBestStatements(&amp;#039;P856&amp;#039;)[1]&lt;br /&gt;
					if officialWebsite then	link = officialWebsite.mainsnak.datavalue.value end&lt;br /&gt;
				end&lt;br /&gt;
			elseif dataType == &amp;quot;string&amp;quot; then&lt;br /&gt;
				local formatterURL = entityObject:getBestStatements(&amp;#039;P1630&amp;#039;)[1]&lt;br /&gt;
				if formatterURL then&lt;br /&gt;
					link = formatterURL.mainsnak.datavalue.value&lt;br /&gt;
				else&lt;br /&gt;
					local subjectItem = entityObject:getBestStatements(&amp;#039;P1629&amp;#039;)[1]&lt;br /&gt;
					if subjectItem then&lt;br /&gt;
						local officialWebsite = mw.wikibase.getEntityObject(subjectItem.mainsnak.datavalue.value.id):getBestStatements(&amp;#039;P856&amp;#039;)[1]&lt;br /&gt;
						if officialWebsite then	link = officialWebsite.mainsnak.datavalue.value end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		elseif type(property) == &amp;#039;string&amp;#039; then&lt;br /&gt;
			link = property&lt;br /&gt;
		end&lt;br /&gt;
		link = mw.ustring.gsub(link, &amp;#039;$1&amp;#039;, val)&lt;br /&gt;
	end&lt;br /&gt;
	link = mw.ustring.gsub(link, &amp;#039;^[Hh][Tt][Tt][Pp]([Ss]?)&amp;amp;#58;//&amp;#039;, &amp;#039;http%1://&amp;#039;) -- fix wikidata URL&lt;br /&gt;
	val = mw.ustring.match(val, &amp;#039;([^=/]*)/?$&amp;#039;) -- get display name from end of URL&lt;br /&gt;
	if mw.ustring.find( link, &amp;#039;//&amp;#039; ) then&lt;br /&gt;
		return &amp;#039;[&amp;#039;..link..&amp;#039; &amp;#039;..val..&amp;#039;]&amp;#039;&lt;br /&gt;
	elseif link == &amp;quot;&amp;quot; then&lt;br /&gt;
		return val&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;&amp;lt;span class=&amp;quot;external&amp;quot;&amp;gt;[[&amp;#039;..link..&amp;#039;|&amp;#039;..val..&amp;#039;]]&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function createRow( id, label, rawValue, link, withUid )&lt;br /&gt;
	if link then&lt;br /&gt;
		local outStr = &amp;#039;*&amp;lt;span style=&amp;quot;white-space:nowrap;&amp;quot;&amp;gt;&amp;#039; .. label .. &amp;#039; &amp;lt;span&amp;#039;&lt;br /&gt;
		if withUid then outStr = outStr..&amp;#039; class=&amp;quot;uid&amp;quot;&amp;#039; end&lt;br /&gt;
		return outStr..&amp;#039;&amp;gt;&amp;#039; .. link .. &amp;#039;&amp;lt;/span&amp;gt;&amp;lt;/span&amp;gt;\n&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;* &amp;lt;span class=&amp;quot;error&amp;quot;&amp;gt;The identifier &amp;#039; .. id .. &amp;#039; &amp;#039; .. rawValue .. &amp;#039; is not valid.&amp;lt;/span&amp;gt;\n&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local function copyTable(inTable)&lt;br /&gt;
	if type(inTable) ~= &amp;#039;table&amp;#039; then return inTable end&lt;br /&gt;
	local outTable = setmetatable({}, getmetatable(inTable))&lt;br /&gt;
	for key, value in pairs (inTable) do outTable[copyTable(key)] = copyTable(value) end&lt;br /&gt;
	return outTable&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
function p.authorityControlTaxon( frame )&lt;br /&gt;
	local parentArgs = copyTable(frame:getParent().args)&lt;br /&gt;
	local stringArgs = false&lt;br /&gt;
	local fromTitleCount, firstRow, rowCount = 1, 0, 0&lt;br /&gt;
	--Cleanup args&lt;br /&gt;
	for k, v in pairs( frame:getParent().args ) do&lt;br /&gt;
		if type(k) == &amp;#039;string&amp;#039; then&lt;br /&gt;
			--make args case insensitive&lt;br /&gt;
			local lowerk = mw.ustring.lower(k)&lt;br /&gt;
			if not parentArgs[lowerk] or parentArgs[lowerk] == &amp;#039;&amp;#039; then&lt;br /&gt;
				parentArgs[k] = nil&lt;br /&gt;
				parentArgs[lowerk] = v&lt;br /&gt;
			end&lt;br /&gt;
			--remap abc to abc1&lt;br /&gt;
			if not mw.ustring.find(lowerk,&amp;quot;%d$&amp;quot;) then --if no number at end of param&lt;br /&gt;
				if not parentArgs[lowerk..&amp;#039;1&amp;#039;] or parentArgs[lowerk..&amp;#039;1&amp;#039;] == &amp;#039;&amp;#039; then&lt;br /&gt;
					parentArgs[lowerk] = nil&lt;br /&gt;
					lowerk = lowerk..&amp;#039;1&amp;#039;&lt;br /&gt;
					parentArgs[lowerk] = v&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			if v and v ~= &amp;#039;&amp;#039; then&lt;br /&gt;
				--remap &amp;quot;for&amp;quot; to &amp;quot;title&amp;quot;&lt;br /&gt;
				if mw.ustring.sub(lowerk,1,3) == &amp;quot;for&amp;quot; then&lt;br /&gt;
					local forTitle = mw.ustring.gsub(lowerk,&amp;quot;^for&amp;quot;,&amp;quot;title&amp;quot;,1)&lt;br /&gt;
					if parentArgs[forTitle] == &amp;#039;&amp;#039; or not parentArgs[forTitle] then&lt;br /&gt;
						parentArgs[lowerk] = nil&lt;br /&gt;
						lowerk = forTitle&lt;br /&gt;
						parentArgs[lowerk] = v&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
				--find highest from or title param&lt;br /&gt;
				if mw.ustring.sub(lowerk,1,4) == &amp;quot;from&amp;quot; then&lt;br /&gt;
					local fromNumber = tonumber(mw.ustring.sub(lowerk,5,-1))&lt;br /&gt;
					if fromNumber and fromNumber &amp;gt;= fromTitleCount then fromTitleCount = fromNumber end&lt;br /&gt;
				elseif mw.ustring.sub(lowerk,1,3) == &amp;quot;title&amp;quot; then&lt;br /&gt;
					local titleNumber = tonumber(mw.ustring.sub(lowerk,4,-1))&lt;br /&gt;
					if titleNumber and titleNumber &amp;gt;= fromTitleCount then fromTitleCount = titleNumber end&lt;br /&gt;
				elseif mw.ustring.lower(v) ~= &amp;#039;no&amp;#039; and lowerk ~= &amp;#039;for&amp;#039; then&lt;br /&gt;
					stringArgs = true&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	--Setup navbox&lt;br /&gt;
	local navboxParams = {&lt;br /&gt;
		name  = &amp;#039;Taxonbar&amp;#039;,&lt;br /&gt;
		bodyclass = &amp;#039;hlist&amp;#039;,&lt;br /&gt;
		listclass = &amp;#039;&amp;#039;,&lt;br /&gt;
		groupstyle = &amp;#039;text-align: left;&amp;#039;,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local currentTitle = mw.title.getCurrentTitle()&lt;br /&gt;
&lt;br /&gt;
	for f = 1,fromTitleCount,1&lt;br /&gt;
	do&lt;br /&gt;
		local elements, title = {}, nil&lt;br /&gt;
		--cleanup parameters&lt;br /&gt;
		if parentArgs[&amp;#039;from&amp;#039;..f] == &amp;#039;&amp;#039; then parentArgs[&amp;#039;from&amp;#039;..f] = nil end&lt;br /&gt;
		if parentArgs[&amp;#039;title&amp;#039;..f] == &amp;#039;&amp;#039; then parentArgs[&amp;#039;title&amp;#039;..f] = nil end&lt;br /&gt;
		--remap aliases&lt;br /&gt;
		for _, a in pairs( conf.aliases ) do&lt;br /&gt;
			local alias, name = mw.ustring.lower(a[1]), mw.ustring.lower(a[2])&lt;br /&gt;
			if parentArgs[alias..f] and not parentArgs[name..f] then&lt;br /&gt;
				parentArgs[name..f] = parentArgs[alias..f]&lt;br /&gt;
				parentArgs[alias..f] = nil&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		--Fetch Wikidata item&lt;br /&gt;
		local item = mw.wikibase.getEntity(parentArgs[&amp;#039;from&amp;#039;..f])&lt;br /&gt;
		local label = nil&lt;br /&gt;
		if item then&lt;br /&gt;
			local statements = item:getBestStatements(&amp;#039;P225&amp;#039;)[1]&lt;br /&gt;
			if statements then&lt;br /&gt;
				local datavalue = statements.mainsnak.datavalue&lt;br /&gt;
				if datavalue then&lt;br /&gt;
					label = datavalue.value&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			label = label or item:getLabel()&lt;br /&gt;
		end&lt;br /&gt;
		if label and label ~= &amp;#039;&amp;#039; then&lt;br /&gt;
			title = mw.title.new(label)&lt;br /&gt;
		end&lt;br /&gt;
		if not title and parentArgs[&amp;#039;title&amp;#039;..f] then&lt;br /&gt;
			title = mw.title.new(parentArgs[&amp;#039;title&amp;#039;..f])&lt;br /&gt;
		end&lt;br /&gt;
		if not title and f == 1 then&lt;br /&gt;
			title = currentTitle&lt;br /&gt;
		end&lt;br /&gt;
&lt;br /&gt;
		if title then&lt;br /&gt;
			if (not parentArgs[&amp;#039;wikidata&amp;#039;..f] or parentArgs[&amp;#039;wikidata&amp;#039;..f] == &amp;#039;&amp;#039;) and (title.namespace == 0) then&lt;br /&gt;
				if parentArgs[&amp;#039;from&amp;#039;..f] then parentArgs[&amp;#039;wikidata&amp;#039;..f] = parentArgs[&amp;#039;from&amp;#039;..f] elseif item then parentArgs[&amp;#039;wikidata&amp;#039;..f] = item.id end&lt;br /&gt;
			end&lt;br /&gt;
			if title.namespace == 0 or stringArgs then --Only in the main namespace or if there are manual overrides&lt;br /&gt;
				local sourcesFound = false&lt;br /&gt;
				for _, params in pairs( conf.databases ) do&lt;br /&gt;
					params[1] = mw.ustring.lower(params[1])&lt;br /&gt;
					--Wikidata fallback if requested&lt;br /&gt;
					if (item ~= nil and item.claims ~= nil) and params[3] ~= 0 and (not parentArgs[params[1]..f] or parentArgs[params[1]..f] == &amp;#039;&amp;#039;) then&lt;br /&gt;
						local wikidataIds = getIdsFromWikidata( item, &amp;#039;P&amp;#039; .. params[3] )&lt;br /&gt;
						if wikidataIds[1] then&lt;br /&gt;
							parentArgs[params[1]..f] = wikidataIds[1]&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
					local val = parentArgs[params[1]..f]&lt;br /&gt;
					if val and val ~= &amp;#039;&amp;#039; and mw.ustring.lower(val) ~= &amp;#039;no&amp;#039; and params[3] ~= 0 then&lt;br /&gt;
						table.insert( elements, createRow( params[1], params[2] .. &amp;#039;:&amp;#039;, val, getLink( params[3], val ), true ) )&lt;br /&gt;
						if params[1] ~= &amp;#039;wikidata&amp;#039; then sourcesFound = true end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
&lt;br /&gt;
				--Generate navbox title&lt;br /&gt;
				if sourcesFound then&lt;br /&gt;
					rowCount = rowCount + 1&lt;br /&gt;
					if firstRow == 0 then firstRow = f end&lt;br /&gt;
					--set title from wikidata if it doesn&amp;#039;t exist&lt;br /&gt;
					if parentArgs[&amp;#039;title&amp;#039;..f] == &amp;#039;&amp;#039; or not parentArgs[&amp;#039;title&amp;#039;..f] then&lt;br /&gt;
						parentArgs[&amp;#039;noTitle&amp;#039;..f] = true&lt;br /&gt;
						parentArgs[&amp;#039;title&amp;#039;..f] = title.text&lt;br /&gt;
					end&lt;br /&gt;
					--if it exists now, set row heading to title&lt;br /&gt;
					if parentArgs[&amp;#039;title&amp;#039;..f] and parentArgs[&amp;#039;title&amp;#039;..f] ~= &amp;#039;&amp;#039; then&lt;br /&gt;
						navboxParams[&amp;#039;group&amp;#039;..f] = &amp;quot;&amp;#039;&amp;#039;&amp;quot; .. parentArgs[&amp;#039;title&amp;#039;..f] .. &amp;quot;&amp;#039;&amp;#039;&amp;quot;&lt;br /&gt;
					else&lt;br /&gt;
						navboxParams[&amp;#039;group&amp;#039;..f] = &amp;quot;&amp;quot;&lt;br /&gt;
					end&lt;br /&gt;
					navboxParams[&amp;#039;list&amp;#039;..f] = table.concat( elements )&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if rowCount &amp;gt; 0 then&lt;br /&gt;
		local Navbox = require(&amp;#039;Module:Navbox&amp;#039;)&lt;br /&gt;
		if rowCount &amp;gt; 1 then&lt;br /&gt;
			--remove duplicates and move page title to top&lt;br /&gt;
			local rowIDs = {}&lt;br /&gt;
			for f = 1,fromTitleCount,1&lt;br /&gt;
			do&lt;br /&gt;
				if parentArgs[&amp;#039;title&amp;#039;..f] and parentArgs[&amp;#039;title&amp;#039;..f] ~= &amp;#039;&amp;#039; then&lt;br /&gt;
					if rowIDs[parentArgs[&amp;#039;wikidata&amp;#039;..f]] then --remove duplicate&lt;br /&gt;
						navboxParams[&amp;#039;group&amp;#039;..f] = nil&lt;br /&gt;
						navboxParams[&amp;#039;list&amp;#039;..f] = nil&lt;br /&gt;
					else&lt;br /&gt;
						rowIDs[parentArgs[&amp;#039;wikidata&amp;#039;..f]] = true&lt;br /&gt;
						if f &amp;gt; firstRow and (parentArgs[&amp;#039;title&amp;#039;..f] == currentTitle.text or parentArgs[&amp;#039;wikidata&amp;#039;..f] == mw.wikibase.getEntityIdForCurrentPage()) then --move item linked to page to top&lt;br /&gt;
							if navboxParams[&amp;#039;group&amp;#039;..f] and navboxParams[&amp;#039;group&amp;#039;..f] ~= &amp;#039;&amp;#039; and navboxParams[&amp;#039;list&amp;#039;..f] and navboxParams[&amp;#039;list&amp;#039;..f] ~= &amp;#039;&amp;#039; then&lt;br /&gt;
								local tempGroup, tempList = navboxParams[&amp;#039;group&amp;#039;..f], navboxParams[&amp;#039;list&amp;#039;..f]&lt;br /&gt;
								navboxParams[&amp;#039;group&amp;#039;..f], navboxParams[&amp;#039;list&amp;#039;..f] = navboxParams[&amp;#039;group&amp;#039;..firstRow], navboxParams[&amp;#039;list&amp;#039;..firstRow]&lt;br /&gt;
								navboxParams[&amp;#039;group&amp;#039;..firstRow], navboxParams[&amp;#039;list&amp;#039;..firstRow] = tempGroup, tempList&lt;br /&gt;
							end&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
			--adjust navbox for number of rows&lt;br /&gt;
			navboxParams[&amp;#039;title&amp;#039;] = &amp;quot;[[Help:Taxon identifiers|Taxon identifiers]]&amp;quot;&lt;br /&gt;
			if rowCount &amp;gt; 2 then&lt;br /&gt;
				navboxParams[&amp;#039;navbar&amp;#039;] = &amp;#039;plain&amp;#039;&lt;br /&gt;
			else&lt;br /&gt;
				navboxParams[&amp;#039;state&amp;#039;] = &amp;#039;off&amp;#039;&lt;br /&gt;
				navboxParams[&amp;#039;navbar&amp;#039;] = &amp;#039;off&amp;#039;&lt;br /&gt;
			end&lt;br /&gt;
		elseif parentArgs[&amp;#039;noTitle&amp;#039;..firstRow] then&lt;br /&gt;
			navboxParams[&amp;#039;group&amp;#039;..firstRow] = &amp;#039;[[Help:Taxon identifiers|Taxon identifiers]]&amp;#039;&lt;br /&gt;
		else&lt;br /&gt;
			navboxParams[&amp;#039;group&amp;#039;..firstRow] = &amp;#039;[[Help:Taxon identifiers|Taxon identifiers]]&amp;lt;br /&amp;gt;&amp;#039; .. navboxParams[&amp;#039;group&amp;#039;..firstRow]&lt;br /&gt;
		end&lt;br /&gt;
		return Navbox._navbox(navboxParams)&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;quot;&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>imported&gt;WOSlinker</name></author>
	</entry>
</feed>