Spineweilder (talk | contribs) No edit summary Tag: sourceedit |
Spineweilder (talk | contribs) No edit summary Tag: sourceedit |
||
(2 intermediate revisions by the same user not shown) | |||
Line 100: | Line 100: | ||
if #quantitynotes > 3 then |
if #quantitynotes > 3 then |
||
− | quantity = quantity..quantitynotes |
+ | quantity = quantity..' '..quantitynotes |
end |
end |
||
if #raritynotes > 3 then |
if #raritynotes > 3 then |
||
− | rarity = rarity..raritynotes |
+ | rarity = rarity..' '..raritynotes |
end |
end |
||
Latest revision as of 18:16, 26 May 2016
Documentation for this module may be created at Module:DropsLine/doc
-- <pre>
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')
--bg, txt, sort
local rarities = {
always = {'#AFEEEE', '#000000', 1},
common = {'#56E156', '#000000', 2},
uncommon = {'#FFED4C', '#000000', 3},
rare = {'#FF863C', '#000000', 4},
['very rare'] = {'#FF6262', '#000000', 5},
random = {'#FFA3FF', '#000000', 6},
varies = {'#FFA3FF', '#000000', 6},
discontinued = {'#DBFF4C', '#000000', 7}
}
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 altname = params.default_to(args.Alt,name)
local gemwname = params.default_to(args.gemwname,name)
local raritynotes = (args.Raritynotes or 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,gemwname)
elseif args.AltValue then
price = args.AltValue:gsub(',','')
alt = true
end
-- Clean up price
price = tonumber(price,10) or false
-- Use 'File:<name>.png' if no image param
-- Use 'File:<image>' 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 = '[[File:' .. image_n .. '|link=' .. name .. ']]'
end
-- Table row
local ret = p._main{ name,
altname,
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,altname,namenotes,
quantity,quantitynotes,
rarity,raritynotes,
price,alt,image,gemw,hasgemw = unpack(...)
local rare_bg, rare_txt, rare_sort = unpack(rarities[rarity:lower()] or {'#FFFFFF', '#000000', 8})
local total
quantity, total = qty(price,quantity)
if #quantitynotes > 3 then
quantity = quantity..' '..quantitynotes
end
if #raritynotes > 3 then
rarity = rarity..' '..raritynotes
end
-- Table row creation
local ret = '|- style="text-align:center;"' ..
'\n| ' .. image ..
'\n| style="text-align:left;" | [[' .. name .. ' | ' .. altname .. ']]' ..
(#namenotes > 3 and namenotes or '') ..
'\n| ' .. quantity ..
'\n| data-sort-value ="' .. rare_sort .. '" style="background:' .. rare_bg .. '; color:' .. rare_txt .. ';" | ' .. rarity
if gemw and hasgemw and not alt then
ret = ret .. '\n| title="' .. commas(price) .. ' coins each" | ' .. total
elseif gemw and not hasgemw then
ret = ret .. '\n| title="Exchange page not found for "' .. name .. '". Double check that the exact item name and casing is used for the "name" parameter. Add "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.' ..
' style="color:#FF0000; cursor:help; border-bottom:1px dashed; font-weight:bold;" | Error'
elseif alt then
ret = ret .. '\n| ' .. total..ref{ name='DropsLineAltValueRef',
text='This item has a distinct value, even if it cannot be traded over the [[Grand Exchange]].'}
else
ret = ret .. '\n| Not sold'
end
return 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] = '<br/>'..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 .. '[[Category:Effigy droppers]]'
elseif name:find('clue scroll') then
ret = ret .. '[[Category:Clue Drop Monsters]]'
end
if not rarities[rarity:lower()] then
ret = ret .. '[[Category:Needs drop rarity added]]'
end
if quantity:find('Unknown') then
ret = ret .. '[[Category:Needs drop quantity added]]'
end
return ret
end
return p