Module:Sports rbr table:修订间差异
外观
删除的内容 添加的内容
无编辑摘要 标签:手工回退 |
Incredible-Mama(留言 | 贡献) 无编辑摘要 标签:手工回退 |
||
第9行: | 第9行: | ||
matches = '排名結果', |
matches = '排名結果', |
||
updatedto = ' <matches>更新至<date>', |
updatedto = ' <matches>更新至<date>', |
||
firstplayed = ' 第一場比賽將在<date>舉行', |
firstplayed = ' 第一場比f賽將在<date>舉行', |
||
futuredate = '?', |
futuredate = '?', |
||
complete = 'complete', |
complete = 'complete', |
2020年8月1日 (六) 03:17的版本
此模块已评为beta版,可广泛使用。因其新近完成,请谨慎使用,以确保输出结果符合预期。 |
用法
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 |
排名的預設背景顏色填入欄位X 。X 可以為任一數字(例如輸入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 |
球隊的名稱填入欄位,可依序team2 、team3 ......增加多個球隊稱。
|
pos1 |
球隊的各輪次排名輸入欄位,鍵入(/ )可區隔各輪次排名。例如輸入|pos1=1/2/3/8/3/2/1 表示在7輪的場次中,隊伍的排名變化依序為1、2、3、8、3、2、1。
|
res1 |
球隊的各輪次勝負輸入欄位,鍵入(/ )可區隔各輪次比賽結果。例如輸入|res1=W/D/D/zhwiki/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/zhwiki/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 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
A隊 | 1 | 2 | 2 | 2 | 2 |
B隊 | 2 | 1 | 4 | 4 | 4 |
C隊 | 3 | 4 | 1 | 6 | 1 |
D隊 | 4 | 3 | 6 | 1 | 3 |
E隊 | 5 | 6 | 3 | 8 | 7 |
F隊 | 6 | 5 | 8 | 3 | 5 |
G隊 | 7 | 8 | 5 | 5 | 8 |
H隊 | 8 | 7 | 7 | 7 | 6 |
資料來源: 來源
{{#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名 | |
晉級 | |
冠軍聯賽 | |
降級 |
隊伍 ╲ 輪次 | 1 | 2 | 3 | 4 | 5 |
---|---|---|---|---|---|
A隊 | 1 | 2 | 2 | 2 | 2 |
B隊 | 2 | 1 | 4 | 4 | 4 |
C隊 | 3 | 4 | 1 | 6 | 1 |
D隊 | 4 | 3 | 6 | 1 | 3 |
E隊 | 5 | 6 | 3 | 8 | 7 |
F隊 | 6 | 5 | 8 | 3 | 5 |
G隊 | 7 | 8 | 5 | 5 | 8 |
H隊 | 8 | 7 | 7 | 7 | 6 |
資料來源: 來源
{{#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
輪次 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
場次 | H | A | A | H | A | H | A | H | H | A | A | H | H | A | H | A | A | H | H | A | A |
結果 | W | L | L | W | W | D | W | L | L | L | L | W | W | W | W | L | D | L | L | D | L |
排名 | 4 | 10 | 14 | 8 | 6 | 7 | 7 | 8 | 9 | 10 | 11 | 11 | 8 | 7 | 6 | 6 | 6 | 7 | 9 | 9 | 9 |
資料來源: 來源
{{#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 = ' 第一場比f賽將在<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