<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.roatpkz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AInfotable_Bonuses</id>
	<title>Module:Infotable Bonuses - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.roatpkz.com/index.php?action=history&amp;feed=atom&amp;title=Module%3AInfotable_Bonuses"/>
	<link rel="alternate" type="text/html" href="https://wiki.roatpkz.com/index.php?title=Module:Infotable_Bonuses&amp;action=history"/>
	<updated>2026-04-05T20:28:03Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.0</generator>
	<entry>
		<id>https://wiki.roatpkz.com/index.php?title=Module:Infotable_Bonuses&amp;diff=23727&amp;oldid=prev</id>
		<title>Hefner: Created page with &quot;local p = {}  local trim = mw.text.trim local gsplit = mw.text.gsplit local split = mw.text.split local listToText = mw.text.listToText  local yesNo = require(&#039;Module:Yesno&#039;) local paramTest = require(&#039;Module:Paramtest&#039;) local contains = require(&#039;Module:Array&#039;).contains local pageListCheck = require(&#039;Module:PageListTools&#039;).pagelistchecks local equipmentStats = require(&#039;Module:FetchItemStats&#039;).equipmentStats local onMain = require(&#039;Module:Mainonly&#039;).on_main  -- Sorting ke...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.roatpkz.com/index.php?title=Module:Infotable_Bonuses&amp;diff=23727&amp;oldid=prev"/>
		<updated>2024-05-24T11:32:21Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;local p = {}  local trim = mw.text.trim local gsplit = mw.text.gsplit local split = mw.text.split local listToText = mw.text.listToText  local yesNo = require(&amp;#039;Module:Yesno&amp;#039;) local paramTest = require(&amp;#039;Module:Paramtest&amp;#039;) local contains = require(&amp;#039;Module:Array&amp;#039;).contains local pageListCheck = require(&amp;#039;Module:PageListTools&amp;#039;).pagelistchecks local equipmentStats = require(&amp;#039;Module:FetchItemStats&amp;#039;).equipmentStats local onMain = require(&amp;#039;Module:Mainonly&amp;#039;).on_main  -- Sorting ke...&amp;quot;&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;
local trim = mw.text.trim&lt;br /&gt;
local gsplit = mw.text.gsplit&lt;br /&gt;
local split = mw.text.split&lt;br /&gt;
local listToText = mw.text.listToText&lt;br /&gt;
&lt;br /&gt;
local yesNo = require(&amp;#039;Module:Yesno&amp;#039;)&lt;br /&gt;
local paramTest = require(&amp;#039;Module:Paramtest&amp;#039;)&lt;br /&gt;
local contains = require(&amp;#039;Module:Array&amp;#039;).contains&lt;br /&gt;
local pageListCheck = require(&amp;#039;Module:PageListTools&amp;#039;).pagelistchecks&lt;br /&gt;
local equipmentStats = require(&amp;#039;Module:FetchItemStats&amp;#039;).equipmentStats&lt;br /&gt;
local onMain = require(&amp;#039;Module:Mainonly&amp;#039;).on_main&lt;br /&gt;
&lt;br /&gt;
-- Sorting keys&lt;br /&gt;
local sortKey = {&lt;br /&gt;
	&amp;#039;astab&amp;#039;, &amp;#039;aslash&amp;#039;, &amp;#039;acrush&amp;#039;, &amp;#039;amagic&amp;#039;, &amp;#039;arange&amp;#039;,&lt;br /&gt;
	&amp;#039;dstab&amp;#039;, &amp;#039;dslash&amp;#039;, &amp;#039;dcrush&amp;#039;, &amp;#039;dmagic&amp;#039;, &amp;#039;drange&amp;#039;,&lt;br /&gt;
	&amp;#039;str&amp;#039;,   &amp;#039;mdmg&amp;#039;,   &amp;#039;rstr&amp;#039;,   &amp;#039;prayer&amp;#039;, &amp;#039;weight&amp;#039;,&lt;br /&gt;
	&amp;#039;membs&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
-- Sorting orders&lt;br /&gt;
local sortOrder = {&lt;br /&gt;
	&amp;#039;ascending&amp;#039;, &amp;#039;asc&amp;#039;,&lt;br /&gt;
	&amp;#039;descending&amp;#039;, &amp;#039;desc&amp;#039;, &amp;#039;reverse&amp;#039;,&lt;br /&gt;
	&amp;#039;random&amp;#039;, &amp;#039;rand&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
function totalsFooter(tabl, totals, useComments)&lt;br /&gt;
	local row = tabl:tag(&amp;#039;tr&amp;#039;):addClass(&amp;#039;sortbottom&amp;#039;):tag(&amp;#039;th&amp;#039;):attr(&amp;#039;colspan&amp;#039;, &amp;#039;2&amp;#039;):wikitext(&amp;#039;Totals&amp;#039;):done()&lt;br /&gt;
	&lt;br /&gt;
	for i = 1, #sortKey, 1 do&lt;br /&gt;
		local cell = row:tag(&amp;#039;td&amp;#039;):css(&amp;#039;text-align&amp;#039;, &amp;#039;right&amp;#039;)&lt;br /&gt;
		if(sortKey[i] == &amp;#039;mdmg&amp;#039;) then&lt;br /&gt;
			cell:wikitext(totals[i] .. &amp;#039;%&amp;#039;):done()&lt;br /&gt;
		elseif(sortKey[i] == &amp;#039;weight&amp;#039;) then&lt;br /&gt;
			local zeroTrimmedWeight, _ = tostring(totals[i]):gsub(&amp;quot;%.0+$&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
			cell:wikitext(zeroTrimmedWeight):done()&lt;br /&gt;
		elseif(sortKey[i] == &amp;#039;membs&amp;#039;) then&lt;br /&gt;
			cell:addClass(&amp;#039;table-na nohighlight&amp;#039;):css(&amp;#039;text-align&amp;#039;, &amp;#039;center&amp;#039;):wikitext(&amp;#039;&amp;lt;small&amp;gt;N/A&amp;lt;/small&amp;gt;&amp;#039;)&lt;br /&gt;
		else&lt;br /&gt;
			cell:wikitext(totals[i])&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if(useComments) then&lt;br /&gt;
		row:tag(&amp;#039;td&amp;#039;):done()&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function buildRow(pageData, totals, columnWidth, itemWidth, useComments, comment)&lt;br /&gt;
	local row = mw.html.create(&amp;#039;tr&amp;#039;)&lt;br /&gt;
		:tag(&amp;#039;td&amp;#039;):cssText(columnWidth):wikitext(pageData[&amp;#039;image&amp;#039;] and &amp;#039;[[&amp;#039; .. pageData[&amp;#039;image&amp;#039;] .. &amp;#039;|link=|&amp;#039; .. split(pageData[&amp;#039;name&amp;#039;], &amp;#039;#&amp;#039;, true)[1] .. &amp;#039;]]&amp;#039; or &amp;#039;&amp;#039;):done()&lt;br /&gt;
		:tag(&amp;#039;td&amp;#039;):cssText(itemWidth):wikitext(&amp;#039;[[&amp;#039; .. split(pageData[&amp;#039;name&amp;#039;], &amp;#039;#&amp;#039;, true)[1] .. &amp;#039;]]&amp;#039;):done()&lt;br /&gt;
&lt;br /&gt;
	for i = 1, #sortKey, 1 do&lt;br /&gt;
		local attribute = pageData[sortKey[i]]&lt;br /&gt;
		local cell = row:tag(&amp;#039;td&amp;#039;):cssText(columnWidth)&lt;br /&gt;
		&lt;br /&gt;
		if(sortKey[i] == &amp;#039;membs&amp;#039;) then&lt;br /&gt;
				cell:wikitext(yesNo(attribute, false) and &amp;#039;[[File:Member icon.png|link=Members]]&amp;#039; or &amp;#039;[[File:Free-to-play icon.png|link=Free-to-play]]&amp;#039;):done()&lt;br /&gt;
		else&lt;br /&gt;
			if(not attribute) then&lt;br /&gt;
				cell:addClass(&amp;#039;table-no&amp;#039;):addClass(&amp;#039;nohighlight&amp;#039;):attr(&amp;#039;data-sort-value&amp;#039;, 0):wikitext(&amp;#039;?&amp;#039;):done()&lt;br /&gt;
			else&lt;br /&gt;
				if(sortKey[i] == &amp;#039;mdmg&amp;#039;) then&lt;br /&gt;
					cell:wikitext(attribute .. &amp;#039;%&amp;#039;):done()&lt;br /&gt;
				elseif(sortKey[i] == &amp;#039;weight&amp;#039;) then&lt;br /&gt;
					local zeroTrimmedWeight, _ = tostring(attribute):gsub(&amp;quot;%.0+$&amp;quot;, &amp;quot;&amp;quot;)&lt;br /&gt;
					cell:wikitext(zeroTrimmedWeight):done()&lt;br /&gt;
				else&lt;br /&gt;
					cell:wikitext(attribute):done()&lt;br /&gt;
				end&lt;br /&gt;
				totals[i] = totals[i] + tonumber(attribute)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if(useComments) then&lt;br /&gt;
		local cell = row:tag(&amp;#039;td&amp;#039;):wikitext(comment):done()&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	return row, totals&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function createHeader(tabl, useComments)&lt;br /&gt;
	local header = tabl:tag(&amp;#039;tr&amp;#039;):tag(&amp;#039;th&amp;#039;):attr({ colspan = &amp;#039;2&amp;#039;, rowspan = &amp;#039;2&amp;#039; }):wikitext(&amp;#039;Item&amp;#039;):done()&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;):attr(&amp;#039;colspan&amp;#039;, &amp;#039;5&amp;#039;):wikitext(&amp;#039;Attack Bonuses&amp;#039;):done()&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;):attr(&amp;#039;colspan&amp;#039;, &amp;#039;5&amp;#039;):wikitext(&amp;#039;Defence Bonuses&amp;#039;):done()&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;):attr(&amp;#039;colspan&amp;#039;, &amp;#039;6&amp;#039;):wikitext(&amp;#039;Other&amp;#039;):done()&lt;br /&gt;
		&lt;br /&gt;
	if(useComments) then&lt;br /&gt;
		header:tag(&amp;#039;th&amp;#039;):attr(&amp;#039;rowspan&amp;#039;, &amp;#039;2&amp;#039;):wikitext(&amp;#039;Comment&amp;#039;):done()&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	tabl:tag(&amp;#039;tr&amp;#039;):tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;[[File:White dagger.png|link=|Stab attack]]&amp;#039;):done()&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;[[File:White scimitar.png|link=|Slash attack]]&amp;#039;):done()&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;[[File:White warhammer.png|link=|Crush attack]]&amp;#039;):done()&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;[[File:Magic icon.png|link=|Magic attack]]&amp;#039;):done()&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;[[File:Ranged icon.png|link=|Ranged attack]]&amp;#039;):done()&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;[[File:White dagger.png|link=|Stab defence]]&amp;#039;):done()&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;[[File:White scimitar.png|link=|Slash defence]]&amp;#039;):done()&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;[[File:White warhammer.png|link=|Crush defence]]&amp;#039;):done()&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;[[File:Magic icon.png|link=|Magic defence]]&amp;#039;):done()&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;[[File:Ranged icon.png|link=|Ranged defence]]&amp;#039;):done()&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;[[File:Strength icon.png|link=|Melee strength]]&amp;#039;):done()&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;[[File:Magic Damage icon.png|link=|Magic damage]]&amp;#039;):done()&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;[[File:Ranged Strength icon.png|link=|Ranged strength]]&amp;#039;):done()&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;[[File:Prayer icon.png|link=|Prayer bonus]]&amp;#039;):done()&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;[[File:Weight icon.png|link=|Weight]]&amp;#039;):done()&lt;br /&gt;
		:tag(&amp;#039;th&amp;#039;):wikitext(&amp;#039;[[File:Member icon.png|link=|Members]]&amp;#039;):done()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Is there a faster way to do this?&lt;br /&gt;
function sortPagesToInputOrder(pages, data)&lt;br /&gt;
	local pageLoc = {}&lt;br /&gt;
	for i, page in ipairs(pages) do&lt;br /&gt;
		pageLoc[page] = i&lt;br /&gt;
	end&lt;br /&gt;
	local ret = {}&lt;br /&gt;
	for i, v in ipairs(data) do&lt;br /&gt;
		if(pageLoc[v.name] == nil) then&lt;br /&gt;
			error(v.name .. &amp;#039; is spelled wrong or does not match any input&amp;#039;)&lt;br /&gt;
		else&lt;br /&gt;
			ret[pageLoc[v.name]] = v&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p._main(args)&lt;br /&gt;
	&lt;br /&gt;
	local pages = {}&lt;br /&gt;
	for _, page in ipairs(args) do -- Iternates through unnamed args&lt;br /&gt;
		if(string.find(page, &amp;quot;_&amp;quot;)) then&lt;br /&gt;
			page = string.gsub(page, &amp;#039;_&amp;#039;, &amp;quot; &amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		table.insert(pages, trim(page))&lt;br /&gt;
	end&lt;br /&gt;
	assert(#pages &amp;gt; 0, &amp;#039;You must specify at least one item&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	local keys = {}&lt;br /&gt;
	if(paramTest.has_content(args[&amp;#039;sort&amp;#039;])) then&lt;br /&gt;
		for key in gsplit(args[&amp;#039;sort&amp;#039;], &amp;#039;,&amp;#039;, true) do&lt;br /&gt;
			table.insert(keys, trim(key))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	if(yesNo(keys[1], true)) then&lt;br /&gt;
		for _, key in ipairs(keys) do&lt;br /&gt;
			assert(contains(sortKey, key), &amp;#039;Invalid sorting key:&amp;quot;&amp;#039; .. key .. &amp;#039;&amp;quot;&amp;#039; .. tostring(yesNo(keys[1])))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local orders = {}&lt;br /&gt;
	if(paramTest.has_content(args.order)) then&lt;br /&gt;
		for order in gsplit(args.order, &amp;#039;,&amp;#039;, true) do&lt;br /&gt;
			table.insert(orders, trim(order))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
	for _, order in ipairs(orders) do&lt;br /&gt;
		assert(contains(sortOrder, order), &amp;#039;Invalid sorting order:&amp;#039; .. order)&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	assert(#orders == #keys or #orders == 0 or #keys == 0, &amp;#039;The number of sort orders must match the number of sort keys or either can be zero&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	local useComments = false&lt;br /&gt;
	local comments = {}&lt;br /&gt;
	for i = 1, #pages, 1 do&lt;br /&gt;
		comment = args[&amp;#039;comment&amp;#039;..tostring(i)]&lt;br /&gt;
		if(paramTest.has_content(comment)) then&lt;br /&gt;
			comments[i] = comment&lt;br /&gt;
			useComments = true&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local noHeader = yesNo(paramTest.default_to(args.noheader, false), false)&lt;br /&gt;
	local noTotals = yesNo(paramTest.default_to(args.nototals, false), false)&lt;br /&gt;
	local expensive = yesNo(paramTest.default_to(args.expensive, false), false)&lt;br /&gt;
	local columnWidth = paramTest.has_content(args.colwidth) and &amp;#039;width:&amp;#039; .. args.colwidth or nil&lt;br /&gt;
	local itemWidth = paramTest.has_content(args.itemwidth) and &amp;#039;width:&amp;#039; .. args.itemwidth or nil&lt;br /&gt;
	&lt;br /&gt;
	-- Checks if any input pages are redirects, invalid (red links), or duplicates of other page inputs.&lt;br /&gt;
	-- !!This is a resource expensive test, only use temporarily or site-wide for the purpose of maintenance.&lt;br /&gt;
	if(args.expensive) then&lt;br /&gt;
		local check = pageListCheck(pages)&lt;br /&gt;
&lt;br /&gt;
		if((#check.invalid &amp;gt; 0) or (#check.redirect &amp;gt; 0) or (#check.duplicate &amp;gt; 0)) then&lt;br /&gt;
			local msg = string.format(&amp;#039;Of the %d pages requested %d are non-existent (%s), %d are redirects (%s), and %d are duplicates (%s).&amp;#039;,&lt;br /&gt;
				#pages,&lt;br /&gt;
				#check.invalid, (#check.invalid &amp;gt; 0) and listToText(check.invalid, &amp;#039;, &amp;#039;, &amp;#039; and &amp;#039;) or &amp;#039;&amp;#039;,&lt;br /&gt;
				#check.redirect, (#check.redirect &amp;gt; 0) and listToText(check.redirect, &amp;#039;, &amp;#039;, &amp;#039; and &amp;#039;) or &amp;#039;&amp;#039;,&lt;br /&gt;
				#check.duplicate, (#check.duplicate &amp;gt; 0) and listToText(check.duplicate, &amp;#039;, &amp;#039;, &amp;#039; and &amp;#039;) or &amp;#039;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
			return error(msg .. &amp;#039;[[Category:Infotable Bonuses with multi-variant items]]&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Fetch the data&lt;br /&gt;
	local data = equipmentStats(pages, keys, orders)&lt;br /&gt;
&lt;br /&gt;
	-- Check for pages that are missing from the data. Sorting in SMW can lead to pages being removed from the results&lt;br /&gt;
	--  due to the page not having the property that is being sorted, or the property is set to a nil value.&lt;br /&gt;
	if(#data &amp;lt; #pages) then&lt;br /&gt;
		-- Find all pages not found by equipmentStats&lt;br /&gt;
		local pageListing = {}&lt;br /&gt;
		for _, page in ipairs(pages) do&lt;br /&gt;
			pageListing[page] = &amp;#039;&amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
		for _, pageData in ipairs(data) do&lt;br /&gt;
			if(pageListing[pageData.name]) then&lt;br /&gt;
				pageListing[pageData.name] = nil&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
		local pageList = &amp;#039;&amp;#039;&lt;br /&gt;
		for key, _ in pairs(pageListing) do&lt;br /&gt;
			pageList = pageList .. key .. &amp;#039; &amp;#039;&lt;br /&gt;
		end&lt;br /&gt;
	&lt;br /&gt;
		local msg = string.format(&amp;#039;Of the %i pages requested, there is %i missing.(%s)%s&amp;#039;,&lt;br /&gt;
			#pages, #pages - #data, pageList,&lt;br /&gt;
			(#keys &amp;gt; 0) and &amp;#039; Try temporarily disabling sorting to see which items might have multiple variants.&amp;#039; or &amp;#039;&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
		error(msg .. &amp;#039;[[Category:Infotable Bonuses with multi-variant items]]&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Check for items with multiple variants&lt;br /&gt;
	for _, pageData in ipairs(data) do&lt;br /&gt;
		-- Hijacking this loop to clean up the name parameter on page&amp;#039;s with subobjects that contain underscores (smw adds an underscore)&lt;br /&gt;
		--  This is faster than gsub on every name&lt;br /&gt;
		if(string.find(pageData.name, &amp;quot;_&amp;quot;)) then&lt;br /&gt;
			pageData.name = string.gsub(pageData.name, &amp;#039;_&amp;#039;, &amp;quot; &amp;quot;)&lt;br /&gt;
		end&lt;br /&gt;
		if(pageData[&amp;#039;subobj&amp;#039;]) then&lt;br /&gt;
			local msg = string.format(&amp;#039;Item \&amp;#039;[[%s]]\&amp;#039; have multiple variants; please specify one of them: %s&amp;#039;,&lt;br /&gt;
				pageData[&amp;#039;name&amp;#039;], listToText(pageData[&amp;#039;subobj&amp;#039;], &amp;#039;, &amp;#039;, &amp;#039; or &amp;#039;))&lt;br /&gt;
			error(msg .. tostring(&amp;#039;[[Category:Infotable Bonuses with multi-variant items]]&amp;#039;))&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if((#orders == 0) and (#keys == 0)) then&lt;br /&gt;
		data = sortPagesToInputOrder(pages, data)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local ret = mw.html.create(&amp;#039;table&amp;#039;):addClass(&amp;#039;wikitable sortable infotable-bonuses align-center-1 align-left-2 align-right-3 align-right-4 align-right-5 align-right-6 align-right-7 align-right-8 align-right-9 align-right-10 align-right-11 align-right-12 align-right-13 align-right-14 align-right-15 align-right-16 align-right-17 align-center-18&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	if(not noHeader) then&lt;br /&gt;
		createHeader(ret, useComments)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- See sortKey for labels, members is excluded&lt;br /&gt;
	local totals = {&lt;br /&gt;
		0, 0, 0, 0, 0,&lt;br /&gt;
		0, 0, 0, 0, 0,&lt;br /&gt;
		0, 0, 0, 0, 0,&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	local rowCount = 0&lt;br /&gt;
	for i, pageData in ipairs(data) do&lt;br /&gt;
		row, totals = buildRow(pageData, totals, columnWidth, itemWidth, useComments, comments[i])&lt;br /&gt;
		ret:node(row)&lt;br /&gt;
		rowcount = rowCount + 1&lt;br /&gt;
	end&lt;br /&gt;
	if(rowCount == #pages) then&lt;br /&gt;
		error(&amp;#039;The number of inputs does not match the output. &amp;#039; .. math.max(#pages, rowCount) - math.min(#pages, rowCount) .. &amp;#039; items affected.&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
		&lt;br /&gt;
	if(not noTotals) then&lt;br /&gt;
		totalsFooter(ret, totals, useComments)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	return p._main(args)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--[[ DEBUG =&lt;br /&gt;
mw.logObject( p.loadData({&amp;#039;Beach boxing gloves#Yellow&amp;#039;, &amp;#039;Boxing gloves#Red&amp;#039;}, {}, {}) )&lt;br /&gt;
mw.logObject( p.loadData({&amp;#039;Iron pickaxe&amp;#039;, &amp;#039;Steel pickaxe&amp;#039;}, {&amp;#039;arange&amp;#039;, &amp;#039;drange&amp;#039;}, {&amp;#039;desc&amp;#039;, &amp;#039;desc&amp;#039;}) )&lt;br /&gt;
= p._main({&amp;#039;Verac\&amp;#039;s brassard#Undamaged&amp;#039;, &amp;#039;Verac\&amp;#039;s flail#Undamaged&amp;#039;, &amp;#039;Verac\&amp;#039;s helm#Undamaged&amp;#039;, &amp;#039;Verac\&amp;#039;s plateskirt#Undamaged&amp;#039;})&lt;br /&gt;
= p._main({&amp;#039;3rd age full helmet&amp;#039;, &amp;#039;3rd age platebody&amp;#039;, &amp;#039;3rd age platelegs&amp;#039;, &amp;#039;3rd age kiteshield&amp;#039;, &amp;#039;3rd age longsword&amp;#039;, sort=&amp;#039;dstab,str&amp;#039;, order=&amp;#039;asc,asc&amp;#039;})&lt;br /&gt;
--]]&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Hefner</name></author>
	</entry>
</feed>