Documentation for this module may be created at Module:ItemDropsLine/doc
-- <pre>
local p = {}
local params = require('Module:Paramtest')
local lang = mw.language.getContentLanguage()
local commas = function (n) return lang:formatNum(tonumber(n)) end
--bg, txt, sort
local rarities = {
always = {'#8FD7FA !important', '#083F66', 1},
common = {'#98E553 !important', '#245200', 2},
uncommon = {'#F5EB4E !important', '#524E00', 3},
rare = {'#F6AB58 !important', '#582E00', 4},
['very rare'] = {'#F86C67 !important', '#520800', 5},
random = {'#F3BFF3 !important', '#801B80', 6},
varies = {'#F3BFF3 !important', '#801B80', 6},
discontinued = {'#CFCFCF !important', '#464646', 7}
}
function p.main(frame)
local args = frame:getParent().args
-- Params and defaults
local name,namenotes,
combat,cbnotes,
quantity,quantitynotes,
rarity,raritynotes = params.defaults{
{args.Monster,'monster'},
{args.Namenotes,''},
{args.Combat,nil},
{args.cbnotes,''},
{args.Quantity,'unknown'},
{args.Quantitynotes,''},
{args.Rarity,'Unknown'},
{args.Raritynotes,''}
}
rarity = params.ucflc(rarity)
quantity = quantity:lower()
-- Table row
return p._main{name,
namenotes,
combat,
cbnotes,
quantity,
quantitynotes,
rarity,
raritynotes}
end
function p._main(...)
local name,namenotes,
combat,cbnotes,
quantity,quantitynotes,
rarity,raritynotes = unpack(...)
local rare_bg, rare_txt, rare_sort = unpack(rarities[rarity:lower()] or {'#FFFFFF !important', '#000000', 8})
-- Clean up the lists
quantity = qty(quantity)
local qtysort = mw.text.split(quantity, '%D')[1]
if qtysort == '' then
qtysort = 0
end
combat = cmb(combat)
name = '[['..name..']]'
if #namenotes > 5 then
name = name..' '..namenotes
end
if #cbnotes > 5 then
combat = combat..' '..cbnotes
end
if #quantitynotes > 5 then
quantity = quantity..' '..quantitynotes
end
if #raritynotes > 5 then
rarity = rarity..' '..raritynotes
end
-- Table row creation
local ret = mw.html.create('tr')
:css('text-align','center')
:tag('td')
:css('text-align','left')
:wikitext(name)
:done()
:tag('td')
:wikitext(combat)
:done()
:tag('td')
:attr('data-sort-value', qtysort)
:wikitext(quantity)
:done()
:tag('td')
:attr('data-sort-value',rare_sort)
:css({background = rare_bg, color = rare_txt})
:wikitext(rarity)
:done()
return ret:done()
end
function qty(quantity)
-- if no quantity is given, return unknown
if not quantity or quantity == 'unknown' then
return 'Unknown'
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,'[,;]')
-- 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
addx = commas(a)..'–'..commas(b)
if v:find('$n') then
addx = addx..' (noted)'
end
table.insert(numstr,addx)
else
local addx = tonumber(clean) ~= nil and commas(tonumber(clean)) or clean
if v:find('$n') then
addx = addx..' (noted)'
end
table.insert(numstr,addx)
end
end
-- To prevent any possible confusion with formatted numbers
-- elements should be separated with semicolons followed by a space
numstr = table.concat(numstr,'; ')
if numstr:find('%d') then
return numstr
else
return 'Unknown'
end
end
function cmb(levels)
-- if no level is given, return unknown
if not levels then
return 'Unknown'
end
-- split list into table
local vals = mw.text.split(levels,'[,;]')
-- recreate the list string to ensure consistent formatting
local numstr = {}
for i, v in ipairs(vals) do
table.insert(numstr,v)
end
table.sort(numstr,function (a,b)
a = tonumber(a) or 0
b = tonumber(b) or 0
return a < b
end)
-- To prevent any possible confusion with formatted numbers
-- elements should be separated with semicolons followed by a space
return table.concat(numstr,'; ')
end
return p