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
m Reverted edit by SBEyes (talk) to last revision by HashJona
 
(11 intermediate revisions by 2 users not shown)
Line 1: Line 1:
local getArgs = require('Module:Arguments').getArgs
local p = {}
local p = {}


local ARGS_ODER = { 'qty', 'item1', 'item2', 'item3', 'item4' };
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 parts = mw.text.split(line, '|', true)
  local page = table.remove(parts, 1)
local page = table.remove(parts, 1)
  local kv = { page = page }
local kv = { page = page }
  for _, field in ipairs(parts) do
for _, field in ipairs(parts) do
    local k, v = field:match('^(%w+)%=(.*)$')
local k, v = field:match('^(%w+)%=(.*)$')
    if k then kv[k] = v end
if k then kv[k] = v end
  end
end
  kv.tier = (kv.tier or ''):upper()
kv.tier = (kv.tier or ''):upper()
  kv.qty = tonumber(kv.qty or '') or 1
if isBlank(kv['item1']) then
  return kv
kv.isEmpty = true
end
kv.qty = tonumber(kv.qty or '') or 1
return kv
end
end


local function expandRow(frame, r)
local function expandCell(frame, r)
  local args = {}
local args = {}
  for _, key in ipairs(ARGS_ORDER) do
for _, key in ipairs(ARGS_ORDER) do
    table.insert(args, r[key] or '')
table.insert(args, r[key] or '')
  end
end
  args.A = r.connector[1]
args.A = r.connector1
  args.B = r.connector[2]
args.B = r.connector2
  args.C = r.connector[3]
args.C = r.connector3
  args.D = r.connector[4]
args.D = r.connector4


  return frame:expandTemplate{ title = 'TableCell/OfferingTable', args = args }  
return frame:expandTemplate{ title = 'TableCell/OfferingTable', args = args }  
end
end


function p.build_tabber(frame)
function p.build_tabber(frame)
  local args = getArgs(frame)
local args = frame.args
  local data = args.data or ''
local data = args.data or ''
 
local debug_flag = args['debug'] or frame.args['debug'] or 0
  local buckets = { E = {}, R = {}, U = {}, C = {} }
  for line in mw.text.gsplit(data, '\n', true) do
if debug_flag == '1' then  
    line = mw.text.trim(line)
      return '<pre>' .. data .. '</pre>'
    if line ~= '' then
      local row = parseLine(line)
      if buckets[row.tier] then table.insert(buckets[row.tier], row) end
     end
     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


for _, tier in ipairs(TIER_ORDER) do
local tabs = {}
    local rows = buckets[tier]
for _, tier in ipairs(TIER_ORDER) do
    if #rows > 0 then
local rows = buckets[tier]
      local out = {}
if #rows > 0 then
      table.insert(out, '{{TableHeader|Item|Offering Requirements}}')
local out = {}
      for _, r in ipairs(rows) do
table.insert(out, '{{TableHeader|Item|Offering Requirements}}')
        local item = frame:expandTemplate{ title = 'ItemLink', args = { r.page } }
for _, r in ipairs(rows) do
        local req = expandReqCell(frame, reqCellTemplate, r)
local item = frame:expandTemplate{ title = 'ItemLink', args = { r.page } }
        table.insert(out, '|-')
local req = expandCell(frame, r)
        table.insert(out, '| ' .. item)
table.insert(out, '|-')
        table.insert(out, '| ' .. req)
table.insert(out, '| ' .. item)
      end
table.insert(out, '| ' .. req)
      table.insert(out, '{{TableFooter}}')
end
      table.insert(tabs, TIER_LABEL[tier] .. '=' .. table.concat(out, '\n'))
table.insert(out, '{{TableFooter}}')
    end
table.insert(tabs, TIER_LABEL[tier] .. '=' .. table.concat(out, '\n'))
  end
end
end


  if #tabs == 0 then return '' end
if #tabs == 0 then return '' end
  return '<tabber>\n' .. table.concat(tabs, '\n|-|\n') .. '\n</tabber>'
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