<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.darkan.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AExchange</id>
	<title>Module:Exchange - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.darkan.org/index.php?action=history&amp;feed=atom&amp;title=Module%3AExchange"/>
	<link rel="alternate" type="text/html" href="https://wiki.darkan.org/index.php?title=Module:Exchange&amp;action=history"/>
	<updated>2026-07-17T12:42:06Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.46.0</generator>
	<entry>
		<id>https://wiki.darkan.org/index.php?title=Module:Exchange&amp;diff=174271&amp;oldid=prev</id>
		<title>Jawarrior1: Created page with &quot;--fuse2=Gets the value of item named arg }} -- -- &lt;pre&gt; -- -- Implements various exchange templates -- See Individual method docs for more details -- -- See also: -- - Module:ExchangeData -- - Module:ExchangeDefault --  local p = {}  -- only load commonly used modules here local yesno = require( &#039;Module:Y...&quot;</title>
		<link rel="alternate" type="text/html" href="https://wiki.darkan.org/index.php?title=Module:Exchange&amp;diff=174271&amp;oldid=prev"/>
		<updated>2024-02-13T20:26:00Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;--[[ {{Helper module|name=Exchange |fname1=_price(arg) |ftype1=String |fuse1=Gets the current median price of item named arg |fname2=_value(arg) |ftype2=String |fuse2=Gets the value of item named arg }} --]] -- &amp;lt;pre&amp;gt; -- -- Implements various exchange templates -- See Individual method docs for more details -- -- See also: -- - &lt;a href=&quot;/Module:ExchangeData&quot; title=&quot;Module:ExchangeData&quot;&gt;Module:ExchangeData&lt;/a&gt; -- - &lt;a href=&quot;/Module:ExchangeDefault&quot; title=&quot;Module:ExchangeDefault&quot;&gt;Module:ExchangeDefault&lt;/a&gt; --  local p = {}  -- only load commonly used modules here local yesno = require( &amp;#039;Module:Y...&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;
{{Helper module|name=Exchange&lt;br /&gt;
|fname1=_price(arg)&lt;br /&gt;
|ftype1=String&lt;br /&gt;
|fuse1=Gets the current median price of item named arg&lt;br /&gt;
|fname2=_value(arg)&lt;br /&gt;
|ftype2=String&lt;br /&gt;
|fuse2=Gets the value of item named arg&lt;br /&gt;
}}&lt;br /&gt;
--]]&lt;br /&gt;
-- &amp;lt;pre&amp;gt;&lt;br /&gt;
--&lt;br /&gt;
-- Implements various exchange templates&lt;br /&gt;
-- See Individual method docs for more details&lt;br /&gt;
--&lt;br /&gt;
-- See also:&lt;br /&gt;
-- - [[Module:ExchangeData]]&lt;br /&gt;
-- - [[Module:ExchangeDefault]]&lt;br /&gt;
--&lt;br /&gt;
&lt;br /&gt;
local p = {}&lt;br /&gt;
&lt;br /&gt;
-- only load commonly used modules here&lt;br /&gt;
local yesno = require( &amp;#039;Module:Yesno&amp;#039; )&lt;br /&gt;
local addcommas = require( &amp;#039;Module:Addcommas&amp;#039; )._add&lt;br /&gt;
&lt;br /&gt;
-- map redirects to their correct pages&lt;br /&gt;
local geRedirects = {&lt;br /&gt;
    [&amp;#039;1/2 anchovy pizza&amp;#039;] = &amp;#039;½ anchovy pizza&amp;#039;,&lt;br /&gt;
    [&amp;#039;1/2 meat pizza&amp;#039;] = &amp;#039;½ meat pizza&amp;#039;,&lt;br /&gt;
    [&amp;quot;1/2 p&amp;#039;apple pizza&amp;quot;] = &amp;quot;½ p&amp;#039;apple pizza&amp;quot;,&lt;br /&gt;
    [&amp;#039;1/2 plain pizza&amp;#039;] = &amp;#039;½ plain pizza&amp;#039;,&lt;br /&gt;
    [&amp;#039;1/3 evil turnip&amp;#039;] = &amp;#039;⅓ evil turnip&amp;#039;,&lt;br /&gt;
    [&amp;#039;1/3 blue blubber jellyfish&amp;#039;] = &amp;#039;⅓ blue blubber jellyfish&amp;#039;,&lt;br /&gt;
    [&amp;#039;1/3 green blubber jellyfish&amp;#039;] = &amp;#039;⅓ green blubber jellyfish&amp;#039;,&lt;br /&gt;
    [&amp;#039;2/3 cake&amp;#039;] = &amp;#039;⅔ cake&amp;#039;,&lt;br /&gt;
    [&amp;#039;2/3 chocolate cake&amp;#039;] = &amp;#039;⅔ chocolate cake&amp;#039;,&lt;br /&gt;
    [&amp;#039;2/3 evil turnip&amp;#039;] = &amp;#039;⅔ evil turnip&amp;#039;,&lt;br /&gt;
    [&amp;#039;2/3 blue blubber jellyfish&amp;#039;] = &amp;#039;⅔ blue blubber jellyfish&amp;#039;,&lt;br /&gt;
    [&amp;#039;2/3 green blubber jellyfish&amp;#039;] = &amp;#039;⅔ green blubber jellyfish&amp;#039;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Makes sure first letter of item is uppercase&lt;br /&gt;
-- Automatically handles any redirects&lt;br /&gt;
--&lt;br /&gt;
local function checkTitle( item )&lt;br /&gt;
    -- upper case first letter to make sure we can find a valid item page&lt;br /&gt;
    item = mw.text.split( item, &amp;#039;&amp;#039; )&lt;br /&gt;
    item[1] = mw.ustring.upper( item[1] )&lt;br /&gt;
    item = table.concat( item )&lt;br /&gt;
&lt;br /&gt;
    -- automatically handle redirects&lt;br /&gt;
    if geRedirects[item] ~= nil then&lt;br /&gt;
        item = geRedirects[item]&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return item&lt;br /&gt;
end&lt;br /&gt;
--&lt;br /&gt;
-- Simple mw.loadData wrapper used to access data located on module subpages&lt;br /&gt;
--&lt;br /&gt;
-- @param item {string} Item to retrieve data for&lt;br /&gt;
-- @return {table} Table of item data&lt;br /&gt;
--&lt;br /&gt;
local function load( item )&lt;br /&gt;
    item = checkTitle( item )&lt;br /&gt;
    local noErr, ret = pcall( mw.loadData, &amp;#039;Module:Exchange/&amp;#039; .. item )&lt;br /&gt;
&lt;br /&gt;
    if noErr then&lt;br /&gt;
        return ret&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    error( ret )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Returns the price of an item&lt;br /&gt;
--&lt;br /&gt;
-- @param item {string} Item to get current price of&lt;br /&gt;
-- @param multi {number} (optional) Multiplies the output price by the specified number&lt;br /&gt;
-- @param format {boolean} (optional) Format the result with commas (defaults to false)&lt;br /&gt;
-- @param round {number} (optional) Round the result to a number of decimal places&lt;br /&gt;
-- @return {number|string} Price of item. Will return a string if formatted, else a number.&lt;br /&gt;
--&lt;br /&gt;
function p._price( item, multi, format, round )&lt;br /&gt;
    local price = load( item ).price&lt;br /&gt;
    local multi = type( multi ) == &amp;#039;number&amp;#039; and multi or 1&lt;br /&gt;
    local format = type( format ) == &amp;#039;boolean&amp;#039; and format or false&lt;br /&gt;
    local ret = price * multi&lt;br /&gt;
    &lt;br /&gt;
    -- round the number to X d.p.&lt;br /&gt;
    if round ~= nil then&lt;br /&gt;
        local multi = 10^( round )&lt;br /&gt;
        ret = math.floor( ret * multi + 0.5 ) / multi&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if format then&lt;br /&gt;
        return addcommas( ret )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return ret&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Returns the limit of an item&lt;br /&gt;
--&lt;br /&gt;
-- @param item {string} Item to get the limit of&lt;br /&gt;
-- @return {number} Limit of item&lt;br /&gt;
--&lt;br /&gt;
function p._limit( item )&lt;br /&gt;
    return load( item ).limit&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Returns the value of an item&lt;br /&gt;
--&lt;br /&gt;
-- @param item {string} Item to get the value or&lt;br /&gt;
-- @return {number} Value of item&lt;br /&gt;
--&lt;br /&gt;
function p._value( item )&lt;br /&gt;
    return load( item ).value&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Calculates the difference between the current price and the last price of an item&lt;br /&gt;
--&lt;br /&gt;
-- @param item {string} Item to calculate price difference for&lt;br /&gt;
-- @param format {boolean} `true` if the output is to be formatted with commas&lt;br /&gt;
--                         Defaults to `false`&lt;br /&gt;
-- @return {number|string} The price difference as a number&lt;br /&gt;
--                         If `format` is set to `true` then this returns a string&lt;br /&gt;
--                         If either of the prices to calculate the diff from are unavailable, this returns `0` (number)&lt;br /&gt;
--&lt;br /&gt;
function p._diff( item, format )&lt;br /&gt;
    local data = load( item )&lt;br /&gt;
    local diff = 0&lt;br /&gt;
&lt;br /&gt;
    if data.price and data.last then&lt;br /&gt;
        diff = data.price - data.last&lt;br /&gt;
&lt;br /&gt;
        if format then&lt;br /&gt;
            diff = addcommas( diff )&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return diff&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- {{GEItem}} internal method&lt;br /&gt;
--&lt;br /&gt;
-- @todo merge into p.table&lt;br /&gt;
--&lt;br /&gt;
-- @param item {string} Item to get data for&lt;br /&gt;
-- @return {string}&lt;br /&gt;
--&lt;br /&gt;
function p._table( item )&lt;br /&gt;
    -- load data and any required modules&lt;br /&gt;
    local item = checkTitle( item )&lt;br /&gt;
    local data = load( item )&lt;br /&gt;
    local timeago = require( &amp;#039;Module:TimeAgo&amp;#039; )._ago&lt;br /&gt;
    local changeperday = require( &amp;#039;Module:ChangePerDay&amp;#039; )._change&lt;br /&gt;
&lt;br /&gt;
    -- set variables here to make the row building easier to follow&lt;br /&gt;
    local div = &amp;#039;&amp;lt;i&amp;gt;Unknown&amp;lt;/i&amp;gt;&amp;#039;&lt;br /&gt;
    local limit = data.limit and addcommas( data.limit ) or &amp;#039;&amp;lt;i&amp;gt;Unknown&amp;lt;/i&amp;gt;&amp;#039;&lt;br /&gt;
    local members = &amp;#039;&amp;lt;i&amp;gt;Unknown&amp;lt;/i&amp;gt;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
    if data.last then&lt;br /&gt;
        local link = &amp;#039;http://services.runescape.com/m=itemdb_rs/viewitem.ws?obj=&amp;#039; .. data.itemId&lt;br /&gt;
        local change = math.abs( changeperday( {data.price, data.last, data.date, data.lastDate} ) )&lt;br /&gt;
&lt;br /&gt;
        if data.price &amp;gt; data.last then&lt;br /&gt;
            arrow = &amp;#039;[[File:Up.png|link=&amp;#039; .. link .. &amp;#039;]]&amp;#039;&lt;br /&gt;
        elseif data.price &amp;lt; data.last then&lt;br /&gt;
            arrow = &amp;#039;[[File:Down.png|link=&amp;#039; .. link .. &amp;#039;]]&amp;#039;&lt;br /&gt;
        else&lt;br /&gt;
            arrow = &amp;#039;[[File:Unchg.png|link=&amp;#039; .. link .. &amp;#039;]]&amp;#039;&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if change &amp;gt;= 0.04 then&lt;br /&gt;
            arrow = arrow  .. arrow .. arrow&lt;br /&gt;
        elseif change &amp;gt;= 0.02 then&lt;br /&gt;
            arrow = arrow .. arrow&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        div = mw.html.create( &amp;#039;div&amp;#039; )&lt;br /&gt;
            :css( &amp;#039;white-space&amp;#039;, &amp;#039;nowrap&amp;#039; )&lt;br /&gt;
            :wikitext( arrow )&lt;br /&gt;
&lt;br /&gt;
        div = tostring( div )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if data.members == true then&lt;br /&gt;
        members = &amp;#039;[[File:P2P icon.png|30px|link=Members]]&amp;#039;&lt;br /&gt;
    elseif data.members == false then&lt;br /&gt;
        members = &amp;#039;[[File:F2P icon.png|30px|link=Free-to-play]]&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- build table row&lt;br /&gt;
    local tr = mw.html.create( &amp;#039;tr&amp;#039; )&lt;br /&gt;
        :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
            :wikitext( &amp;#039;[[File:&amp;#039; .. item .. &amp;#039;.png|&amp;#039; .. item .. &amp;#039;]]&amp;#039; )&lt;br /&gt;
            :done()&lt;br /&gt;
        :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
            :css( {&lt;br /&gt;
                [&amp;#039;width&amp;#039;] = &amp;#039;15%&amp;#039;,&lt;br /&gt;
                [&amp;#039;text-align&amp;#039;] = &amp;#039;left&amp;#039;&lt;br /&gt;
            } )&lt;br /&gt;
            :wikitext( &amp;#039;[[&amp;#039; .. item .. &amp;#039;]]&amp;#039; )&lt;br /&gt;
            :done()&lt;br /&gt;
        :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
            :wikitext( addcommas( data.price ) )&lt;br /&gt;
            :done()&lt;br /&gt;
        :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
            :wikitext( div )&lt;br /&gt;
            :done()&lt;br /&gt;
&lt;br /&gt;
    if data.alchable == nil or yesno( data.alchable ) then&lt;br /&gt;
        local low, high = &amp;#039;&amp;lt;i&amp;gt;Unknown&amp;lt;/i&amp;gt;&amp;#039;, &amp;#039;&amp;lt;i&amp;gt;Unknown&amp;lt;/i&amp;gt;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
        if data.value then&lt;br /&gt;
            low = addcommas( math.floor( data.value * 0.4 ) )&lt;br /&gt;
            high = addcommas( math.floor( data.value * 0.6 ) )&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        tr&lt;br /&gt;
            :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
                :wikitext( low )&lt;br /&gt;
                :done()&lt;br /&gt;
            :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
                :wikitext( high )&lt;br /&gt;
                :done()&lt;br /&gt;
    else&lt;br /&gt;
        tr&lt;br /&gt;
            :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
                :attr( &amp;#039;colspan&amp;#039;, &amp;#039;2&amp;#039; )&lt;br /&gt;
                :wikitext( &amp;#039;&amp;lt;i&amp;gt;Cannot be alchemised&amp;lt;/i&amp;gt;&amp;#039; )&lt;br /&gt;
                :done()&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    tr&lt;br /&gt;
        :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
            :wikitext( limit )&lt;br /&gt;
            :done()&lt;br /&gt;
        :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
            :wikitext( members )&lt;br /&gt;
            :done()&lt;br /&gt;
        :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
            :css( &amp;#039;white-space&amp;#039;, &amp;#039;nowrap&amp;#039; )&lt;br /&gt;
            :wikitext( &amp;#039;[[Exchange:&amp;#039; .. item .. &amp;#039;|view]]&amp;#039; )&lt;br /&gt;
            :done()&lt;br /&gt;
        :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
            :css( &amp;#039;font-size&amp;#039;, &amp;#039;85%&amp;#039; )&lt;br /&gt;
            :wikitext( timeago{data.date} )&lt;br /&gt;
            :done()&lt;br /&gt;
&lt;br /&gt;
    return tostring( tr )&lt;br /&gt;
&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- {{GEExists}}&lt;br /&gt;
--&lt;br /&gt;
function p.exists( frame )&lt;br /&gt;
    local args = frame:getParent().args&lt;br /&gt;
    local item = checkTitle( args[1] or &amp;#039;&amp;#039; )&lt;br /&gt;
    local noErr, data = pcall( mw.loadData, &amp;#039;Module:Exchange/&amp;#039; .. item )&lt;br /&gt;
&lt;br /&gt;
    if noErr then&lt;br /&gt;
        return &amp;#039;1&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return &amp;#039;0&amp;#039;&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- GEExists for modules&lt;br /&gt;
--&lt;br /&gt;
function p._exists( arg )&lt;br /&gt;
    local item = checkTitle( arg or &amp;#039;&amp;#039; )&lt;br /&gt;
    local noErr, data = pcall( mw.loadData, &amp;#039;Module:Exchange/&amp;#039; .. item )&lt;br /&gt;
&lt;br /&gt;
    if noErr then&lt;br /&gt;
        return true&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return false&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- Internal method for p.highAlchTable, p.lowAlchTable and p.genStoreTable&lt;br /&gt;
--&lt;br /&gt;
-- @param item {string} The name of the item&lt;br /&gt;
-- @param data {table} The item&amp;#039;s ge data&lt;br /&gt;
-- @param alch {number} The item&amp;#039;s alch/sell value&lt;br /&gt;
-- @param min {number} (optional) Sets the cap for amount of items that can be converted to gp per hour&lt;br /&gt;
-- @param natPrice {number} (optional) Sets the price of a Nature rune (set to `0` by `p.genStoreTable`)&lt;br /&gt;
--&lt;br /&gt;
local function alchTable( item, data, alch, min, natPrice )&lt;br /&gt;
    local timeago = require( &amp;#039;Module:TimeAgo&amp;#039; )._ago&lt;br /&gt;
    local round = require( &amp;#039;Module:Number&amp;#039; )._round&lt;br /&gt;
    -- gen store doesn&amp;#039;t need a nat price as it&amp;#039;s not used&lt;br /&gt;
    -- therefore we&amp;#039;d set it to 0&lt;br /&gt;
    local natPrice = natPrice or load( &amp;#039;Nature rune&amp;#039; ).price&lt;br /&gt;
    local profit = alch - data.price - natPrice&lt;br /&gt;
&lt;br /&gt;
    local image = &amp;#039;[[File:&amp;#039; .. item .. &amp;#039;.png|&amp;#039; .. item .. &amp;#039;]]&amp;#039;&lt;br /&gt;
    local itemStr = &amp;#039;[[&amp;#039; .. item .. &amp;#039;]]&amp;#039;&lt;br /&gt;
    local priceStr = addcommas( data.price )&lt;br /&gt;
    local alchStr = addcommas( alch )&lt;br /&gt;
    local profitStr = addcommas( profit )&lt;br /&gt;
    local roi = tostring( round( ( profit / ( data.price + natPrice ) * 100 ), 1 ) ) .. &amp;#039;%&amp;#039;&lt;br /&gt;
    local limit = data.limit and addcommas( data.limit ) or &amp;#039;&amp;lt;i&amp;gt;Unknown&amp;lt;/i&amp;gt;&amp;#039;&lt;br /&gt;
    local maxProfit = &amp;#039;&amp;lt;i&amp;gt;Unknown&amp;lt;/i&amp;gt;&amp;#039;&lt;br /&gt;
    local members = &amp;#039;&amp;lt;i&amp;gt;Unknown&amp;lt;/i&amp;gt;&amp;#039;&lt;br /&gt;
    local members_sortkey = 2&lt;br /&gt;
    local details = &amp;#039;[[Exchange:&amp;#039; .. item .. &amp;#039;|view]]&amp;#039;&lt;br /&gt;
    local lastUpdated = timeago{data.date}&lt;br /&gt;
&lt;br /&gt;
    if data.limit then&lt;br /&gt;
        -- cap at 4800, the maximum number of alchs that can be cast every 4 hours&lt;br /&gt;
        -- varies for general store rows&lt;br /&gt;
        min = min or 4800 &lt;br /&gt;
        min = ( data.limit &amp;gt; min ) and min or data.limit&lt;br /&gt;
        maxProfit = addcommas( min * profit )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    mw.log( maxProfit )&lt;br /&gt;
&lt;br /&gt;
    if data.members == true then&lt;br /&gt;
        members = &amp;#039;[[File:P2P icon.png|30px|link=Members]]&amp;#039;&lt;br /&gt;
        members_sortkey = 1&lt;br /&gt;
    elseif data.members == false then&lt;br /&gt;
        members = &amp;#039;[[File:F2P icon.png|30px|link=Free-to-play]]&amp;#039;&lt;br /&gt;
        members_sortkey = 0&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local tr = mw.html.create( &amp;#039;tr&amp;#039; )&lt;br /&gt;
        :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
            :wikitext( image )&lt;br /&gt;
            :done()&lt;br /&gt;
        :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
            :css( {&lt;br /&gt;
                width = &amp;#039;15%&amp;#039;,&lt;br /&gt;
                [&amp;#039;text-align&amp;#039;] = &amp;#039;left&amp;#039;&lt;br /&gt;
            } )&lt;br /&gt;
            :wikitext( itemStr )&lt;br /&gt;
            :done()&lt;br /&gt;
        :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
            :wikitext( priceStr )&lt;br /&gt;
            :done()&lt;br /&gt;
        :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
            :wikitext( alchStr )&lt;br /&gt;
            :done()&lt;br /&gt;
        :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
            :wikitext( profitStr )&lt;br /&gt;
            :done()&lt;br /&gt;
        :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
            :wikitext( roi )&lt;br /&gt;
            :done()&lt;br /&gt;
        :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
            :wikitext( limit )&lt;br /&gt;
            :done()&lt;br /&gt;
        :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
            :wikitext( maxProfit )&lt;br /&gt;
            :done()&lt;br /&gt;
        :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
            :wikitext( members )&lt;br /&gt;
            :attr(&amp;#039;data-sort-value&amp;#039;, members_sortkey)&lt;br /&gt;
            :done()&lt;br /&gt;
        :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
            :css( &amp;#039;white-space&amp;#039;, &amp;#039;nowrap&amp;#039; )&lt;br /&gt;
            :wikitext( details )&lt;br /&gt;
            :done()&lt;br /&gt;
        :tag( &amp;#039;td&amp;#039; )&lt;br /&gt;
            :css( &amp;#039;font-size&amp;#039;, &amp;#039;85%&amp;#039; )&lt;br /&gt;
            :wikitext( lastUpdated )&lt;br /&gt;
            :done()&lt;br /&gt;
&lt;br /&gt;
    return tostring( tr )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- {{HighAlchTableRow}}&lt;br /&gt;
--&lt;br /&gt;
-- @example {{HighAlchTableRow|&amp;lt;item&amp;gt;}}&lt;br /&gt;
--&lt;br /&gt;
function p.highAlchTable( frame )&lt;br /&gt;
    local args = frame:getParent().args&lt;br /&gt;
    local item = checkTitle( args[1] )&lt;br /&gt;
    local data = load( item )&lt;br /&gt;
    local alch = math.floor( data.value * 0.6 )&lt;br /&gt;
&lt;br /&gt;
    return alchTable( item, data, alch )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- {{LowAlchTableRow}}&lt;br /&gt;
--&lt;br /&gt;
-- @example {{LowAlchTableRow|&amp;lt;item&amp;gt;}}&lt;br /&gt;
--&lt;br /&gt;
function p.lowAlchTable( frame )&lt;br /&gt;
    local args = frame:getParent().args&lt;br /&gt;
    local item = checkTitle( args[1] )&lt;br /&gt;
    local data = load( item )&lt;br /&gt;
    local alch = math.floor( data.value * 0.4 )&lt;br /&gt;
&lt;br /&gt;
    return alchTable( item, data, alch )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- {{GenStoreTableRow}}&lt;br /&gt;
--&lt;br /&gt;
-- @example {{GenStoreTableRow|&amp;lt;item&amp;gt;}}&lt;br /&gt;
--&lt;br /&gt;
function p.genStoreTable( frame )&lt;br /&gt;
    local args = frame:getParent().args&lt;br /&gt;
    local item = checkTitle( args[1] )&lt;br /&gt;
    local data = load( item )&lt;br /&gt;
    local alch = math.floor( data.value * 0.3 )&lt;br /&gt;
&lt;br /&gt;
    return alchTable( item, data, alch, 50000, 0 )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- {{GEP}}&lt;br /&gt;
-- {{GEPrice}}&lt;br /&gt;
--&lt;br /&gt;
-- @example {{GEPrice|&amp;lt;item&amp;gt;|&amp;lt;format&amp;gt;|&amp;lt;multi&amp;gt;}}&lt;br /&gt;
-- @example {{GEPrice|&amp;lt;item&amp;gt;|&amp;lt;multi&amp;gt;}}&lt;br /&gt;
-- @example {{GEP|&amp;lt;item&amp;gt;|&amp;lt;multi&amp;gt;}}&lt;br /&gt;
--&lt;br /&gt;
function p.price( frame )&lt;br /&gt;
    -- usage: {{foo|item|format|multi}} or {{foo|item|multi}}&lt;br /&gt;
    local args = frame.args&lt;br /&gt;
    local pargs = frame:getParent().args&lt;br /&gt;
    local item = pargs[1]&lt;br /&gt;
    local expr = mw.ext.ParserFunctions.expr&lt;br /&gt;
    local round = tonumber( pargs.round )&lt;br /&gt;
&lt;br /&gt;
    if item then&lt;br /&gt;
        item = mw.text.trim( item )&lt;br /&gt;
    else&lt;br /&gt;
        error( &amp;#039;&amp;quot;item&amp;quot; argument not specified&amp;#039;, 0 )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    -- default to formatted for backwards compatibility with old GE templates&lt;br /&gt;
    local format = true&lt;br /&gt;
    local multi = 1&lt;br /&gt;
&lt;br /&gt;
    -- format is set with #invoke&lt;br /&gt;
    -- so set it first to allow it to be overridden by template args&lt;br /&gt;
    if args.format ~= nil then&lt;br /&gt;
        format = yesno( args.format )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if tonumber( pargs[2] ) ~= nil then&lt;br /&gt;
        multi = tonumber( pargs[2] )&lt;br /&gt;
&lt;br /&gt;
    -- indicated someone is trying to pass an equation as a mulitplier&lt;br /&gt;
    -- known use cases are fractions, but pass it to #expr to make sure it&amp;#039;s handled correctly&lt;br /&gt;
    elseif pargs[2] ~= nil and mw.ustring.find( pargs[2], &amp;#039;[/*+-]&amp;#039; ) then&lt;br /&gt;
        multi = tonumber( expr( pargs[2] ) )&lt;br /&gt;
&lt;br /&gt;
    -- uses elseif to prevent something like {{GEP|Foo|1}}&lt;br /&gt;
    -- causing a formatted output, as 1 casts to true when passed to yesno&lt;br /&gt;
    elseif type( yesno( pargs[2] ) ) == &amp;#039;boolean&amp;#039; then&lt;br /&gt;
        format = yesno( pargs[2] )&lt;br /&gt;
&lt;br /&gt;
        if tonumber( pargs[3] ) ~= nil then&lt;br /&gt;
            multi = tonumber( pargs[3] )&lt;br /&gt;
        end&lt;br /&gt;
    end &lt;br /&gt;
&lt;br /&gt;
    return p._price( item, multi, format, round )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- {{GEItem}}&lt;br /&gt;
--&lt;br /&gt;
-- @example {{GEItem|&amp;lt;item&amp;gt;}}&lt;br /&gt;
--&lt;br /&gt;
function p.table( frame )&lt;br /&gt;
    local args = frame:getParent().args&lt;br /&gt;
    local item = args[1]&lt;br /&gt;
&lt;br /&gt;
    if item then&lt;br /&gt;
        item = mw.text.trim( item )&lt;br /&gt;
    else&lt;br /&gt;
        error( &amp;#039;&amp;quot;item&amp;quot; argument not specified&amp;#039;, 0 )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return p._table( item )&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- experimental limit method for [[Grand Exchange/Buying Limits]]&lt;br /&gt;
--&lt;br /&gt;
function p.gemwlimit( frame )&lt;br /&gt;
    local item  = frame:getParent().args[1]&lt;br /&gt;
    local data = mw.loadData( &amp;#039;Module:Exchange/&amp;#039; .. item )&lt;br /&gt;
    &lt;br /&gt;
    return data.limit&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
--&lt;br /&gt;
-- {{ExchangeItem}}&lt;br /&gt;
-- {{GEDiff}}&lt;br /&gt;
-- {{GELimit}}&lt;br /&gt;
-- {{GEValue}}&lt;br /&gt;
-- {{GEId}}&lt;br /&gt;
--&lt;br /&gt;
-- @example {{ExchangeItem|&amp;lt;item&amp;gt;}}&lt;br /&gt;
-- @example {{GEDiff|&amp;lt;item&amp;gt;}}&lt;br /&gt;
-- @example {{GELimit|&amp;lt;item&amp;gt;}}&lt;br /&gt;
-- @example {{GEValue|&amp;lt;item&amp;gt;}}&lt;br /&gt;
-- @example {{GEId|&amp;lt;item&amp;gt;}}&lt;br /&gt;
--&lt;br /&gt;
function p.view( frame )&lt;br /&gt;
    local fargs = frame.args&lt;br /&gt;
    local pargs = frame:getParent().args&lt;br /&gt;
    local item = pargs[1] or fargs.item&lt;br /&gt;
    local view = fargs.view or &amp;#039;&amp;#039;&lt;br /&gt;
    local loadView = {limit=true, value=true, itemId=true, members=true, category=true, examine=true, alchable=true}&lt;br /&gt;
&lt;br /&gt;
    if item then&lt;br /&gt;
        item = mw.text.trim( item )&lt;br /&gt;
    else&lt;br /&gt;
        error( &amp;#039;&amp;quot;item&amp;quot; argument not specified&amp;#039;, 0 )&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    view = mw.ustring.lower( view )&lt;br /&gt;
&lt;br /&gt;
    if view == &amp;#039;itemid&amp;#039; then&lt;br /&gt;
        view = &amp;#039;itemId&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if view == &amp;#039;diff&amp;#039; then&lt;br /&gt;
        return p._diff( item )&lt;br /&gt;
&lt;br /&gt;
    elseif loadView[view] then&lt;br /&gt;
        return load( item )[view]&lt;br /&gt;
&lt;br /&gt;
    else&lt;br /&gt;
        local default = require( &amp;#039;Module:ExchangeDefault&amp;#039; )&lt;br /&gt;
        -- handle redirects and casing of item before passing it on&lt;br /&gt;
        item = checkTitle( item )&lt;br /&gt;
        return default.main( item )&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Jawarrior1</name></author>
	</entry>
</feed>