モジュール:Tournament

提供: Wikiducca
移動: 案内検索

モジュール:Tournament/doc

※以下の内容は全てフィクションです。

日本146
11月1日 13:00 (1)
韓国011月2日 18:00 (3)
中国0011月4日 15:00
11月1日 18:00 (2)
台湾2
0
(3)の敗者0
11月3日 15:00
(1)の敗者05
11月2日 13:00
(2)の敗者3
{{Tournament
|日本|韓国|中国|台湾|'''(3)'''の敗者|'''(1)'''の敗者|'''(2)'''の敗者

|result <!--チーム入力も対戦入力も可変長なので「result」で区切り目を判別-->

<!--1回戦-->
|1|<|0|11月1日 13:00 '''(1)'''
|0|>|2|11月1日 18:00 '''(2)'''
|bye
|0|>|3|11月2日 13:00

<!--2回戦-->
|4|<|0|11月2日 18:00 '''(3)'''
|0|>|5|11月3日 15:00

<!--決勝-->
|6|<|0|11月4日 15:00
}}
ソフトバンク☆●●●●●●●●
西武●●●★○○○○
楽天●●○○○○○○
オリックス○●○○○●●●
日本ハム○○●○●○○○○
   
ロッテ●●
広島
{{Tournament
|ソフトバンク|西武|楽天|オリックス|日本ハム|ロッテ|広島

|result

<!--1回戦-->
|bye
|bye
|bye
|bye
|○○|<|●●|   
|bye

<!--2回戦-->
|bye
|bye
|bye
|○●○|<|●○●|
|bye

<!--3回戦-->
|bye
|bye
|●●○○○|<|○○●●●|
|bye

<!--4回戦-->
|bye
|●●●|>|○○○|
|bye

<!--準決勝-->
|☆●●●●|>|★○○○○|
|bye

<!--決勝-->
|●●●●|>|○○○○|

}}


その他の例:テンプレート:Tournament16

使い方

ここに負け勝ち
 1回戦1試合目
チーム名を勝ち 2回戦1試合目
ひたすら負け
書き連ねて勝ち未対戦
 1回戦2試合目
いきます。負け 2回戦2試合目
内部処理の未対戦
限界まで未対戦
 1回戦3試合目
無限に未対戦
増やせます。
{{Tournament
|ここに|チーム名を|ひたすら|書き連ねて|いきます。|内部処理の|限界まで|無限に|増やせます。

|result <!--チーム名と組み合わせの間に「result」を入れます。(Tableのパイプ記法みたいに「|-」とかでもいいかも)-->

<!--1回戦-->
|負け|>|勝ち| 1回戦1試合目 <!--勝ち負けは「<」「>」で判定します。(記法は要検討)-->
|bye <!--この段では試合をせず、そのまま勝ち上がる場合は「bye」を入力します。-->
|勝ち|<|負け| 1回戦2試合目
|bye
|未対戦||未対戦| 1回戦3試合目
<!--ここで、最後の1チームが残ります。ここから下のチームが存在しないので、次の試合が設定された場合は自動的にbyeとなります。-->
<!--「bye」を入力してもしなくても構いません(段数を数えるために入れておくことを推奨します)-->

<!--2回戦-->
|勝ち|<|負け| 2回戦1試合目
|未対戦||未対戦| 2回戦2試合目

<!--途中で飽きたらその部分までの表が組みあがります。適宜プレビュー見ながら対戦表を組み上げてください-->
}}

local p = {}

function border(x,y,z,w,r)
	if x == y or (x == '<>' and (y == '<' or y == '>') or (r == 1 and z == w)) then
		return '4px solid red'
	else
		return '2px solid gray'
	end
end

local th2 = '<tr style="height:0.5em">'
function th1(x)
	return th2..'<th rowspan="2" style="text-align:right;border-bottom:4px solid transparent">'..x..'</th>'
end

function td1(rnd, n1, n2, n3, n4, bye1, prv1, bye2, prv2, top, cur, btm, note)
	return {
		'<td rowspan="'..n1..'" colspan="'..((bye1 or 0)*4+2)..'" style="border-bottom:'..border('<>',prv1,'<',cur,rnd-(bye1 or 0))..'"></td>'..
		'<td rowspan="'..n1..'"></td>'..
		'<td rowspan="'..n1+n2..'" style="vertical-align:bottom;">'..top..'</td>',
		
		'<td rowspan="'..n2+n3..'" style="text-align:right">'..note..'</td>'..
		'<td rowspan="'..n2..'" style="border-right:'..border('<',cur)..'"></td>'..
		'<td rowspan="'..n2..'"></td>',
		
		'<td rowspan="'..n3..'" style="border-right:'..border('>',cur)..'"></td>'..
		'<td rowspan="'..n3..'" style="border-top:'..border('<>',cur)..'"></td>'..
		'<td rowspan="'..n3+n4..'" style="vertical-align:top;border-top:'..border('<>',cur)..'">'..btm..'</td>',
		
		'<td rowspan="'..n4..'" colspan="'..((bye2 or 0)*4+2)..'" style="border-top:'..border('<>',prv2,'>',cur,rnd-(bye2 or 0))..'"></td>'..
		'<td rowspan="'..n4..'"></td>'
	}
end

function td2(bye,n)
	if (bye or 0) == 0 then
		return ''
	else
		return '<td data-a="" rowspan="'..n..'" colspan="'..(bye*4)..'"></td>'
	end
end

function p.main(frame)
	local args = require('Module:Arguments').getArgs(frame, {wrappers = 'Template:Tournament', removeBlanks = false})
	local t = {}
	local data = { [0] = {} }
	
	local i = 1
	while args[i] ~= 'result' do
		data[0][i] = {top = 1, btm = 1}
		t[2*i-1] = th1(args[i])
		t[2*i] = th2
		i = i + 1
	end
	local nTeam = i - 1
	i = i + 1
	
	local rnd = 1
	local cur = 1
	local prv = 1
	local row = 1
	data[1] = {}
	while args[i] ~= nil do
		if args[i] == 'bye' then
			data[rnd][cur] = data[rnd-1][prv]
			data[rnd][cur].nBye = (data[rnd-1][prv].nBye or 0) + 1
			prv = prv + 1
			row = row + data[rnd][cur].top + data[rnd][cur].btm
			i = i + 1
			
		elseif data[rnd-1][prv+1] == nil then
			data[rnd][cur] = data[rnd-1][prv]
			data[rnd][cur].nBye = (data[rnd-1][prv].nBye or 0) + 1
			prv = prv + 1
			row = row + data[rnd][cur].top + data[rnd][cur].btm
			
		else
			local prv1 = data[rnd-1][prv].top
			local prv2 = data[rnd-1][prv].btm
			local prv3 = data[rnd-1][prv+1].top
			local prv4 = data[rnd-1][prv+1].btm
			local cur1 = prv2 + prv3
			if prv2 > prv3 then
				cur1 = prv1 + (cur1 + (cur1 % 2)) / 2
			else
				cur1 = prv1 + (cur1 - (cur1 % 2)) / 2
			end
			local cur2 = (prv1 + prv2 + prv3 + prv4) - cur1
			data[rnd][cur] = {top = cur1, btm = cur2, res = args[i+1]}
			
			local temp = td1(
				rnd, prv1, cur1 - prv1, prv1 + prv2 + prv3 - cur1, cur1 + cur2 - prv1 - prv2 - prv3,
				data[rnd-1][prv].nBye, data[rnd-1][prv].res,
				data[rnd-1][prv+1].nBye, data[rnd-1][prv+1].res,
				args[i], args[i+1], args[i+2], args[i+3]
			)
			
			t[row] = t[row]..temp[1]
			t[row+prv1] = t[row+prv1]..td2(data[rnd-1][prv].nBye,prv2)..temp[2]
			t[row+prv1+prv2] = t[row+prv1+prv2]..td2(data[rnd-1][prv+1].nBye,prv3)
			t[row+cur1] = t[row+cur1]..temp[3]
			t[row+prv1+prv2+prv3] = t[row+prv1+prv2+prv3]..temp[4]
			
			prv = prv + 2
			row = row + cur1 + cur2
			i = i + 4
		end
		if row == nTeam * 2 + 1 then
			if cur == 1 then
				break
			end
			rnd = rnd + 1
			cur = 1
			prv = 1
			row = 1
			data[rnd] = {}
		else
			cur = cur + 1
		end
	end
	
	local text = ''
	for i = 1, nTeam * 2 do
		text = text..t[i]..'</tr>'
	end
	return text
end

return p