<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://mywikibiz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ARu_Paul%27s_Drag_Race_tables</id>
	<title>Module:Ru Paul's Drag Race tables - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://mywikibiz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3ARu_Paul%27s_Drag_Race_tables"/>
	<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:Ru_Paul%27s_Drag_Race_tables&amp;action=history"/>
	<updated>2026-06-20T18:54:43Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.35.3</generator>
	<entry>
		<id>https://mywikibiz.com/index.php?title=Module:Ru_Paul%27s_Drag_Race_tables&amp;diff=479360&amp;oldid=prev</id>
		<title>Zoran: Pywikibot 6.4.0</title>
		<link rel="alternate" type="text/html" href="https://mywikibiz.com/index.php?title=Module:Ru_Paul%27s_Drag_Race_tables&amp;diff=479360&amp;oldid=prev"/>
		<updated>2021-07-16T05:50:06Z</updated>

		<summary type="html">&lt;p&gt;Pywikibot 6.4.0&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-------------&lt;br /&gt;
-- Exports --&lt;br /&gt;
-------------&lt;br /&gt;
&lt;br /&gt;
-- Used by [[Template:Drag Race contestant table]]&lt;br /&gt;
function p.contestant_table( frame )&lt;br /&gt;
	return p._contestant_table( frame )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Used by [[Template:Drag Race progress table]]&lt;br /&gt;
function p.progressTable( frame )&lt;br /&gt;
	return p._progressTable( frame )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Used by [[Template:Drag Race progress key]]&lt;br /&gt;
function p.key( frame )&lt;br /&gt;
	return p._key( frame )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-----------------------&lt;br /&gt;
-- Utility Functions --&lt;br /&gt;
-----------------------&lt;br /&gt;
function p._inTable( t, k )&lt;br /&gt;
	return (t[k] ~= nil)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._sortRows(a,b)&lt;br /&gt;
	return a[1] &amp;gt; b[1]	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._revSortRows(a,b)&lt;br /&gt;
	return a[1] &amp;lt; b[1]	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
p.colorMap = { -- See [[Wikipedia:Manual of Style/Accessibility/Colors]]&lt;br /&gt;
	[&amp;quot;red&amp;quot;] = &amp;quot;#FF7B7B&amp;quot;,&lt;br /&gt;
	['orange'] = &amp;quot;#FFA7AF&amp;quot;,&lt;br /&gt;
	[&amp;quot;yellow&amp;quot;] = &amp;quot;#FAFA00&amp;quot;,&lt;br /&gt;
	[&amp;quot;chartreuse&amp;quot;] = &amp;quot;#A8FF4F&amp;quot;,&lt;br /&gt;
	[&amp;quot;green&amp;quot;] = &amp;quot;#7BFF7B&amp;quot;,&lt;br /&gt;
	[&amp;quot;spring&amp;quot;] = &amp;quot;#4FFFA8&amp;quot;,&lt;br /&gt;
	[&amp;quot;cyan&amp;quot;] = &amp;quot;#00FAFA&amp;quot;,&lt;br /&gt;
	[&amp;quot;dodger&amp;quot;] = &amp;quot;#4FA8FF&amp;quot;,&lt;br /&gt;
	[&amp;quot;blue&amp;quot;] = &amp;quot;#8888FF&amp;quot;,&lt;br /&gt;
	[&amp;quot;indigo&amp;quot;] = &amp;quot;#BB76FF&amp;quot;,&lt;br /&gt;
	[&amp;quot;magenta&amp;quot;] = &amp;quot;#FF29FF&amp;quot;,&lt;br /&gt;
	[&amp;quot;pink&amp;quot;] = &amp;quot;#FF52A9&amp;quot;,&lt;br /&gt;
	[&amp;quot;brown&amp;quot;] = &amp;quot;#E97500&amp;quot;,&lt;br /&gt;
	[&amp;quot;grey&amp;quot;] = &amp;quot;#808080&amp;quot;,&lt;br /&gt;
	[&amp;quot;gray&amp;quot;] = &amp;quot;#808080&amp;quot;,&lt;br /&gt;
	[&amp;quot;silver&amp;quot;] = &amp;quot;#F8F9FA&amp;quot; -- Actually just the usual background table color&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
----------------------&lt;br /&gt;
-- Contestant table --&lt;br /&gt;
----------------------&lt;br /&gt;
function p._contestant_table( frame )&lt;br /&gt;
	local templateFrame = frame:getParent()&lt;br /&gt;
	local contestantData = p._getContestantData( templateFrame )&lt;br /&gt;
	ret = [=[&lt;br /&gt;
	{| class=&amp;quot;wikitable sortable&amp;quot; border=&amp;quot;2&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
	|+ Contestants of ''All Stars 5'' and their backgrounds&lt;br /&gt;
	! scope=&amp;quot;col&amp;quot;| Contestant&lt;br /&gt;
	! scope=&amp;quot;col&amp;quot;| Age&lt;br /&gt;
	! scope=&amp;quot;col&amp;quot;| Hometown&lt;br /&gt;
	! scope=&amp;quot;col&amp;quot;| Original season(s)&lt;br /&gt;
	! scope=&amp;quot;col&amp;quot;| Original placement(s)&lt;br /&gt;
	! scope=&amp;quot;col&amp;quot;| Outcome&lt;br /&gt;
	]=]&lt;br /&gt;
	for k, v in pairs( contestantData ) do&lt;br /&gt;
		ret = ret .. p._bio_makeRow(contestantData[k])&lt;br /&gt;
	end&lt;br /&gt;
	return ret .. &amp;quot;|}&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._bio_makeRow( contestant )&lt;br /&gt;
	local rowTemplate = [=[&lt;br /&gt;
	|-&lt;br /&gt;
	! scope=&amp;quot;row&amp;quot; rowspan=&amp;quot;${NROWS}&amp;quot;|[[${NAME}]]&lt;br /&gt;
	|rowspan=&amp;quot;${NROWS}&amp;quot;|${AGE}&lt;br /&gt;
	|rowspan=&amp;quot;${NROWS}&amp;quot;|${HOMETOWN}&lt;br /&gt;
	]=]&lt;br /&gt;
	if string.find(contestant['season'], 'All Stars') ~= nil then&lt;br /&gt;
		rowTemplate = rowTemplate .. &amp;quot;|[[RuPaul's Drag Race All Stars (season ${SEASON-NUM})|''All Stars'' ${SEASON-NUM}]]\n&amp;quot;&lt;br /&gt;
		contestant['season-num'] = string.match(contestant['season'], 'All Stars (%d+)')&lt;br /&gt;
		contestant['season'] = nil&lt;br /&gt;
	else&lt;br /&gt;
		rowTemplate = rowTemplate .. &amp;quot;|[[RuPaul's Drag Race (season ${SEASON})|Season ${SEASON}]]\n&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	rowTemplate = rowTemplate .. [=[&lt;br /&gt;
	|&amp;lt;span data-sort-value=&amp;quot;${PLACE-SORT}&amp;quot;&amp;gt;${PLACE}&amp;lt;/span&amp;gt;&lt;br /&gt;
	]=]&lt;br /&gt;
	if contestant['outcome'] ~= nil then&lt;br /&gt;
		rowTemplate = rowTemplate .. '|rowspan=&amp;quot;${NROWS}&amp;quot;|${OUTCOME}\n'&lt;br /&gt;
		if #tostring(contestant['outcome']) &amp;lt; 3 then&lt;br /&gt;
			contestant['outcome'] = p._makePlace(contestant['outcome'])&lt;br /&gt;
		end&lt;br /&gt;
	else&lt;br /&gt;
		rowTemplate = rowTemplate .. '|rowspan=&amp;quot;${NROWS}&amp;quot; style=&amp;quot;background: #DDF; color: #2C2C2C; vertical-align: middle; text-align: center;&amp;quot; class=&amp;quot;no table-no2&amp;quot;|TBA\n'&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if tonumber(contestant['nrows']) &amp;gt; 1 then&lt;br /&gt;
		rowTemplate = rowTemplate .. &amp;quot;|-\n&amp;quot;&lt;br /&gt;
		if string.find(contestant['season2'], 'All Stars') ~= nil then&lt;br /&gt;
			rowTemplate = rowTemplate .. &amp;quot;|[[RuPaul's Drag Race All Stars (season ${SEASON2-NUM})|''All Stars'' ${SEASON2-NUM}]]\n&amp;quot;&lt;br /&gt;
			contestant['season2-num'] = tostring(string.match(contestant['season2'], '%d+'))&lt;br /&gt;
			contestant['season2'] = nil&lt;br /&gt;
		else&lt;br /&gt;
			rowTemplate = rowTemplate .. &amp;quot;|[[RuPaul's Drag Race (season ${SEASON2})|Season ${SEASON2}]]\n&amp;quot;&lt;br /&gt;
		end&lt;br /&gt;
		rowTemplate = rowTemplate .. '|&amp;lt;span data-sort-value=&amp;quot;${PLACE2-SORT}&amp;quot;&amp;gt;${PLACE2}&amp;lt;/span&amp;gt;\n'&lt;br /&gt;
		if contestant['place2-sort'] == nil then&lt;br /&gt;
			contestant['place2-sort'] = p._makePlaceSort(contestant['place2'])&lt;br /&gt;
		end&lt;br /&gt;
		local place&lt;br /&gt;
		if #tostring(contestant['place2']) &amp;gt; 2 then &lt;br /&gt;
		  	place = string.match(contestant['place2'],'(%d+)%D%D')&lt;br /&gt;
		else&lt;br /&gt;
		   	place = contestant['place2']&lt;br /&gt;
		end&lt;br /&gt;
		contestant['place2'] = p._makePlace(place)&lt;br /&gt;
	end&lt;br /&gt;
	for k, v in pairs( contestant ) do&lt;br /&gt;
		mw.log(k:upper())&lt;br /&gt;
		rowTemplate = string.gsub(rowTemplate,&amp;quot;${&amp;quot;..k:upper():gsub('%-','%%-')..&amp;quot;}&amp;quot;,contestant[k])&lt;br /&gt;
	end&lt;br /&gt;
	return rowTemplate	&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._getContestant( k )&lt;br /&gt;
	return string.match( k, &amp;quot;contestant%-(%d+)&amp;quot; )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._getField( k )&lt;br /&gt;
	return string.match( k, &amp;quot;contestant%-%d+%-(.*)&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._getContestantData( frame )&lt;br /&gt;
    local contestantData = {}&lt;br /&gt;
    for k, v in pairs( frame.args ) do&lt;br /&gt;
    	-- Read inputs and organize them by contestant&lt;br /&gt;
   		if not p._inTable(contestantData, p._getContestant(k)) then&lt;br /&gt;
   			contestantData[p._getContestant(k)] = {}&lt;br /&gt;
   		end&lt;br /&gt;
   		if p._getField(k) ~= nil then&lt;br /&gt;
    		contestantData[p._getContestant(k)][p._getField(k)] = v&lt;br /&gt;
    	else&lt;br /&gt;
    		contestantData[p._getContestant(k)][&amp;quot;name&amp;quot;] = v&lt;br /&gt;
    	end&lt;br /&gt;
    end&lt;br /&gt;
    for k, v in pairs( contestantData ) do&lt;br /&gt;
    	-- Final cleanup of the input before rendering table&lt;br /&gt;
	    if not p._inTable(contestantData[k],&amp;quot;nrows&amp;quot;) then&lt;br /&gt;
	    	contestantData[k][&amp;quot;nrows&amp;quot;] = 1&lt;br /&gt;
	    end&lt;br /&gt;
	    if not p._inTable(contestantData[k],&amp;quot;place-sort&amp;quot;) then&lt;br /&gt;
		    if #tostring(contestantData[k]['place']) &amp;gt; 2 then &lt;br /&gt;
		    	place = string.match(contestantData[k]['place'],'(%d+)%D%D')&lt;br /&gt;
		    else&lt;br /&gt;
		    	place = contestantData[k]['place']&lt;br /&gt;
		    end&lt;br /&gt;
	    	contestantData[k][&amp;quot;place-sort&amp;quot;] = p._makePlaceSort(place)&lt;br /&gt;
	    end&lt;br /&gt;
	    if #tostring(contestantData[k]['place']) &amp;lt; 3 then &lt;br /&gt;
	    	contestantData[k]['place'] = p._makePlace(contestantData[k]['place'])&lt;br /&gt;
		end&lt;br /&gt;
    end&lt;br /&gt;
    return contestantData&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._makePlaceSort( place )&lt;br /&gt;
	if #tostring(place) &amp;lt; 2 then&lt;br /&gt;
		return '0'..place&lt;br /&gt;
	else&lt;br /&gt;
		return place&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._makePlace( place )&lt;br /&gt;
	place = tonumber(place)&lt;br /&gt;
	if place == 1 then&lt;br /&gt;
		return '1st Place'&lt;br /&gt;
	elseif place == 2 then&lt;br /&gt;
		return '2nd Place'&lt;br /&gt;
	elseif place == 3 then&lt;br /&gt;
		return'3rd Place'&lt;br /&gt;
	else&lt;br /&gt;
		return place .. 'th Place'&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------------&lt;br /&gt;
-- Contestant progress table --&lt;br /&gt;
-------------------------------&lt;br /&gt;
function p._progressTable( frame )&lt;br /&gt;
	local templateFrame = frame:getParent()&lt;br /&gt;
	local contestantData = {}&lt;br /&gt;
	ret = &amp;quot;&amp;quot;&lt;br /&gt;
	for i=1,50 do&lt;br /&gt;
		arg = templateFrame.args[i]&lt;br /&gt;
		if arg == nil then&lt;br /&gt;
			break&lt;br /&gt;
		elseif i % 3 == 1 then -- First in triplet is contestant name&lt;br /&gt;
			contestantData[arg] = {{}}&lt;br /&gt;
		elseif i % 3 == 2 then -- Second in triple is color codes&lt;br /&gt;
			contestantData[templateFrame.args[i-1]][1] = arg&lt;br /&gt;
		else -- Third in triplet is text&lt;br /&gt;
			contestantData[templateFrame.args[i-2]][2] = arg&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	contestantData, width = p._parseRanks( contestantData )&lt;br /&gt;
	ret = ret .. [=[{| class=&amp;quot;wikitable&amp;quot; style=&amp;quot;text-align:center;&amp;quot;&lt;br /&gt;
	|+Progress of contests including rank/position in each episode&lt;br /&gt;
	! scope=&amp;quot;col&amp;quot;| Contestant&lt;br /&gt;
	]=]&lt;br /&gt;
	for i=1,width do&lt;br /&gt;
		ret = ret .. &amp;quot;! scope='col'| &amp;quot; .. i ..&amp;quot;\n&amp;quot;	&lt;br /&gt;
	end&lt;br /&gt;
	rowList = {}&lt;br /&gt;
	for k,v in pairs(contestantData) do&lt;br /&gt;
		table.insert(rowList,p._prog_makeRow(k,v,width))&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(rowList,p._sortRows)&lt;br /&gt;
	for i=1,20 do&lt;br /&gt;
		if rowList[i] == nil then&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
		ret = ret .. rowList[i][2]&lt;br /&gt;
	end&lt;br /&gt;
	return ret .. &amp;quot;|}&amp;quot;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._parseRanks( contestantData )&lt;br /&gt;
	local data = {}&lt;br /&gt;
	local high = 0&lt;br /&gt;
	for k,v in pairs(contestantData) do&lt;br /&gt;
		data[k] = {}&lt;br /&gt;
		data[k][1] = mw.text.split(contestantData[k][1],',%s*')&lt;br /&gt;
		data[k][2] = mw.text.split(contestantData[k][2],',%s*')&lt;br /&gt;
		if #data[k][1] &amp;gt; high then&lt;br /&gt;
			high = #data[k][1]&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return data, high&lt;br /&gt;
end&lt;br /&gt;
	&lt;br /&gt;
function p._prog_makeRow( contestant, tableData, width )&lt;br /&gt;
	row = &amp;quot;|-\n! scope='row'| &amp;quot; .. contestant .. &amp;quot;\n&amp;quot;&lt;br /&gt;
	colors = tableData[1]&lt;br /&gt;
	labels = tableData[2]&lt;br /&gt;
	final = 0&lt;br /&gt;
	for i=1,20 do&lt;br /&gt;
		-- If we've reached the end of the list...&lt;br /&gt;
		if colors[i] == nil then&lt;br /&gt;
			final = i&lt;br /&gt;
			-- ...and the entries span the entire width of the table, then finish&lt;br /&gt;
			if i &amp;gt; width then&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
			-- ...otherwise, fill the rest of the columns with darkgray&lt;br /&gt;
			row = row .. &amp;quot;| colspan='&amp;quot; .. width + 1 - i .. &amp;quot;' bgcolor='darkgray' |\n&amp;quot;&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
		text = labels[i]&lt;br /&gt;
		color = p.colorMap[colors[i]:gsub(&amp;quot;%s+&amp;quot;,&amp;quot;&amp;quot;)]&lt;br /&gt;
		row = row .. &amp;quot;| style='background:&amp;quot; .. color .. &amp;quot;;' |&amp;quot; .. text .. &amp;quot;\n&amp;quot;&lt;br /&gt;
	end&lt;br /&gt;
	retRow = {&lt;br /&gt;
		final,&lt;br /&gt;
		row&lt;br /&gt;
	}&lt;br /&gt;
	return retRow&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-------------------------&lt;br /&gt;
-- Make key for colors --&lt;br /&gt;
-------------------------&lt;br /&gt;
function p._key( frame )&lt;br /&gt;
	local templateFrame = frame:getParent()&lt;br /&gt;
	local args = templateFrame.args&lt;br /&gt;
	local ret = ''&lt;br /&gt;
	local order = mw.text.split(args.order,',%s*')&lt;br /&gt;
	args.order = nil&lt;br /&gt;
	local reverseIndex = {}&lt;br /&gt;
	for i,v in ipairs(order) do&lt;br /&gt;
		reverseIndex[v] = i&lt;br /&gt;
	end&lt;br /&gt;
	local rowTable = {}&lt;br /&gt;
	for k,v in pairs(args) do&lt;br /&gt;
		if k ~= 'order' then&lt;br /&gt;
			box = p._makeColorBox( k )&lt;br /&gt;
			text = v .. &amp;quot;\n&amp;quot;&lt;br /&gt;
			row = { reverseIndex[k], box .. text }&lt;br /&gt;
			table.insert(rowTable,row)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	table.sort(rowTable,p._revSortRows)&lt;br /&gt;
	for i=1,20 do&lt;br /&gt;
		if rowTable[i] == nil then&lt;br /&gt;
			break&lt;br /&gt;
		end&lt;br /&gt;
		ret = ret .. rowTable[i][2]&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._makeColorBox( key )&lt;br /&gt;
	local template = ':&amp;lt;span style=&amp;quot;background-color:HEXCODE; border:1px solid #000000;&amp;quot;&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;/span&amp;gt; '&lt;br /&gt;
	color = p.colorMap[key]&lt;br /&gt;
	return string.gsub(template, 'HEXCODE', color)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Zoran</name></author>
	</entry>
</feed>