Module:DropsLine

-- local p = {}

local params = require('Module:Paramtest') local lang = mw.language.getContentLanguage local commas = function (n) return lang:formatNum(n) end

local geprice = require('Module:Exchange')._price local ref = require('Module:Reftag')

local rarities = { always = {'#AFEEEE',1}, common = {'#56E156',2}, uncommon = {'#FFED4C',3}, rare = {'#FF863C',4}, ['very rare'] = {'#FF6262',5}, random = {'#FFA3FF',6}, varies = {'#FFA3FF',6} }

function p.main(frame) local args = frame:getParent.args -- Params and defaults local name,namenotes, quantity,quantitynotes, rarity,raritynotes = params.defaults{ {args.Name,'Item'}, {args.Namenotes,''}, {args.Quantity,'unknown'}, {args.Quantitynotes,''}, {args.Rarity,'unknown'}, {args.Raritynotes,''} }	local raritynotes = args.Raritynotes or '' rarity = params.ucflc(rarity) quantity = quantity:lower local gemw = string.lower(args.gemw or 'yes') == 'yes' local price local alt = false -- Test for existence of an exchange page local hasgemw if gemw then hasgemw, price = pcall(geprice,name) elseif args.AltValue then price = args.AltValue:gsub(',','') alt = true end -- Clean up price price = tonumber(price,10) or false

-- Use 'File: .png' if no image param -- Use 'File: ' if image param; image param will include extension -- Special catch for coins local image,image_n if name:lower == 'coins' then image_n = coins_image(quantity) else image_n = params.default_to(args.Image, name .. '.png') end if image_n:lower == 'no' or params.is_empty(args.Name) then image = '' else image = '' end -- Table row local ret = p._main{ name, namenotes, quantity, quantitynotes, rarity, raritynotes, price, alt, image, gemw, hasgemw }

-- categories for mainspace local cats = '' local ns = mw.title.getCurrentTitle.nsText if ns == '' then cats = categories{name,quantity,rarity} end return ret..cats end

function p._main(...) local name,namenotes, quantity,quantitynotes, rarity,raritynotes, price,alt,image,gemw,hasgemw = unpack(...) local rare_bg, rare_sort = unpack(rarities[rarity:lower] or {'#FFFFFF',8}) local total quantity, total = qty(price,quantity) name = ..name..

if #namenotes > 3 then name = name..' '..namenotes end if #quantitynotes > 3 then quantity = quantity..' '..quantitynotes end if #raritynotes > 3 then rarity = rarity..' '..raritynotes end

-- Table row creation local ret = mw.html.create('tr') :css('text-align','center') :tag('td') :wikitext(image) :done :tag('td') :css('text-align','left') :wikitext(name) :done :tag('td') :wikitext(quantity) :done :tag('td') :attr('data-sort-value',rare_sort) :css('background',rare_bg) :wikitext(rarity) :done if gemw and hasgemw and not alt then ret	:tag('td') :attr('title',commas(price)..' coins each') :wikitext(total) :done elseif gemw and not hasgemw then ret	:tag('td') :tag('span') :attr('title','Exchange page not found for "'..name:gsub('[%[%]]','')..'". Aadd "gemw=no" to this template if this item cannot be traded on the Grand Exchange or ignore this error and wait for the exchange page to be made.') :css({ color = '#FF0000',						cursor = 'help',						['border-bottom'] = '1px dashed',						['font-weight'] = 'bold' }) :wikitext('Error') :done :done elseif alt then ret	:tag('td') :wikitext(total..ref{ name='DropsLineAltValueRef',					text='This item has a distinct value, even if it cannot be traded over the Grand Exchange.'}) :done else ret	:tag('td') :wikitext('Not sold') :done end return tostring(ret) end

function qty(price,quantity) -- if no quantity is given, return unknown and the price if not quantity or quantity == 'unknown' then return 'Unknown', price end -- en dashes are the proper dash for number ranges -- replace all hyphens and em dashes with en	-- strip *all* whitespace -- change '(noted)' to '$n' for parsing quantity = mw.ustring.gsub(quantity,'[-—]','–') :gsub('%s','') :gsub('%(noted%)','$n') -- split list into table local vals = mw.text.split(quantity,'[,;]') -- All prices ranges will be a range -- e.g. if items valued at 100 coins are dropped in quantities of 1, 3, 5 -- the price will be 100–500 rather than 100; 300; 500 -- If low and high vars are the same in the end, only 1 price is displayed local low = 2147483648 local high = 0 -- recreate the quantity string to ensure consistent formatting local numstr = {} for i, v in ipairs(vals) do		local clean = v:gsub('$n','') -- if list element contains an en dash (indicating range) -- Find the smaller/larger number (just in case) -- Compare them to the current min/max -- put them in order with desired format if mw.ustring.find(v,'–') then local splitvals = mw.text.split(clean,'–') -- assume a is smaller, b is larger local a = tonumber(splitvals[1]) local b = tonumber(splitvals[2]) -- Just in case if a > b then a,b = b,a end if a < low then low = a			end if b > high then high = b			end local addx = commas(a)..'–'..commas(b) if v:find('$n') then addx = addx..' (noted)' end table.insert(numstr,addx) else local a = tonumber(clean) if a < low then low = a			end if a > high then high = a			end local addx = commas(a) if v:find('$n') then addx = addx..' (noted)' end table.insert(numstr,addx) end end -- Add a line break if there are too many elements -- To keep the tables thin if #numstr > 11 then local mid = math.floor(#numstr/2) numstr[mid] = ' '..numstr[mid] end -- To prevent any possible confusion with formatted numbers -- elements should be separated with semicolons followed by a space numstr = table.concat(numstr,'; ') -- If no numbers are found in the string, return unknown if not numstr:find('%d') then return 'Unknown', price end

local qtys

if high == low then qtys = { high = high } else qtys = { low = low, high = high } end

local priceret = get_price(price,qtys) return numstr, priceret end

-- function to parse the quantity ranges and give a price range -- also returns the desired format function get_price(price,quantity) local ttl if not price then ttl = 'Not sold' elseif not quantity.low then ttl = price * quantity.high ttl = commas(ttl) else local lower = price * quantity.low local higher = price * quantity.high ttl = commas(lower) .. '–' .. commas(higher) end return ttl end

-- Special function for coin images function coins_image(q) q = mw.text.split(q,'[,%-–]') local max_q = 1 for _, v in ipairs(q) do		if (tonumber(v) or 0) > max_q then max_q = tonumber(v) end end -- From Module:Coins (mostly) for _, j in ipairs( { 10000, 1000, 250, 100, 25, 5, 4, 3, 2 } ) do		if max_q >= j then max_q = j			break end end return 'Coins '..max_q..'.png' end

-- adding categories to mainspace function categories(...) local name,quantity,rarity = unpack(...) local ret = '' name = name:lower quantity = quantity:lower if name:find('effigy') then ret = ret .. ''	elseif name:find('clue scroll') then ret = ret .. ''	end if not rarities[rarity:lower] then ret = ret .. ''	end if quantity:find('Unknown') then ret = ret .. ''	end return ret end

return p