被永久保护的模块

模組:Sports rbr table

维基百科,自由的百科全书
跳到导航 跳到搜索
文档图示 模块文档[查看] [编辑] [历史] [清除缓存]

用法

Position tables

{{#invoke:Sports rbr table|table
| sortable = <!-- y or n or omit -->
| team1 = 
| pos1  = <!-- 1 / 2 / 3 / 4 / ... -->
| team2 = 
| pos2  = <!-- 1 / 2 / 3 / 4 / ... -->
<!-- ... -->
| color_1 = 1st
| text_1  = 1st place
| source = 
}}

WDL tables

{{#invoke:Sports rbr table|table
| sortable = <!-- y or n or omit -->
| team1 = 
| res1  = <!-- W / D / L ... -->
| team2 = 
| res2  = <!-- W / D / L ... -->
<!-- ... -->
| color_W = green2
| color_D = yellow2
| color_L = red2
| source = 
}}

參數

通用參數
參數 敘述
title 表格的標題,若空白則不會顯示。
sortable 選擇表格是否使用排序功能?輸入y表示開啟排序功能,反之則無排序功能。
color_X 排名的預設背景顏色填入欄位XX可以為任一數字(例如輸入1表示為排名第1),或是可輸入排名的英文代碼來代入表格欄位背景顏色(例如輸入R表示降級,輸入W表示棄權...)有關顏色語法的更多資訊,請參見color
color_-3 排名1、2,、3的預設背景顏色填入欄位,有關顏色語法的更多資訊,請參見color
color_15- 排名15、16....的預設背景顏色填入欄位,有關顏色語法的更多資訊,請參見color
text_Y 表格顏色color_Y代表的意義。添加此欄位時,會在主表格外額外顯示一說明表格。
source 參考來源輸入欄位。
notes 添加腳註或任何附加說明欄位。
update
start_date
表格更新日期輸入欄位。若表格已完成不在更新,請在此欄輸入|update=complete;若賽事還未舉行 ,請輸入|update=future,並加入|start_date=顯示第一場比賽的日期。
legendpos 說明簡介的位置填入欄位。此欄位可輸入tr(右上角)、br(右下角)、tl(左上角)、bl(左下角)。
legendorder 說明簡介的條目順序填入欄位。(例如:|legendorder=W/D/L
toptext 表格上方的說明簡介。要使用此參數前請先設定|legendpos=tr,確認表格欲顯示位置。
header 表格左上角的標題說明欄位,預設為隊伍 ╲ 輪次
進階語法
參數 敘述
team1 球隊的名稱填入欄位,可依序team2team3......增加多個球隊稱。
pos1 球隊的各輪次排名輸入欄位,鍵入(/)可區隔各輪次排名。例如輸入|pos1=1/2/3/8/3/2/1表示在7輪的場次中,隊伍的排名變化依序為1、2、3、8、3、2、1。
res1 球隊的各輪次勝負輸入欄位,鍵入(/)可區隔各輪次比賽結果。例如輸入|res1=W/D/D/W/L表示在5輪的場次中,隊伍的比賽結果依序為勝、和、和、勝、負。附註,此參數用法可不能應用於|pos1=
Sports table語法
參數 敘述
team1 球隊的維基代碼名稱填入欄位,例如ABC。可依序team2, team3......增加多個球隊代碼。
name_ABC 球隊的維基代碼所代表的全名填入欄位。
pos_ABC 特定球隊的各輪次排名輸入欄位,鍵入(/)可區隔各輪次比賽結果。例如輸入ABC|pos_ABC=1/2/3/8/3/2/1,表示在7輪的場次中,ABC隊的排名變化依序為1、2、3、8、3、2、1。
res_ABC 特定球隊的的各輪次勝負輸入欄位,鍵入(/)可區隔各輪次比賽結果。例如輸入ABC|res_ABC=W/D/D/W/L表示在5輪的場次中,ABC隊的比賽結果依序為勝、和、和、勝、負。附註,此參數用法可不能應用於|pos_ABC=

顏色

本模組可設定多種預設背景顏色,與黑色文字相比具有可接受的對比度。建議一個欄位僅使用一種顏色,這些顏色與Module:Sports table的設定相匹配。

顏色 十六進位制數值
綠色1 BBF3BB
綠色2 CCF9CC
綠色3 DDFCDD
綠色4 EEFFEE
藍色1 BBF3FF
藍色2 CCF9FF
藍色3 DDFCFF
藍色4 EEFFFF
顏色 十六進位制數值
黃色1 FFFFBB
黃色2 FFFFCC
黃色3 FFFFDD
黃色4 FFFFEE
紅色1 FFBBBB
紅色2 FFCCCC
紅色3 FFDDDD
紅色4 FFEEEE
顏色 十六進位制數值
黑色1 BBBBBB
黑色2 CCCCCC
黑色3 DDDDDD
黑色4 EEEEEE
金色(第1) FFD700
銀色(第2) C0C0C0
銅色(第1) CC9966

在極少數情況下,可能需要覆蓋特定單元格的背景顏色。 這可以使用|teamX_roundY_color=來完成,其中X是隊伍編號,Y是輪次。

範例

範例1:Compact positions syntax

第1名
晉級
冠軍聯賽
降級
範例1
隊伍 ╲ 輪次12345
A隊12222
B隊21444
C隊34161
D隊43613
E隊56387
F隊65835
G隊78558
H隊87776
資料來源: 來源
{{#invoke:Sports rbr table|table
| title = 範例1
| sortable = y
| team1 = A隊
| pos1  = 1/2/2/2/2
| team2 = B隊
| pos2  = 2/1/4/4/4
| team3 = C隊
| pos3  = 3/4/1/6/1
| team4 = D隊
| pos4  = 4/3/6/1/3
| team5 = E隊
| pos5  = 5/6/3/8/7
| team6 = F隊
| pos6  = 6/5/8/3/5
| team7 = G隊
| pos7  = 7/8/5/5/8
| team8 = H隊
| pos8  = 8/7/7/7/6
| color_1 = 1st
| text_1 = 第1名
| color_2 = green1
| text_2 = 晉級
| color_3-4 = blue2
| text_3-4 = 冠軍聯賽
| color_7- = red1
| text_7- = 降級
| source = 來源
}}

範例2:Sports table positions syntax

第1名
晉級
冠軍聯賽
降級
範例2
隊伍 ╲ 輪次12345
A隊12222
B隊21444
C隊34161
D隊43613
E隊56387
F隊65835
G隊78558
H隊87776
資料來源: 來源
{{#invoke:Sports rbr table|table
| title = 範例2
| sortable = y
| team1 = AAA | team2 = BBB | team3 = CCC | team4 = DDD
| team5 = EEE | team6 = FFF | team7 = GGG | team8 = HHH
| name_AAA = A隊
| pos_AAA  = 1/2/2/2/2
| name_BBB = B隊
| pos_BBB  = 2/1/4/4/4
| name_CCC = C隊
| pos_CCC  = 3/4/1/6/1
| name_DDD = D隊
| pos_DDD  = 4/3/6/1/3
| name_EEE = E隊
| pos_EEE  = 5/6/3/8/7
| name_FFF = F隊
| pos_FFF  = 6/5/8/3/5
| name_GGG = G隊
| pos_GGG  = 7/8/5/5/8
| name_HHH = H隊
| pos_HHH  = 8/7/7/7/6
| color_1 = 1st
| text_1 = 第1名
| color_2 = green1
| text_2 = 晉級
| color_3-4 = blue2
| text_3-4 = 冠軍聯賽
| color_7- = red1
| text_7- = 降級
| source = 來源
}}

範例3:Team combined table

範例3
輪次123456789101112131415161718192021
場次HAAHAHAHHAAHHAHAAHHAA
結果WLLWWDWLLLLWWWWLDLLDL
排名41014867789101111876667999
資料來源: 來源
{{#invoke:sports rbr table|table
|title=範例3
|header=輪次
|label1= 場次
| res1= H/ A/ A/ H/ A/ H/ A/ H/ H/ A/ A/ H/ H/ A/ H/ A/ A/ H/ H/ A/ A
|label2= 結果
| res2= W/ L/ L/ W/ W/ D/ W/ L/ L/ L/ L/ W/ W/ W/ W/ L/ D/ L/ L/ D/ L
|label3= 排名
| pos3= 4/10/14/ 8/ 6/ 7/ 7/ 8/ 9/10/11/11/ 8/ 7/ 6/ 6/ 6/ 7/ 9/ 9/ 9
| color_W = green2| color_D = yellow2| color_L = red2
| color_1=green1| color_2=green2| color_3-4=green3
| color_5-7=blue1| color_18-=red1
| source = 來源
}}

參見

-- This module implements {{Sports rbr table}}
local p = {}

-- Internationalisation
local labels = {
	teamround = '隊伍 ╲ 輪次',
	source = ' 資料來源:',
	notes = ' 附註:',
	matches = '排名結果',
	updatedto = ' <matches>更新至<date>',
	firstplayed = ' 第一場比賽將在<date>舉行',
	futuredate = '?',
	complete = 'complete',
	future = 'future'
}

local args = nil

local colorlist = {}
local textlist = {}

local color_map = {
		green1='#BBF3BB', green2='#CCF9CC', green3='#DDFCDD', green4='#EEFFEE',
		blue1='#BBF3FF', blue2='#CCF9FF', blue3='#DDFCFF', blue4='#EEFFFF',
		yellow1='#FFFFBB', yellow2='#FFFFCC', yellow3='#FFFFDD', yellow4='#FFFFEE',
		red1='#FFBBBB', red2='#FFCCCC', red3='#FFDDDD', red4='#FFEEEE',
		orange1='#FEDCBA', orange2='#FEEAD5',
		purple1='#C9A0DC', purple2='#E0B0FF',
		gold1='#FFD700', silver1='#C0C0C0', copper1='#CD7F32', azure1='#9ACDFF',
		black1='#BBBBBB', black2='#CCCCCC', black3='#DDDDDD', black4='#EEEEEE',
		['1st']='#FFD700', ['2nd']='#C0C0C0', ['3rd']='#CC9966'
	}
	
local legend_symbols = {
	W='W', D='D', L='L', B='B', O='W/O'
}

local function isnotempty(s)
	return s and s:match( '^%s*(.-)%s*$' ) ~= ''
end

local function zeropad(n)
	if n>=0 and n < 10 then
		return '00' .. n
	end
	if n>=0 and n < 100 then
		return '0' .. n
	end
	return '' .. n
end

local function pad_key(k)
	-- Zero pad, fix ranges and dashes
	if k then
		k = k .. ' '
		k = mw.ustring.gsub(k, '–', '-')
		k = mw.ustring.gsub(k, '_([%d][^%d])', '_0%1')
		k = mw.ustring.gsub(k, '%-([%d][^%d])', '-0%1')
		k = mw.ustring.gsub(k, '_([%d][%d][^%d])', '_0%1')
		k = mw.ustring.gsub(k, '%-([%d][%d][^%d])', '-0%1')
		k = mw.ustring.gsub(k, '([^%d])%-([%d])', '%1000-%2')
		k = mw.ustring.gsub(k, '([%d])%-%s*$', '%1-999')
		k = mw.ustring.gsub(k, '^%s*(.-)%s*$', '%1')
	end

	return k
end

local function matches_date(text, m, d)
	return mw.ustring.gsub(mw.ustring.gsub(text .. '', '<matches>', m), '<date>', d)
end

local function get_color(p)
	local c = colorlist[p] or colorlist[zeropad(tonumber(p) or -1)]
	if c then
		return color_map[c] or c
	end
	p = tonumber(p or '0') or 0
	if p <= 0 then
		return nil
	end
	-- ranges in order of specificity
	local offset1, offset2 = 999, 999
	for k,v in pairs( colorlist ) do
		local r1 = tostring(k):match( '^%s*([%d]+)%-[%d]+%s*$' )
		local r2 = tostring(k):match( '^%s*[%d]+%-([%d]+)%s*$' )
		if r1 and r2 then
			r1 = tonumber(r1)
			r2 = tonumber(r2)
			if (r1 <= p) and (r2 >= p) then
				if (c == nil) or ((p - r1) <= offset1 and (r2 - p) <= offset2) then
					c = color_map[v] or v
					offset1 = p - r1
					offset2 = r2 - p
				end
			end
		end
	end
	return c
end	

function p.table(frame)
	local getArgs = require('Module:Arguments').getArgs
	local yesno = require('Module:Yesno')
	args = getArgs(frame, {wrappers = {'Template:Sports rbr table'}})
	local rounds = tonumber(args['rounds'] or '0') or 0
	local firstround = tonumber(args['firstround'] or 1) or 1
	local sortable = yesno(args['sortable'] or 'no')
	local updated = args['updated'] or args['update']
	local source = args['source']
	local notes = args['notes']
	local addlegend = false
	local legendpos = (args['legendpos'] or 'tr'):lower()
	local header, footer = '', ''
	
	-- Lowercase two labels --
	labels['complete'] = string.lower(labels['complete'])
	labels['future'] = string.lower(labels['future'])
	
	-- Adjust rounds
	rounds = rounds - (firstround - 1)
	
	-- Require a source
	-- source = source or frame:expandTemplate{ title = 'citation needed', args = { reason='No source parameter defined', date=os.date('%B %Y') } }
	
	-- Process team, pos, and color args
	local team_list = {}
	local maxrounds = 0
	for k, v in pairs( args ) do
		-- Preprocess ranges
		if tostring(k):match( '^%s*text_?(.-)%s*$' ) then
			k = pad_key(k)
		end
		if tostring(k):match( '^%s*colou?r_?(.-)%s*$' ) then
			k = pad_key(k)
		end
		
		-- Create the list of teams and count rounds
		local i = tonumber(
				tostring(k):match( '^%s*team([%d]+)%s*$' ) or 
				tostring(k):match( '^%s*label([%d]+)%s*$' ) or '0'
				)
		if ( i > 0 and isnotempty(v) ) then
			table.insert( team_list, i)
			local p = args['pos' .. i] or args['res' .. i] or ''
			if args['name_' .. v] then
				local t = args['team' .. i] or args['label' .. i] or ''
				p = args['pos_' .. t] or args['res_' .. t] or ''
			end
			local pos = mw.text.split(p, '%s*[/~]%s*')
			maxrounds = (#pos > maxrounds) and #pos or maxrounds
		end
		-- Create the list of colors
		local s = tostring(k):match( '^%s*colou?r_?(.-)%s*$' )
		if ( s and isnotempty(v) ) then
			colorlist[s] = v:lower()
		end
		-- Check if we are adding a legend
		s = tostring(k):match( '^%s*text_?(.-)%s*$' )
		if ( s and isnotempty(v) ) then
			textlist[s] = v
			addlegend = true
		end
	end
	maxrounds = (rounds > maxrounds) and rounds or maxrounds
	addlegend = yesno(args['legend'] or (addlegend and 'yes' or 'no'))
	
	-- sort the teams
	table.sort(team_list)

	local fs = 95
	if ((maxrounds - firstround) > 37 ) then
		fs = fs - 2*(maxrounds - firstround - 37)
	end

	-- Build the table
	local root = mw.html.create('table')
	root:addClass('wikitable')
	root:addClass(sortable and 'sortable' or nil)
	root:css('font-size', fs .. '%')
	root:css('text-align', 'center')
	
	if args['title'] then
		root:tag('caption'):wikitext(args['title'])
	end
	
	-- Heading row
	local row = root:tag('tr')
	row:tag('th')
		:attr('rowspan', args['sortable'] and 2 or nil)
		:wikitext(args['header'] or labels['teamround'])
	for r=1,maxrounds do
		row:tag('th')
			:css('width', '15px')
			:css('border-bottom', args['sortable'] and 'none' or nil)
			:wikitext(args['round' .. (r + (firstround - 1)) .. '_label'] 
				or (r + (firstround - 1)))
	end
	if args['sortable'] then
		row = root:tag('tr')
		for r=1,maxrounds do
			row:tag('th')
				:css('height', '1.2ex')
				:css('border-top', 'none')
		end
	end
	
	-- Team positions
	for k=1,#team_list do
		local i = team_list[k]
		local t = args['team' .. i] or args['label' .. i] or ''
		local p = args['pos' .. i] or args['res' .. i] or ''
		if args['name_' .. t] then
			p = args['pos_' .. t] or args['res_' .. t] or ''
			t = args['name_' .. t]
		end
		row = root:tag('tr')
		row:tag('td'):css('text-align', 'left'):wikitext(t)
		local pos = mw.text.split(p, '%s*[/~]%s*')
		for r=1,maxrounds do
			s = args['team' .. i .. '_round' .. r .. '_' .. 'color'] or 
				args['team' .. i .. '_round' .. r .. '_' .. 'colour']
			row:tag('td')
				:css('background', (s and colorlist[s]) or s or get_color(pos[r]))
				:wikitext(legend_symbols[pos[r]] or pos[r])
		end
	end

	-- build the legend
	if addlegend then
		-- Sort the keys for the legend
		legendkeys = {}
		for k,v in pairs( textlist ) do
			table.insert(legendkeys, k)
		end
		table.sort(legendkeys)
		
		if args['legendorder'] then
			legendkeys = mw.text.split(args['legendorder'] .. '/' .. table.concat(legendkeys, '/'), '%s*[/~]%s*')
		end
		
		local lroot = mw.html.create('table')
		if legendpos == 'tl' or legendpos == 'bl' then
			lroot:addClass('wikitable')
			lroot:css('font-size', '88%')
		else
			lroot:addClass('infobox')
			lroot:addClass('bordered')
			-- lroot:css('width', 'auto')
		end
		for k,v in pairs( legendkeys ) do
			if v and textlist[v] then
				local c = colorlist[v] or ''
				local row = (legendpos == 'tl' or legendpos == 'bl') and lroot or lroot:tag('tr')
				local l = row:tag('th'):css('background', color_map[c] or c)
				if legend_symbols[v] then
					l:css('font-weight', 'normal')
						:css('padding', '1px 3px')
						:wikitext(legend_symbols[v])
				else
					l:css('width', '10px')
				end
				row:tag('td')
					:css('padding', '1px 3px')
					:wikitext(textlist[v])
				textlist[v] = nil
			end
		end
		if (legendpos == 'bl' or legendpos == 'br') then
			footer = footer .. tostring(lroot)
		else
			header = header .. tostring(lroot)
		end
	end

	-- simplify updated == complete case
	local lupdated = updated and string.lower(updated) or ''
	if lupdated == labels['complete'] or lupdated == 'complete' then
		lupdated = ''
	end
	
	-- build the footer	
	if notes or source or lupdated ~= '' then
		footer = footer .. frame:expandTemplate{ title = 'refbegin' }
		if lupdated ~= '' then
			local mtext = args['matches_text'] or labels['matches']
			if lupdated == labels['future'] or lupdated == 'future' then
				footer = footer .. matches_date(labels['firstplayed'] .. ' ', 
					mtext, args['start_date'] or labels['futuredate'])
			else
				footer = footer .. matches_date(labels['updatedto'] .. ' ', 
					mtext, updated)
			end
		end
		if source then
			footer = footer .. labels['source'] .. ' ' .. source
		end
		if notes then
			if lupdated ~= '' or source then
				footer = footer .. '<br>'
			end
			footer = footer .. labels['notes'] .. ' ' .. notes
		end
		footer = footer .. frame:expandTemplate{ title = 'refend' } 
	end
	-- add clear right for the legend if necessary
	footer = footer .. ((addlegend and (legendpos == 'bl' or legendpos == 'br')) 
		and '<div style="clear:right"></div>' or '')
	return header .. (args['toptext'] or '') .. tostring(root) .. footer
end

return p