Module:Tabber/OfferingTable: Difference between revisions
From Growtopia
Jump to navigationJump to search
>HashJona Created page with "local getArgs = require('Module:Arguments').getArgs local p = {} local ARGS_ODER = { 'qty', 'item1', 'item2', 'item3', 'item4' }; local TIER_ORDER = { 'C', 'U', 'R', 'E' } local TIER_LABEL = { E = 'Epic', R = 'Rare', U = 'Uncommon', C = 'Common' } local function parseLine(line) local parts = mw.text.split(line, '|', true) local page = table.remove(parts, 1) local kv = { page = page } for _, field in ipairs(parts) do local k, v = field:match('^(%w+)%=(.*..." |
>Vijuki |
||
| (11 intermediate revisions by 2 users not shown) | |||
| Line 1: | Line 1: | ||
local p = {} | local p = {} | ||
local | local ARGS_ORDER = { 'qty', 'item1', 'item2', 'item3', 'item4' }; | ||
local TIER_ORDER = { 'C', 'U', 'R', 'E' } | local TIER_ORDER = { 'C', 'U', 'R', 'E' } | ||
local TIER_LABEL = { | local TIER_LABEL = { | ||
| Line 10: | Line 9: | ||
C = 'Common' | C = 'Common' | ||
} | } | ||
local function isBlank(s) | |||
return not s or mw.text.trim(s) == '' | |||
end | |||
local function parseLine(line) | local function parseLine(line) | ||
local parts = mw.text.split(line, '|', true) | |||
local page = table.remove(parts, 1) | |||
local kv = { page = page } | |||
for _, field in ipairs(parts) do | |||
local k, v = field:match('^(%w+)%=(.*)$') | |||
if k then kv[k] = v end | |||
end | |||
kv.tier = (kv.tier or ''):upper() | |||
if isBlank(kv['item1']) then | |||
kv.isEmpty = true | |||
end | |||
kv.qty = tonumber(kv.qty or '') or 1 | |||
return kv | |||
end | end | ||
local function | local function expandCell(frame, r) | ||
local args = {} | |||
for _, key in ipairs(ARGS_ORDER) do | |||
table.insert(args, r[key] or '') | |||
end | |||
args.A = r.connector1 | |||
args.B = r.connector2 | |||
args.C = r.connector3 | |||
args.D = r.connector4 | |||
return frame:expandTemplate{ title = 'TableCell/OfferingTable', args = args } | |||
end | end | ||
function p.build_tabber(frame) | function p.build_tabber(frame) | ||
local args = frame.args | |||
local data = args.data or '' | |||
local debug_flag = args['debug'] or frame.args['debug'] or 0 | |||
if debug_flag == '1' then | |||
return '<pre>' .. data .. '</pre>' | |||
end | end | ||
local buckets = { E = {}, R = {}, U = {}, C = {} } | |||
for line in mw.text.gsplit(data, '\n', true) do | |||
line = mw.text.trim(line) | |||
if line ~= '' then | |||
local row = parseLine(line) | |||
if buckets[row.tier] then table.insert(buckets[row.tier], row) end | |||
end | |||
end | |||
for _, rows in pairs(buckets) do | |||
table.sort(rows, function(a, b) | |||
if a.isEmpty ~= b.isEmpty then | |||
return a.isEmpty and not b.isEmpty | |||
end | |||
return a.page < b.page | |||
end) | |||
end | |||
local tabs = {} | |||
for _, tier in ipairs(TIER_ORDER) do | |||
local rows = buckets[tier] | |||
if #rows > 0 then | |||
local out = {} | |||
table.insert(out, '{{TableHeader|Item|Offering Requirements}}') | |||
for _, r in ipairs(rows) do | |||
local item = frame:expandTemplate{ title = 'ItemLink', args = { r.page } } | |||
local req = expandCell(frame, r) | |||
table.insert(out, '|-') | |||
table.insert(out, '| ' .. item) | |||
table.insert(out, '| ' .. req) | |||
end | |||
table.insert(out, '{{TableFooter}}') | |||
table.insert(tabs, TIER_LABEL[tier] .. '=' .. table.concat(out, '\n')) | |||
end | |||
end | |||
if #tabs == 0 then return '' end | |||
return mw.getCurrentFrame():preprocess('<tabber>\n' .. table.concat(tabs, '\n|-|\n') .. '\n</tabber>') | |||
end | end | ||
return p | return p | ||
Latest revision as of 20:38, 27 September 2025
Documentation for this module may be created at Module:Tabber/OfferingTable/doc
local p = {}
local ARGS_ORDER = { 'qty', 'item1', 'item2', 'item3', 'item4' };
local TIER_ORDER = { 'C', 'U', 'R', 'E' }
local TIER_LABEL = {
E = 'Epic',
R = 'Rare',
U = 'Uncommon',
C = 'Common'
}
local function isBlank(s)
return not s or mw.text.trim(s) == ''
end
local function parseLine(line)
local parts = mw.text.split(line, '|', true)
local page = table.remove(parts, 1)
local kv = { page = page }
for _, field in ipairs(parts) do
local k, v = field:match('^(%w+)%=(.*)$')
if k then kv[k] = v end
end
kv.tier = (kv.tier or ''):upper()
if isBlank(kv['item1']) then
kv.isEmpty = true
end
kv.qty = tonumber(kv.qty or '') or 1
return kv
end
local function expandCell(frame, r)
local args = {}
for _, key in ipairs(ARGS_ORDER) do
table.insert(args, r[key] or '')
end
args.A = r.connector1
args.B = r.connector2
args.C = r.connector3
args.D = r.connector4
return frame:expandTemplate{ title = 'TableCell/OfferingTable', args = args }
end
function p.build_tabber(frame)
local args = frame.args
local data = args.data or ''
local debug_flag = args['debug'] or frame.args['debug'] or 0
if debug_flag == '1' then
return '<pre>' .. data .. '</pre>'
end
local buckets = { E = {}, R = {}, U = {}, C = {} }
for line in mw.text.gsplit(data, '\n', true) do
line = mw.text.trim(line)
if line ~= '' then
local row = parseLine(line)
if buckets[row.tier] then table.insert(buckets[row.tier], row) end
end
end
for _, rows in pairs(buckets) do
table.sort(rows, function(a, b)
if a.isEmpty ~= b.isEmpty then
return a.isEmpty and not b.isEmpty
end
return a.page < b.page
end)
end
local tabs = {}
for _, tier in ipairs(TIER_ORDER) do
local rows = buckets[tier]
if #rows > 0 then
local out = {}
table.insert(out, '{{TableHeader|Item|Offering Requirements}}')
for _, r in ipairs(rows) do
local item = frame:expandTemplate{ title = 'ItemLink', args = { r.page } }
local req = expandCell(frame, r)
table.insert(out, '|-')
table.insert(out, '| ' .. item)
table.insert(out, '| ' .. req)
end
table.insert(out, '{{TableFooter}}')
table.insert(tabs, TIER_LABEL[tier] .. '=' .. table.concat(out, '\n'))
end
end
if #tabs == 0 then return '' end
return mw.getCurrentFrame():preprocess('<tabber>\n' .. table.concat(tabs, '\n|-|\n') .. '\n</tabber>')
end
return p