<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.runerealm.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AInfobox_Item%2Fsandbox</id>
	<title>Module:Infobox Item/sandbox - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.runerealm.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AInfobox_Item%2Fsandbox"/>
	<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Infobox_Item/sandbox&amp;action=history"/>
	<updated>2026-05-05T15:19:33Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.41.1</generator>
	<entry>
		<id>https://wiki.runerealm.org/index.php?title=Module:Infobox_Item/sandbox&amp;diff=34993&amp;oldid=prev</id>
		<title>Alex: Created page with &quot;-------------------------- -- Module for Template:Infobox Item ------------------------ local p = {}  local infobox = require(&#039;Module:Infobox&#039;) local onmain = require(&#039;Module:Mainonly&#039;).on_main local commas = require(&#039;Module:Addcommas&#039;)._add local exchange = require(&#039;Module:Exchange&#039;) local chart = require(&#039;Module:ExchangeData&#039;)._chart VariablesLua = mw.ext.VariablesLua  function p.main(frame) 	local args = frame:getParent().args 	local ret = infobox.new(args)  	ret:...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.runerealm.org/index.php?title=Module:Infobox_Item/sandbox&amp;diff=34993&amp;oldid=prev"/>
		<updated>2024-10-16T23:12:18Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;-------------------------- -- Module for &lt;a href=&quot;/w/Template:Infobox_Item&quot; title=&quot;Template:Infobox Item&quot;&gt;Template:Infobox Item&lt;/a&gt; ------------------------ local p = {}  local infobox = require(&amp;#039;Module:Infobox&amp;#039;) local onmain = require(&amp;#039;Module:Mainonly&amp;#039;).on_main local commas = require(&amp;#039;Module:Addcommas&amp;#039;)._add local exchange = require(&amp;#039;Module:Exchange&amp;#039;) local chart = require(&amp;#039;Module:ExchangeData&amp;#039;)._chart VariablesLua = mw.ext.VariablesLua  function p.main(frame) 	local args = frame:getParent().args 	local ret = infobox.new(args)  	ret:...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;--------------------------&lt;br /&gt;
-- Module for [[Template:Infobox Item]]&lt;br /&gt;
------------------------&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
local infobox = require(&amp;#039;Module:Infobox&amp;#039;)&lt;br /&gt;
local onmain = require(&amp;#039;Module:Mainonly&amp;#039;).on_main&lt;br /&gt;
local commas = require(&amp;#039;Module:Addcommas&amp;#039;)._add&lt;br /&gt;
local exchange = require(&amp;#039;Module:Exchange&amp;#039;)&lt;br /&gt;
local chart = require(&amp;#039;Module:ExchangeData&amp;#039;)._chart&lt;br /&gt;
VariablesLua = mw.ext.VariablesLua&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
	local args = frame:getParent().args&lt;br /&gt;
	local ret = infobox.new(args)&lt;br /&gt;
&lt;br /&gt;
	ret:defineParams{&lt;br /&gt;
		{ name = &amp;#039;name&amp;#039;, func = &amp;#039;name&amp;#039; },&lt;br /&gt;
		{ name = &amp;#039;version&amp;#039;, func = &amp;#039;has_content&amp;#039; },&lt;br /&gt;
		{ name = &amp;#039;aka&amp;#039;, func = &amp;#039;has_content&amp;#039; },&lt;br /&gt;
		{ name = &amp;#039;image&amp;#039;, func = &amp;#039;image&amp;#039; },&lt;br /&gt;
		{ name = &amp;#039;image_smw&amp;#039;, func = { name = image_smw, params = { &amp;#039;image&amp;#039; }, flag = &amp;#039;p&amp;#039; } },&lt;br /&gt;
&lt;br /&gt;
		{ name = &amp;#039;release&amp;#039;, func = &amp;#039;release&amp;#039; },&lt;br /&gt;
		{ name = &amp;#039;removal&amp;#039;, func = &amp;#039;removal&amp;#039; },&lt;br /&gt;
		{ name = &amp;#039;members&amp;#039;, func = &amp;#039;has_content&amp;#039; },&lt;br /&gt;
		{ name = &amp;#039;quest&amp;#039;, func = &amp;#039;has_content&amp;#039; },&lt;br /&gt;
&lt;br /&gt;
		{ name = &amp;#039;tradeable&amp;#039;, func = tradeablearg },&lt;br /&gt;
		{ name = &amp;#039;bankable&amp;#039;, func = &amp;#039;has_content&amp;#039; },&lt;br /&gt;
		{ name = &amp;#039;stacksinbank&amp;#039;, func = &amp;#039;has_content&amp;#039; },&lt;br /&gt;
		{ name = &amp;#039;equipable&amp;#039;, func = &amp;#039;has_content&amp;#039; },&lt;br /&gt;
		{ name = &amp;#039;stackable&amp;#039;, func = &amp;#039;has_content&amp;#039; },&lt;br /&gt;
		{ name = &amp;#039;noteable&amp;#039;, func = &amp;#039;has_content&amp;#039; },&lt;br /&gt;
		{ name = &amp;#039;edible&amp;#039;, func = &amp;#039;has_content&amp;#039; },&lt;br /&gt;
		{ name = &amp;#039;options&amp;#039;, func = &amp;#039;has_content&amp;#039; },&lt;br /&gt;
		{ name = &amp;#039;wornoptions&amp;#039;, func = { name = wornoptionsarg, params = { &amp;#039;wornoptions&amp;#039; }, flag = &amp;#039;p&amp;#039; } },&lt;br /&gt;
		{ name = &amp;#039;destroy&amp;#039;, func = &amp;#039;has_content&amp;#039; },&lt;br /&gt;
		{ name = &amp;#039;examine&amp;#039;, func = &amp;#039;has_content&amp;#039; },&lt;br /&gt;
&lt;br /&gt;
		{ name = &amp;#039;raw_value&amp;#039;, func = { name = valraw, params = { &amp;#039;value&amp;#039; }, flag = &amp;#039;p&amp;#039; } },&lt;br /&gt;
		{ name = &amp;#039;value&amp;#039;, func = { name = valuearg, params = { &amp;#039;raw_value&amp;#039; } } },&lt;br /&gt;
&lt;br /&gt;
		{ name = &amp;#039;alchable&amp;#039;, func = { name = alchablearg, params = { &amp;#039;alchable&amp;#039; }, flag = &amp;#039;p&amp;#039; } },&lt;br /&gt;
		{ name = &amp;#039;high&amp;#039;, func = { name = alchvalues, params = { &amp;#039;raw_value&amp;#039;, 0.6, &amp;#039;alchable&amp;#039; }, flag = { &amp;#039;d&amp;#039;, &amp;#039;r&amp;#039;, &amp;#039;d&amp;#039; } } },&lt;br /&gt;
		{ name = &amp;#039;low&amp;#039;, func = { name = alchvalues, params = { &amp;#039;raw_value&amp;#039;, 0.4, &amp;#039;alchable&amp;#039; }, flag = { &amp;#039;d&amp;#039;, &amp;#039;r&amp;#039;, &amp;#039;d&amp;#039; } } },&lt;br /&gt;
		{ name = &amp;#039;high_smw&amp;#039;, func = { name = alchvalues_smw, params = { &amp;#039;raw_value&amp;#039;, 0.6, &amp;#039;alchable&amp;#039; }, flag = { &amp;#039;d&amp;#039;, &amp;#039;r&amp;#039;, &amp;#039;d&amp;#039; } } },&lt;br /&gt;
&lt;br /&gt;
		{ name = &amp;#039;raw_weight&amp;#039;, func = { name = weight_raw, params = { &amp;#039;weight&amp;#039; }, flag = &amp;#039;p&amp;#039; } },&lt;br /&gt;
		{ name = &amp;#039;weight&amp;#039;, func = weightarg },&lt;br /&gt;
		{ name = &amp;#039;respawn&amp;#039;, func = respawnarg },&lt;br /&gt;
&lt;br /&gt;
		{ name = &amp;#039;gemw&amp;#039;, func = { name = gemwarg, params = { &amp;#039;exchange&amp;#039; }, flag = {&amp;#039;p&amp;#039;, &amp;#039;d&amp;#039;} } },&lt;br /&gt;
		{ name = &amp;#039;gemwname&amp;#039;, func = { name = gemwnamearg, params = { &amp;#039;name&amp;#039;, &amp;#039;gemwname&amp;#039; } } },&lt;br /&gt;
		{ name = &amp;#039;gemwprice&amp;#039;, func = { name = gemwpricearg, params = { &amp;#039;gemw&amp;#039;, &amp;#039;gemwname&amp;#039; } } },&lt;br /&gt;
		{ name = &amp;#039;exchange&amp;#039;, func = { name = exchangearg, params = { &amp;#039;gemwprice&amp;#039;, &amp;#039;gemwname&amp;#039; } } },&lt;br /&gt;
		-- dupes = true allows the css class to hide rows on undefined verisions&lt;br /&gt;
		-- css class name to hide rows on undefined versions&lt;br /&gt;
		{ name = &amp;#039;gemwdisp&amp;#039;, func = { name = gemwdisp, params = { &amp;#039;gemwprice&amp;#039; } }, dupes = true },&lt;br /&gt;
		{ name = &amp;#039;buylimit&amp;#039;, func = { name = buylimitarg, params = { &amp;#039;gemwprice&amp;#039;, &amp;#039;gemwname&amp;#039; } }, dupes = true },&lt;br /&gt;
		{ name = &amp;#039;buylimit_smw&amp;#039;, func = { name = buylimit_smw, params = { &amp;#039;buylimit&amp;#039; } } },&lt;br /&gt;
		{ name = &amp;#039;volume&amp;#039;, func = { name = volumearg, params = { &amp;#039;gemwprice&amp;#039;, &amp;#039;gemwname&amp;#039; } }, dupes = true },&lt;br /&gt;
		{ name = &amp;#039;realtime&amp;#039;, func = { name = realtimearg, params = { &amp;#039;gemwprice&amp;#039;, &amp;#039;gemwname&amp;#039; } }, dupes = true},&lt;br /&gt;
		{ name = &amp;#039;graph&amp;#039;, func = { name = gemwgrapharg, params = { &amp;#039;gemwprice&amp;#039;, &amp;#039;gemwname&amp;#039; } } },&lt;br /&gt;
&lt;br /&gt;
        { name = &amp;#039;usesinfobox&amp;#039;, func = { name = tostring, params = { &amp;#039;Item&amp;#039; }, flag = &amp;#039;r&amp;#039; } },&lt;br /&gt;
		{ name = &amp;#039;id&amp;#039;, func = &amp;#039;has_content&amp;#039; },&lt;br /&gt;
		{ name = &amp;#039;id_smw&amp;#039;, func = { name = idsmw, params = { &amp;#039;id&amp;#039; }, flag = &amp;#039;p&amp;#039; } },&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	ret:setMaxButtons(10)&lt;br /&gt;
	ret:create()&lt;br /&gt;
	ret:cleanParams()&lt;br /&gt;
	ret:customButtonPlacement(true)&lt;br /&gt;
	ret:setDefaultVersionSMW(true)&lt;br /&gt;
&lt;br /&gt;
	-- adds the classname in &amp;#039;gemwdisp&amp;#039; to the rows containing &amp;#039;buylimit&amp;#039; and &amp;#039;volume&amp;#039;&lt;br /&gt;
	ret:linkParams{&lt;br /&gt;
		{ &amp;#039;buylimit&amp;#039;, &amp;#039;gemwdisp&amp;#039; },&lt;br /&gt;
		{ &amp;#039;volume&amp;#039;, &amp;#039;gemwdisp&amp;#039; },&lt;br /&gt;
		{ &amp;#039;realtime&amp;#039;, &amp;#039;gemwdisp&amp;#039; },&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	ret:defineLinks({ hide = true })&lt;br /&gt;
&lt;br /&gt;
	ret:useSMWOne({&lt;br /&gt;
		members = &amp;#039;All Is members only&amp;#039;,&lt;br /&gt;
		id_smw = &amp;#039;All Item ID&amp;#039;,&lt;br /&gt;
		image_smw = &amp;#039;All Image&amp;#039;,&lt;br /&gt;
		raw_weight = &amp;#039;All Weight&amp;#039;,&lt;br /&gt;
	})&lt;br /&gt;
&lt;br /&gt;
	ret:useSMWSubobject({&lt;br /&gt;
		version = &amp;#039;Version anchor&amp;#039;,&lt;br /&gt;
		release = &amp;#039;Release date&amp;#039;,&lt;br /&gt;
		id_smw = &amp;#039;Item ID&amp;#039;,&lt;br /&gt;
		examine = &amp;#039;Examine&amp;#039;,&lt;br /&gt;
		high_smw = &amp;#039;High Alchemy value&amp;#039;,&lt;br /&gt;
		members = &amp;#039;Is members only&amp;#039;,&lt;br /&gt;
		raw_value = &amp;#039;Value&amp;#039;,&lt;br /&gt;
		raw_weight = &amp;#039;Weight&amp;#039;,&lt;br /&gt;
		image_smw = &amp;#039;Image&amp;#039;,&lt;br /&gt;
		buylimit_smw = &amp;#039;Buy limit&amp;#039;,&lt;br /&gt;
		usesinfobox = &amp;#039;Uses infobox&amp;#039;,&lt;br /&gt;
	})&lt;br /&gt;
&lt;br /&gt;
	ret:addButtonsCaption()&lt;br /&gt;
&lt;br /&gt;
	ret:defineName(&amp;#039;Infobox Item&amp;#039;)&lt;br /&gt;
	ret:addClass(&amp;#039;infobox-item&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	ret:addRow{&lt;br /&gt;
		{ tag = &amp;#039;argh&amp;#039;, content = &amp;#039;name&amp;#039;, class=&amp;#039;infobox-header&amp;#039;, colspan = &amp;#039;20&amp;#039; }&lt;br /&gt;
	}&lt;br /&gt;
	:pad(20)&lt;br /&gt;
	:addRow{&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;image&amp;#039;, class = &amp;#039;infobox-image inventory-image infobox-full-width-content&amp;#039;, colspan = &amp;#039;20&amp;#039; }&lt;br /&gt;
	}&lt;br /&gt;
	:pad(20)&lt;br /&gt;
	:addRow{&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;Released&amp;#039;, colspan = &amp;#039;7&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;release&amp;#039;, colspan = &amp;#039;13&amp;#039; }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if ret:paramDefined(&amp;#039;removal&amp;#039;) then&lt;br /&gt;
		ret:addRow{&lt;br /&gt;
			{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;Removal&amp;#039;, colspan = &amp;#039;7&amp;#039; },&lt;br /&gt;
			{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;removal&amp;#039;, colspan = &amp;#039;13&amp;#039; }&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if ret:paramDefined(&amp;#039;aka&amp;#039;) then&lt;br /&gt;
		ret:addRow{&lt;br /&gt;
			{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;Also called&amp;#039;, colspan = &amp;#039;7&amp;#039; },&lt;br /&gt;
			{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;aka&amp;#039;, colspan = &amp;#039;13&amp;#039; }&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	ret:addRow{&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[Members]]&amp;#039;, colspan = &amp;#039;7&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;members&amp;#039;, colspan = &amp;#039;13&amp;#039; }&lt;br /&gt;
	}&lt;br /&gt;
	:addRow{&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[Quest items|Quest item]]&amp;#039;, colspan = &amp;#039;7&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;quest&amp;#039;, colspan = &amp;#039;13&amp;#039; }&lt;br /&gt;
	}&lt;br /&gt;
	:pad(20)&lt;br /&gt;
	:addRow{&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;Properties&amp;#039;, class = &amp;#039;infobox-subheader&amp;#039;, colspan = &amp;#039;20&amp;#039; }&lt;br /&gt;
	}&lt;br /&gt;
	:pad(20)&lt;br /&gt;
	:addRow{&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[Items#Tradeability|Tradeable]]&amp;#039;, colspan = &amp;#039;7&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;tradeable&amp;#039;, colspan = &amp;#039;13&amp;#039; }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if ret:paramDefined(&amp;#039;bankable&amp;#039;) then&lt;br /&gt;
		ret:addRow{&lt;br /&gt;
			{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[Bank]]able&amp;#039;, colspan = &amp;#039;7&amp;#039; },&lt;br /&gt;
			{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;bankable&amp;#039;, colspan = &amp;#039;13&amp;#039; }&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if ret:paramDefined(&amp;#039;stacksinbank&amp;#039;) then&lt;br /&gt;
		ret:addRow{&lt;br /&gt;
			{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;Stacks in bank&amp;#039;, colspan = &amp;#039;7&amp;#039; },&lt;br /&gt;
			{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;stacksinbank&amp;#039;, colspan = &amp;#039;13&amp;#039; }&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	ret:addRow{&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[Worn Equipment|Equipable]]&amp;#039;, colspan = &amp;#039;7&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;equipable&amp;#039;, colspan = &amp;#039;13&amp;#039; }&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	:addRow{&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[Stackable items|Stackable]]&amp;#039;, colspan = &amp;#039;7&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;stackable&amp;#039;, colspan = &amp;#039;13&amp;#039; }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	if ret:paramDefined(&amp;#039;noteable&amp;#039;) then&lt;br /&gt;
		ret:addRow{&lt;br /&gt;
			{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[Note|Noteable]]&amp;#039;, colspan = &amp;#039;7&amp;#039; },&lt;br /&gt;
			{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;noteable&amp;#039;, colspan = &amp;#039;13&amp;#039; }&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if ret:paramDefined(&amp;#039;edible&amp;#039;) then&lt;br /&gt;
		ret:addRow{&lt;br /&gt;
			{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[Food|Edible]]&amp;#039;, colspan = &amp;#039;7&amp;#039; },&lt;br /&gt;
			{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;edible&amp;#039;, colspan = &amp;#039;13&amp;#039; }&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	ret:addRow{&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[Choose Option|Options]]&amp;#039;, colspan = &amp;#039;7&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;options&amp;#039;, colspan = &amp;#039;13&amp;#039; }&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if ret:paramGrep(&amp;#039;equipable&amp;#039;, true) or ret:paramDefined(&amp;#039;wornoptions&amp;#039;) then&lt;br /&gt;
		ret:addRow{&lt;br /&gt;
			{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[Worn Equipment|Worn options]]&amp;#039;, colspan = &amp;#039;7&amp;#039; },&lt;br /&gt;
			{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;wornoptions&amp;#039;, colspan = &amp;#039;13&amp;#039; }&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if ret:paramDefined(&amp;#039;destroy&amp;#039;) then&lt;br /&gt;
		ret:addRow{&lt;br /&gt;
			{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[Destroy]]&amp;#039;, colspan = &amp;#039;7&amp;#039; },&lt;br /&gt;
			{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;destroy&amp;#039;, colspan = &amp;#039;13&amp;#039; }&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	ret:addRow{&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[Examine]]&amp;#039;, colspan = &amp;#039;7&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;examine&amp;#039;, colspan = &amp;#039;13&amp;#039; }&lt;br /&gt;
	}&lt;br /&gt;
	:pad(20)&lt;br /&gt;
	:addRow{&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;Values&amp;#039;, class = &amp;#039;infobox-subheader&amp;#039;, colspan = &amp;#039;20&amp;#039; }&lt;br /&gt;
	}&lt;br /&gt;
	:pad(20)&lt;br /&gt;
	:addRow{&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[Value]]&amp;#039;, colspan = &amp;#039;7&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;value&amp;#039;, colspan = &amp;#039;13&amp;#039; }&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	-- if any are alchable, add both rows&lt;br /&gt;
	if ret:paramGrep(&amp;#039;alchable&amp;#039;, true) then&lt;br /&gt;
		ret:addRow{&lt;br /&gt;
			{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[High Level Alchemy|High alch]]&amp;#039;, colspan = &amp;#039;7&amp;#039; },&lt;br /&gt;
			{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;high&amp;#039;, colspan = &amp;#039;13&amp;#039; }&lt;br /&gt;
		}&lt;br /&gt;
		:addRow{&lt;br /&gt;
			{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[Low Level Alchemy|Low alch]]&amp;#039;, colspan = &amp;#039;7&amp;#039; },&lt;br /&gt;
			{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;low&amp;#039;, colspan = &amp;#039;13&amp;#039; }&lt;br /&gt;
		}&lt;br /&gt;
	else&lt;br /&gt;
		-- otherwise add a single &amp;quot;no alch&amp;quot; row&lt;br /&gt;
		ret:addRow{&lt;br /&gt;
			{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[Alchemy]]&amp;#039;, colspan = &amp;#039;7&amp;#039; },&lt;br /&gt;
			{ tag = &amp;#039;td&amp;#039;, content = &amp;#039;Not alchemisable&amp;#039;, colspan = &amp;#039;13&amp;#039; }&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	ret:addRow{&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[Weight]]&amp;#039;, colspan = &amp;#039;7&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;weight&amp;#039;, colspan = &amp;#039;13&amp;#039; }&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	if ret:paramDefined(&amp;#039;respawn&amp;#039;) then&lt;br /&gt;
		ret:addRow{&lt;br /&gt;
			{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[Item respawns|Respawn time]]&amp;#039;, colspan = &amp;#039;7&amp;#039; },&lt;br /&gt;
			{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;respawn&amp;#039;, colspan = &amp;#039;13&amp;#039; }&lt;br /&gt;
		}&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	ret:pad(20)&lt;br /&gt;
&lt;br /&gt;
	-- if we have any on the ge, add the gemw row&lt;br /&gt;
	local anygemw = ret:paramGrep(&amp;#039;gemwprice&amp;#039;, function(x) return x &amp;gt; 0 end)&lt;br /&gt;
	if anygemw == true then&lt;br /&gt;
		ret:addRow{&lt;br /&gt;
			{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;Grand Exchange&amp;#039;, class = &amp;#039;infobox-subheader&amp;#039;, colspan = &amp;#039;20&amp;#039; }&lt;br /&gt;
		}&lt;br /&gt;
		:pad(20)&lt;br /&gt;
		:addRow{&lt;br /&gt;
			{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[RuneScape:Grand Exchange Market Watch|Exchange]]&amp;#039;, colspan = &amp;#039;7&amp;#039; },&lt;br /&gt;
			{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;exchange&amp;#039;, colspan = &amp;#039;13&amp;#039; }&lt;br /&gt;
		}&lt;br /&gt;
		:addRow{&lt;br /&gt;
			{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[Grand Exchange#Buy limits|Buy limit]]&amp;#039;, colspan = &amp;#039;7&amp;#039; },&lt;br /&gt;
			{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;buylimit&amp;#039;, colspan = &amp;#039;13&amp;#039; }&lt;br /&gt;
		}&lt;br /&gt;
		:addRow{&lt;br /&gt;
			{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;[[Grand Exchange#Volume|Daily volume]]&amp;#039;, colspan = &amp;#039;7&amp;#039; },&lt;br /&gt;
			{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;volume&amp;#039;, colspan = &amp;#039;13&amp;#039; }&lt;br /&gt;
		}&lt;br /&gt;
		:pad(20)&lt;br /&gt;
		:addRow{&lt;br /&gt;
			{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;realtime&amp;#039;, class = &amp;#039;infobox-full-width-content&amp;#039;, colspan = &amp;#039;20&amp;#039; }&lt;br /&gt;
		}&lt;br /&gt;
		:pad(20)&lt;br /&gt;
		:addRow{&lt;br /&gt;
			{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;graph&amp;#039;, class = &amp;#039;infobox-full-width-content&amp;#039;, colspan = &amp;#039;20&amp;#039; }&lt;br /&gt;
		}&lt;br /&gt;
		:pad(20)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	ret:addRow{&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;Advanced data&amp;#039;, class = &amp;#039;infobox-subheader&amp;#039;, colspan = &amp;#039;20&amp;#039; },&lt;br /&gt;
		meta = {addClass = &amp;#039;advanced-data&amp;#039;}&lt;br /&gt;
	}&lt;br /&gt;
	:pad(20, &amp;#039;advanced-data&amp;#039;)&lt;br /&gt;
	:addRow{&lt;br /&gt;
		{ tag = &amp;#039;th&amp;#039;, content = &amp;#039;Item ID&amp;#039;, colspan = &amp;#039;7&amp;#039; },&lt;br /&gt;
		{ tag = &amp;#039;argd&amp;#039;, content = &amp;#039;id&amp;#039;,  colspan = &amp;#039;13&amp;#039; },&lt;br /&gt;
		meta = {addClass = &amp;#039;advanced-data&amp;#039;}&lt;br /&gt;
	}&lt;br /&gt;
	:pad(20, &amp;#039;advanced-data&amp;#039;)&lt;br /&gt;
&lt;br /&gt;
	if onmain() then&lt;br /&gt;
		local a1 = ret:param(&amp;#039;all&amp;#039;)&lt;br /&gt;
		local a2 = ret:categoryData()&lt;br /&gt;
		ret:wikitext(addcategories(a1, a2))&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return ret:tostring()&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function tradeablearg(arg)&lt;br /&gt;
	if not infobox.isDefined(arg) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	arg = string.lower(arg)&lt;br /&gt;
	if arg == &amp;#039;yes&amp;#039; then&lt;br /&gt;
		return &amp;#039;Yes&amp;#039;&lt;br /&gt;
	elseif arg == &amp;#039;no&amp;#039; then&lt;br /&gt;
		return &amp;#039;No&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return arg&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function wornoptionsarg(arg)&lt;br /&gt;
	if not infobox.isDefined(arg) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	if string.lower(arg) == &amp;#039;none&amp;#039; or string.lower(arg) == &amp;#039;no&amp;#039; then&lt;br /&gt;
		return &amp;#039;None &amp;lt;sup class=&amp;quot;explain&amp;quot; title=&amp;quot;This item has no options when worn other than Remove and Examine.&amp;quot;&amp;gt;(?)&amp;lt;/sup&amp;gt;&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		return arg&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Return raw value as a number, or nil if not defined&lt;br /&gt;
function valraw(arg)&lt;br /&gt;
	if not infobox.isDefined(arg) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return tonumber(arg)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function valuearg(value)&lt;br /&gt;
	if not infobox.isDefined(value) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return plural(&amp;#039;coin&amp;#039;, value)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Return boolean true if alchable, false otherwise.&lt;br /&gt;
-- Nil/empty string is considered true&lt;br /&gt;
function alchablearg(arg)&lt;br /&gt;
	return string.lower(arg or &amp;#039;&amp;#039;) ~= &amp;#039;no&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function alchvalues(value, multiplier, alchable)&lt;br /&gt;
	if alchable == false then&lt;br /&gt;
		-- used in the case of 1 version being alchable and the other not&lt;br /&gt;
		return &amp;#039;Not alchemisable&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not infobox.isDefined(value) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local alch_value = math.floor(value * multiplier)&lt;br /&gt;
	return plural(&amp;#039;coin&amp;#039;, alch_value)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function alchvalues_smw(value, multiplier, alchable)&lt;br /&gt;
	if not infobox.isDefined(value) or not infobox.isDefined(alchable) or not alchable then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return math.floor(value * multiplier)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function weight_raw(arg)&lt;br /&gt;
	if not infobox.isDefined(arg) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if tonumber(arg) then&lt;br /&gt;
		return arg&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function weightarg(arg)&lt;br /&gt;
	if not infobox.isDefined(arg) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- if arg is a valid number, strip 0s and append kg&lt;br /&gt;
	if tonumber(arg) then&lt;br /&gt;
		return string.gsub(tonumber(arg), &amp;#039;%.0$&amp;#039;, &amp;#039;&amp;#039;) .. &amp;#039; kg&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- if arg isn&amp;#039;t a number, return it unmodified&lt;br /&gt;
	return arg&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function respawnarg(arg)&lt;br /&gt;
	if not infobox.isDefined(arg) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- if arg is a valid number, display ticks and seconds&lt;br /&gt;
	if tonumber(arg) then&lt;br /&gt;
		local plural = tonumber(arg) ~= 1 and &amp;#039;s&amp;#039; or &amp;#039;&amp;#039;&lt;br /&gt;
		return arg .. &amp;#039; tick&amp;#039; .. plural .. &amp;#039; (&amp;#039; .. arg * 0.6 .. &amp;#039; seconds)&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- if arg isn&amp;#039;t a number, return it unmodified&lt;br /&gt;
	return arg&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Return boolean true if item is on the GE&lt;br /&gt;
function gemwarg(exchange)&lt;br /&gt;
	return string.lower(exchange or &amp;#039;&amp;#039;) == &amp;#039;yes&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function gemwnamearg(name, gemwname)&lt;br /&gt;
	if infobox.isDefined(gemwname) then&lt;br /&gt;
		return gemwname&lt;br /&gt;
	elseif infobox.isDefined(name) then&lt;br /&gt;
		return name&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return mw.title.getCurrentTitle().fullText&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Return GE value&lt;br /&gt;
-- Returns 0 if item isn&amp;#039;t on GE, or -1 if exchange is set and the item isn&amp;#039;t found&lt;br /&gt;
function gemwpricearg(gemw, gemwname)&lt;br /&gt;
	if not gemw then&lt;br /&gt;
		return 0&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if not exchange._exists(gemwname) then&lt;br /&gt;
		return -1&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return tonumber(exchange._price(gemwname, nil, nil, nil, -1)) or -1&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- split items with multiple images for smw (e.g. [[File:Arrow 1.png]] [[File:Arrow 2.png]])&lt;br /&gt;
function image_smw(arg)&lt;br /&gt;
	local _img = {}&lt;br /&gt;
	for i in string.gmatch(arg, &amp;quot;[Ff]ile:.-%.png&amp;quot;) do&lt;br /&gt;
		table.insert(_img, i)&lt;br /&gt;
	end&lt;br /&gt;
	if #_img == 0 then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	return table.concat(_img, &amp;#039;&amp;amp;&amp;amp;SPLITPOINT&amp;amp;&amp;amp;&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function exchangearg(gemwprice, gemwname)&lt;br /&gt;
	if gemwprice == 0 then&lt;br /&gt;
		-- span is necessary or else the input box disappears&lt;br /&gt;
		return &amp;#039;&amp;lt;span class=&amp;quot;infobox-quantity&amp;quot; data-val-each=&amp;quot;0&amp;quot;&amp;gt;Not sold&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if gemwprice == -1 then&lt;br /&gt;
		return badarg(&amp;#039;exchange&amp;#039;, &amp;#039;was set to «gemw» but no page was found for «&amp;#039;..gemwname..&amp;#039;».&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return string.format(&amp;#039;&amp;lt;span class=&amp;quot;infobox-quantity&amp;quot; data-val-each=&amp;quot;%s&amp;quot;&amp;gt;&amp;lt;span class=&amp;quot;infobox-quantity-replace&amp;quot;&amp;gt;%s&amp;lt;/span&amp;gt; coin%s ([[Exchange:%s|info]])&amp;lt;/span&amp;gt;&amp;#039;, gemwprice, commas(gemwprice), gemwprice &amp;gt; 1 and &amp;#039;s&amp;#039; or &amp;#039;&amp;#039;, gemwname)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function gemwgrapharg(gemwprice, gemwname)&lt;br /&gt;
	if gemwprice == 0 then&lt;br /&gt;
		return &amp;#039;No data to display&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	if gemwprice == -1 then&lt;br /&gt;
		return badarg(&amp;#039;exchange&amp;#039;, &amp;#039;was set to «gemw» but no page was found for «&amp;#039;..gemwname..&amp;#039;».&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return chart{ items = gemwname, size = &amp;#039;small&amp;#039; }&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function buylimitarg(gemwprice, gemwname)&lt;br /&gt;
	-- 0 for not sold, -1 for error&lt;br /&gt;
	if gemwprice &amp;lt;= 0 then&lt;br /&gt;
		return &amp;#039;-&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local limit = exchange._limit(gemwname)&lt;br /&gt;
	if limit == nil then&lt;br /&gt;
		return &amp;#039;-&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return commas(limit)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function buylimit_smw(buylimit)&lt;br /&gt;
	if type(buylimit) == &amp;#039;string&amp;#039; then&lt;br /&gt;
		buylimit = buylimit:gsub(&amp;#039;,&amp;#039;, &amp;#039;&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	if tonumber(buylimit) then&lt;br /&gt;
		return tonumber(buylimit)&lt;br /&gt;
	end&lt;br /&gt;
	return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function volumearg(gemwprice, name)&lt;br /&gt;
	-- 0 for not sold, -1 for error&lt;br /&gt;
	if gemwprice &amp;lt;= 0 then&lt;br /&gt;
		return &amp;#039;-&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	local ret = exchange._volume(name)&lt;br /&gt;
	if ret == nil then&lt;br /&gt;
		return &amp;#039;-&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	return commas(ret)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function realtimearg(gemwprice, gemwname)&lt;br /&gt;
	if gemwprice &amp;lt;= 0 then&lt;br /&gt;
		return &amp;#039;-&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
	&lt;br /&gt;
	local gemw_id = exchange._itemId(gemwname)&lt;br /&gt;
	&lt;br /&gt;
	return &amp;#039;&amp;lt;div class=&amp;quot;realtime-prices plainlinks&amp;quot;&amp;gt;[https://prices.runescape.wiki/osrs/item/&amp;#039; .. gemw_id .. &amp;#039; &amp;lt;span class=&amp;quot;mw-ui-button realtime-ge-openbtn&amp;quot;&amp;gt;View real-time prices&amp;lt;/span&amp;gt;]&amp;lt;/div&amp;gt;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Return class to hide rows when item isn&amp;#039;t on GE&lt;br /&gt;
function gemwdisp(gemwprice)&lt;br /&gt;
	if gemwprice &amp;lt;= 0 then&lt;br /&gt;
		return &amp;#039;infobox-cell-hidden&amp;#039;&lt;br /&gt;
	else&lt;br /&gt;
		return &amp;#039;infobox-cell-shown&amp;#039;&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function idsmw(id)&lt;br /&gt;
	if not infobox.isDefined(id) then&lt;br /&gt;
		return nil&lt;br /&gt;
	end&lt;br /&gt;
	return string.gsub(id, &amp;#039;,&amp;#039;, &amp;#039;&amp;amp;&amp;amp;SPLITPOINT&amp;amp;&amp;amp;&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- red ERR span with title hover for explanation&lt;br /&gt;
function badarg(argname, argmessage)&lt;br /&gt;
	return &amp;#039;&amp;lt;span &amp;#039;..&lt;br /&gt;
			&amp;#039;title=&amp;quot;The parameter «&amp;#039;..argname..&amp;#039;» &amp;#039;..argmessage..&amp;#039;&amp;quot; &amp;#039;..&lt;br /&gt;
			&amp;#039;style=&amp;quot;color:red; font-weight:bold; cursor:help; border-bottom:1px dotted red;&amp;quot;&amp;gt;&amp;#039;..&lt;br /&gt;
			&amp;#039;ERR&amp;lt;/span&amp;gt;&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function plural(word, amount, alt_plural_word)&lt;br /&gt;
	local output_amount = commas(tonumber(amount) or 1)&lt;br /&gt;
	if tonumber(amount) == 1 then&lt;br /&gt;
		return string.format(&amp;#039;%s %s&amp;#039;, output_amount, word)&lt;br /&gt;
	elseif alt_plural_word then&lt;br /&gt;
		return string.format(&amp;#039;%s %s&amp;#039;, output_amount, alt_plural_word)&lt;br /&gt;
	else&lt;br /&gt;
		return string.format(&amp;#039;%s %ss&amp;#039;, output_amount, word)&lt;br /&gt;
	end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function has_three_decimals(weight)&lt;br /&gt;
	local decimals = string.match(weight, &amp;quot;%.(.*)&amp;quot;)&lt;br /&gt;
	if not decimals then&lt;br /&gt;
		return false&lt;br /&gt;
	end&lt;br /&gt;
	return string.len(decimals) == 3&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function addcategories(args, catargs)&lt;br /&gt;
	local ret = { &amp;#039;Items&amp;#039; }&lt;br /&gt;
	local cat_map = {&lt;br /&gt;
		-- Added if the parameter has content&lt;br /&gt;
		defined = {&lt;br /&gt;
			aka = &amp;#039;Pages with AKA&amp;#039;&lt;br /&gt;
		},&lt;br /&gt;
		-- Added if the parameter has no content&lt;br /&gt;
		notdefined = {&lt;br /&gt;
			image = &amp;#039;Needs image&amp;#039;,&lt;br /&gt;
			members = &amp;#039;Needs members status&amp;#039;,&lt;br /&gt;
			release = &amp;#039;Needs release date&amp;#039;,&lt;br /&gt;
			examine = &amp;#039;Needs examine added&amp;#039;,&lt;br /&gt;
			level = &amp;#039;Needs combat level&amp;#039;,&lt;br /&gt;
			weight = &amp;#039;Needs weight added&amp;#039;,&lt;br /&gt;
			value = &amp;#039;Items missing value&amp;#039;,&lt;br /&gt;
			quest = &amp;#039;Items missing quest&amp;#039;,&lt;br /&gt;
			options = &amp;#039;Needs options&amp;#039;,&lt;br /&gt;
			destroy = &amp;#039;Needs destroy text&amp;#039;,&lt;br /&gt;
			id = &amp;#039;Needs ID&amp;#039;,&lt;br /&gt;
		},&lt;br /&gt;
		-- Parameters that have text&lt;br /&gt;
		-- map a category to a value&lt;br /&gt;
		matches = {&lt;br /&gt;
			members = { yes = &amp;#039;Members\&amp;#039; items&amp;#039;, no = &amp;#039;Free-to-play items&amp;#039; },&lt;br /&gt;
			stackable = { yes = &amp;#039;Stackable items&amp;#039; },&lt;br /&gt;
			equipable = { yes = &amp;#039;Equipable items&amp;#039; },&lt;br /&gt;
			edible = { yes = &amp;#039;Edible items&amp;#039; },&lt;br /&gt;
			gemw = { [&amp;#039;true&amp;#039;] = &amp;#039;Grand Exchange items&amp;#039; },&lt;br /&gt;
			tradeable = { yes = &amp;#039;Tradeable items&amp;#039;, no = &amp;#039;Untradeable items&amp;#039; },&lt;br /&gt;
			bankable = { no = &amp;#039;Unbankable items&amp;#039; },&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	-- defined categories&lt;br /&gt;
	for n, v in pairs(cat_map.defined) do&lt;br /&gt;
		if catargs[n] and catargs[n].one_defined then&lt;br /&gt;
			table.insert(ret, v)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- undefined categories&lt;br /&gt;
	for n, v in pairs(cat_map.notdefined) do&lt;br /&gt;
		if catargs[n] and catargs[n].all_defined == false then&lt;br /&gt;
			table.insert(ret, v)&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- searches&lt;br /&gt;
	for n, v in pairs(cat_map.matches) do&lt;br /&gt;
		for m, w in pairs(v) do&lt;br /&gt;
			if args[n] then&lt;br /&gt;
				if string.lower(tostring(args[n].d) or &amp;#039;&amp;#039;) == m then&lt;br /&gt;
					table.insert(ret, w)&lt;br /&gt;
				end&lt;br /&gt;
				if args[n].switches then&lt;br /&gt;
					for _, x in ipairs(args[n].switches) do&lt;br /&gt;
						if string.lower(tostring(x)) == m then&lt;br /&gt;
							table.insert(ret, w)&lt;br /&gt;
						end&lt;br /&gt;
					end&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- quest items&lt;br /&gt;
	-- just look for a link&lt;br /&gt;
	if args.quest.d:find(&amp;#039;%[%[&amp;#039;) then&lt;br /&gt;
		table.insert(ret, &amp;#039;Quest items&amp;#039;)&lt;br /&gt;
	elseif args.quest.switches then&lt;br /&gt;
		for _, v in ipairs(args.quest.switches) do&lt;br /&gt;
			if v:find(&amp;#039;%[%[&amp;#039;) then&lt;br /&gt;
				table.insert(ret, &amp;#039;Quest items&amp;#039;)&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- ids&lt;br /&gt;
	if not catargs.id.all_defined then&lt;br /&gt;
		table.insert(ret, &amp;#039;Needs ID&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- alchemy&lt;br /&gt;
	-- non alchable&lt;br /&gt;
	if args.alchable.d == false or args.alchable.d == &amp;#039;false&amp;#039; then&lt;br /&gt;
		table.insert(ret, &amp;#039;Items that cannot be alchemised&amp;#039;)&lt;br /&gt;
	elseif args.alchable.switches then&lt;br /&gt;
		for _, v in ipairs(args.alchable.switches) do&lt;br /&gt;
			if v == false or v == &amp;#039;false&amp;#039; then&lt;br /&gt;
				table.insert(ret, &amp;#039;Items that cannot be alchemised&amp;#039;)&lt;br /&gt;
				break&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add Non-GE items if item is both (not GEMW) and tradeable&lt;br /&gt;
	-- Note: gemw values are boolean, tradeable values are &amp;quot;Yes&amp;quot;/&amp;quot;No&amp;quot; strings&lt;br /&gt;
	if not args.gemw.d and infobox.isDefined(args.tradeable.d) and string.lower(args.tradeable.d) ~= &amp;#039;no&amp;#039; then&lt;br /&gt;
		table.insert(ret, &amp;#039;Non-GE items&amp;#039;)&lt;br /&gt;
	end&lt;br /&gt;
	if args.gemw.switches then&lt;br /&gt;
		for i, v in ipairs(args.gemw.switches) do&lt;br /&gt;
			local tradeable_val = string.lower(args.tradeable.switches and args.tradeable.switches[i] or args.tradeable.d)&lt;br /&gt;
			if not v and infobox.isDefined(tradeable_val) and tradeable_val ~= &amp;#039;no&amp;#039; then&lt;br /&gt;
				table.insert(ret, &amp;#039;Non-GE items&amp;#039;)&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- Add category if the weight doesn&amp;#039;t have exactly 3 digits after the decimal&lt;br /&gt;
	if args[&amp;#039;raw_weight&amp;#039;] then&lt;br /&gt;
		if tonumber(args[&amp;#039;raw_weight&amp;#039;].d) and not has_three_decimals(args[&amp;#039;raw_weight&amp;#039;].d) then&lt;br /&gt;
			table.insert(ret, &amp;#039;Needs exact weight&amp;#039;)&lt;br /&gt;
		end&lt;br /&gt;
		if args[&amp;#039;raw_weight&amp;#039;].switches then&lt;br /&gt;
			for i, weight_i in ipairs(args[&amp;#039;raw_weight&amp;#039;].switches) do&lt;br /&gt;
				if tonumber(weight_i) and not has_three_decimals(weight_i) then&lt;br /&gt;
					table.insert(ret, &amp;#039;Needs exact weight&amp;#039;)&lt;br /&gt;
				end&lt;br /&gt;
			end&lt;br /&gt;
		end&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	-- combine table and format category wikicode&lt;br /&gt;
	for i, v in ipairs(ret) do&lt;br /&gt;
		ret[i] = string.format(&amp;#039;[[Category:%s]]&amp;#039;, v)&lt;br /&gt;
	end&lt;br /&gt;
&lt;br /&gt;
	return table.concat(ret, &amp;#039;&amp;#039;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Alex</name></author>
	</entry>
</feed>