Jump to content

Module:Build bracket/sandbox

From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Pbrks (talk | contribs) at 02:59, 4 August 2022 (Created page with 'local p = {} local function isempty(s) return s == nil or s == '' end local function notempty(s) return s ~= nil and s ~= '' end local function createPath(a,tbl,split) table.insert(tbl,'| style="border-width:'.. a[1] ..'px '.. a[2] ..'px '.. a[3] ..'px '.. a[4] ..'px; border-style:solid;border-color:black;') if split==true then table.insert(tbl, 'font-size:50%;" |   \n') else table.insert(tbl, '" | \n') end end local function splitPaths(...'). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.
(diff) ← Previous revision | Latest revision (diff) | Newer revision → (diff)
local p = {}

local function isempty(s)
	return s == nil or s == ''
end

local function notempty(s)
	return s ~= nil and s ~= ''
end

local function createPath(a,tbl,split)
	table.insert(tbl,'| style="border-width:'.. a[1] ..'px '.. a[2] ..'px '.. a[3] ..'px '.. a[4] ..'px; border-style:solid;border-color:black;')
	if split==true then
		table.insert(tbl, 'font-size:50%;" |   \n')
	else
		table.insert(tbl, '" | \n')
	end
end

local function splitPaths(a,b,c,d)
	local s = {}
	local split = true
	table.insert(s, '<table border=0 cellpadding=0 cellspacing=0 style="height:100%;"> \n')
	table.insert(s, '|- \n')
	createPath(a,s,split)
	createPath(b,s,split)
	table.insert(s, '|- \n')
	createPath(c,s,split)
	createPath(d,s,split)
	table.insert(s, '</table>')
	return table.concat(s)
end


local function pathCode(code1,code2)
	local split = false
	local a = {0,0,0,0}
	local b = {0,0,0,0}
	local c = {0,0,0,0}
	local d = {0,0,0,0}
	if code1:find("split") then
		split = true
		if code1:find("out")	then a[3]=1 c[1]=1 end
		if code1:find("up")		then a[2]=1 b[4]=1 end
		if code1:find("down")	then c[2]=1 d[4]=1 end
		if code1:find("in")		then b[3]=1 d[1]=1 end
	else
		if code1:find("out")	then a[3]=1 end
		if code1:find("up")		then a[2]=1 b[4]=1 end
		if code1:find("in")		then b[3]=1 end
		if code2:find("out")	then a[1]=1 end
		if code2:find("down")	then a[2]=1 b[4]=1 end
		if code2:find("in")		then b[1]=1 end
	end
	if split==true then
		table.insert(t, '| colspan="2" style="height:1px;" |'..splitPaths(a,b,c,d)..' \n')
	else
		createPath(a,t,split)
		createPath(b,t,split)
	end
end

local function Style(ctype,color)
	if ctype=='header' then
		return 'style="text-align:center;border:1px solid #aaa;background-color:'..color..';"'
	elseif ctype=='seed' then
		return 'style="text-align:center;background-color:#f2f2f2;border:1px solid #aaa;"'
	elseif ctype=='team' then
		return 'style="border:1px solid #aaa;background-color:#f9f9f9;padding-left:0.3em;"'
	elseif ctype=='score' then
		return 'style="text-align:center;border:1px solid #aaa;background-color:'..color..';"'
	end
end

local function generateRow(i,j,cell,rlegs,header,tseed,tname,tscore,text)
	if cell=='header' then
		if isempty(header[1]) then
			if i==1 and j==c then
				header[1] = 'Final'
			elseif i==1 and j==c-1 then
				header[1] = 'Semifinals'
			elseif i==1 and j==c-2 then
				header[1] = 'Quarterfinals'
			else
				header[1] = 'Round '..j	
			end
		end
		table.insert(t,'| colspan="'.. rlegs+2 ..'" '..Style('header',header[2])..' | '..header[1]..' \n')
	elseif cell=='team' then
		if seeds=='n' or seeds=='no' then
			table.insert(t,'| colspan="2" '..Style('team')..' | '..tname..' \n')
		else
			table.insert(t,'| '..Style('seed')..' | '..tseed..' \n')
			table.insert(t,'| '..Style('team')..' | '..tname..' \n')
		end
		for k=1,rlegs do
			table.insert(t,'| '..Style('score',tscore[k][2])..' | '..tscore[k][1]..' \n')
		end
	elseif cell=='text' then
		table.insert(t,'| colspan="'.. rlegs+2 ..'" | '..text..' \n')
	elseif cell=='line1' then
		table.insert(t,'| colspan="'.. rlegs+2 ..'" style="border-width:0 0 1px 0; border-style:solid;border-color:black;" | \n')
	elseif cell=='line2' then
		table.insert(t,'| colspan="'.. rlegs+2 ..'" style="border-width:1px 0 0 0; border-style:solid;border-color:black;" | \n')
	else
		table.insert(t,'| colspan="'.. rlegs+2 ..'" | \n')
	end

	if j<c then
		if isempty(path_1[i][j]) and isempty(path_2[i][j]) then
			table.insert(t,'| colspan="2" | \n')
		else
			if path_1[i][j]:find("split")==nil then
				path_2[i+1][j] = path_1[i][j]
			end
			pathCode(path_1[i][j],path_2[i][j])
		end
	end
end

local function newRow(t)
	table.insert(t,'|-\n')	
	table.insert(t,'| &nbsp;\n')
end

function p.main(frame)
	fargs = frame.args
	pargs = frame:getParent().args;
	
	r = tonumber(frame.args.rows) or tonumber(frame.args.maxrows) or 1
	c = tonumber(frame.args.rounds) or 1
	
	seeds = fargs.seeds or pargs.seeds or ''
	legs = tonumber(fargs.legs) or tonumber(pargs.legs) or 1
	seed_width = fargs["seed-width"] or  pargs["seed-width"] or 25
	team_width = fargs["team-width"] or pargs["team-width"] or 150
	score_width = fargs["score-width"] or pargs["score-width"] or 25
	
	path_1 = {}
	path_2 = {}
	for i=1,r+2 do 
		path_1[i]={} 
		path_2[i]={}
		for j=1,c do
			path_1[i][j] = fargs[i-1 ..'-'..j..'a'] or ''
			path_2[i][j]= ''
		end
	end
	
	t = {}
	
	table.insert(t,'{| border=0 cellpadding=0 cellspacing=0 style="font-size: 90%; margin:1em 2em 1em 1em;\n')
	newRow(t)
	-- Row 0 --
	for j=1,c do
		local header = {}
		header[1] = fargs['RD'..j] or pargs['RD'..j] or fargs['RD'..j..'-1'] or pargs['RD'..j..'-1'] or ''
		header[2] = fargs['RD'..j..'-shade'] or pargs['RD'..j..'-shade'] or fargs['RD'..j..'-1-shade'] or pargs['RD'..j..'-1-shade'] or fargs['RD-shade'] or pargs['RD-shade'] or '#f2f2f2'
		local rlegs = tonumber(fargs['RD'..j..'-legs']) or tonumber(pargs['RD'..j..'-legs']) or legs
		local cell = fargs['0-'..j] or ''
		generateRow(1,j,cell,rlegs,header)
	end
	
	-- Header/team separator --
	table.insert(t,'|-\n')
	for j=1,c do
		local rlegs = tonumber(fargs['RD'..j..'-legs']) or tonumber(pargs['RD'..j..'-legs']) or legs
		table.insert(t,'| width="5" | &nbsp;\n')
		table.insert(t,'| width="'..seed_width..'" | \n')
		table.insert(t,'| width="'..team_width..'" | \n')
		for k=1,rlegs do
			table.insert(t,'| width="'..score_width..'" | \n')
		end
		if j<c then
			table.insert(t,'| width="5" | \n')
		end
	end
	
	-- Rows 1 to ... --
	local m = {}
	for i=1,c do
		m[i]= {}
		for j=1,2 do
			m[i][j] = 1 
		end
		m[i][3] = 2
	end
	
	for i=1,r do
		newRow(t)
		for j=1,c do
			local cell = fargs[i..'-'..j] or ''
			local rlegs = tonumber(fargs['RD'..j..'-legs']) or tonumber(pargs['RD'..j..'-legs']) or legs
			local header = {}
			header[1] = fargs['RD'..j..'-'..m[j][3]] or pargs['RD'..j..'-'..m[j][3]] or ''
			header[2] = fargs['RD'..j..'-'..m[j][3]..'-shade'] or pargs['RD'..j..'-'..m[j][3]..'-shade'] or fargs['RD-shade'] or pargs['RD-shade'] or '#f2f2f2'
			local text = fargs['RD'..j..'-text'..m[j][2]] or pargs['RD'..j..'-team'..m[j][2]] or '&nbsp;'
			local tseed = fargs['RD'..j..'-seed'..m[j][1]] or pargs['RD'..j..'-seed'..m[j][1]] or ''
			local tname = fargs['RD'..j..'-team'..m[j][1]] or pargs['RD'..j..'-team'..m[j][1]] or '&nbsp;'
			local tscore = {}
			for k=1,rlegs do
				tscore[k]={}
			end
			tscore[1][1]=fargs['RD'..j..'-score'..m[j][1]] or pargs['RD'..j..'-score'..m[j][1]] or fargs['RD'..j..'-score'..m[j][1]..'-1'] or pargs['RD'..j..'-score'..m[j][1]..'-1'] or ''
			tscore[1][2]=fargs['RD'..j..'-score'..m[j][1]..'-shade'] or pargs['RD'..j..'-score'..m[j][1]..'-shade'] or fargs['RD'..j..'-score'..m[j][1]..'-1-shade'] or pargs['RD'..j..'-score'..m[j][1]..'-1-shade'] or '#f9f9f9'
			for k=2,rlegs do
				tscore[k][1]=fargs['RD'..j..'-score'..m[j][1]..'-'..k] or pargs['RD'..j..'-score'..m[j][1]..'-'..k] or ''
				tscore[k][2]=fargs['RD'..j..'-score'..m[j][1]..'-'..k..'-shade'] or pargs['RD'..j..'-score'..m[j][1]..'-'..k..'-shade'] or '#f9f9f9'
			end
			
			generateRow(i+1,j,cell,rlegs,header,tseed,tname,tscore,text)
			if cell=='team' then m[j][1]=m[j][1]+1 end
			if cell=='text' then m[j][2]=m[j][2]+1 end
			if cell=='header' then m[j][3]=m[j][3]+1 end
		end
	end
	table.insert(t,'|}')
	return table.concat(t)
end

return p