Module:ItemValues

local lang = mw.getLanguage('en') local p = {}

function p.main(frame) if frame == mw.getCurrentFrame then args = require('Module:ProcessArgs').merge(true) else frame = mw.getCurrentFrame end

local _limit = args.limit or 100

local cargoArgs = { orderBy = 'name', limit = _limit }

local cargoFields = { '_pageName', 'name', 'image', 'weight', 'buy', 'sell', 'objectid' }   local result = mw.ext.cargo.query(        'ItemData',        table.concat(cargoFields, ','),        cargoArgs    )

if not result[1] then return 'null result' end

local html = mw.html.create

local tbl = html:tag('table'):addClass('wikitable sortable')

local headerRow = tbl:tag('tr') headerRow:tag('th'):wikitext('Name') headerRow:tag('th'):wikitext('Value (price/weight)') headerRow:tag('th'):wikitext('Sell Price') headerRow:tag('th'):wikitext('Weight') headerRow:tag('th'):wikitext('Buy Price') headerRow:tag('th'):wikitext('Object ID')

for i, v in ipairs(result) do       if tonumber(v.weight) ~= nil and tonumber(v.sell) ~= nil then local weight = tonumber(v.weight) local price = tonumber(v.sell) local value = 0 if weight ~= 0 then value = price / weight else value = math.huge -- cannot divide by 0. But also, items with no weight are not sellable. end

value = round(value, 2)

if value ~= nil and value ~= math.huge and value ~= -math.huge then local tr = tbl:tag('tr') tr:tag('td'):wikitext(frame:preprocess(' ' .. v.name .. '')) tr:tag('td'):attr('data-sort-value', value):cssText('text-align: center'):wikitext(value .. 'x') tr:tag('td'):attr('data-sort-value', v.sell):cssText('text-align: center'):wikitext(frame:preprocess(v.sell .. ' '))               tr:tag('td'):attr('data-sort-value', v.weight):cssText('text-align: center'):wikitext(frame:preprocess(v.weight)) tr:tag('td'):attr('data-sort-value', v.buy):cssText('text-align: center'):wikitext(frame:preprocess(v.buy .. ' '))               tr:tag('td'):attr('data-sort-value', v.objectid):cssText('text-align: center'):wikitext(frame:preprocess(v.objectid)) end end end

return html end

function round(num, numDecimalPlaces) local mult = 10^(numDecimalPlaces or 0) return math.floor(num * mult + 0.5) / mult end

return p