Modul:Sports results
Modul ini telah dinilai berada pada tahap beta, dan sedia untuk kegunaan secara luas. Ia masih baru dan patut digunakan dengan berhati-hati untuk memastikan bahawa hasil penggunaannya adalah seperti yang dijangkakan. |
Modul berasaskan Lua yang dimaksudkan untuk membina meja keputusan perlawanan. Ambil perhatian bahawa modul ini digunakan secara meluas, supaya menguji perubahan potensi ketat dalam kotak pasir dan sila pastikan konsensus wujud sebelum melaksanakan perubahan besar. Juga ambil perhatian bahawa modul yang dipanggil dari Modul:Sports table dan menyemak isu-isu yang berpotensi di sana juga selepas membuat perubahan. Selebihnya dokumentasi ini menerangkan bagaimana untuk menggunakan modul ini dalam satu artikel atau templat, semak jadual kandungan untuk item tertentu.
Penggunaan
[sunting sumber]Templat ini boleh digunakan seperti berikut:
Apa yang anda taip | {{#invoke:Sports results|main |update=1 Januari 1900 |source=[https://en.wikipedia.org/wiki/Main_Page Wikipedia] |showteam=CCC |team1=EEE |team2=BBB |team3=CCC |team4=DDD |team5=SEL |name_SEL=[[Selangor FA|Selangor]] |short_SEL=[[Selangor FA|SEL]] |name_BBB=Pasukan 2 |short_BBB=T2 |name_CCC=Pasukan 3 |short_CCC=T3 |name_DDD=DDD F.C. |short_DDD=DDD |name_EEE={{flagicon|Selangor}} [[Selangor FA|Selangor]] |short_EEE={{flagicon|Selangor}} |match_FDT_BBB=1–0 |match_FDT_CCC=0–1 |match_FDT_DDD=<small>16 Nov '14</small> |match_FDT_EEE=<small>3 Sep '15</small> |match_BBB_FDT=B–F |match_BBB_CCC=<small>3 Sep '15</small> |match_BBB_DDD=B–D |match_BBB_EEE=<small>3 Sep '15</small> |match_CCC_FDT=<small>16 Nov '14</small> |match_CCC_BBB=C–B |match_CCC_DDD=<small>16 Nov '14</small> |match_CCC_EEE=C–E |match_DDD_FDT=D–F |match_DDD_BBB=<small>3 Sep '15</small> |match_DDD_CCC=D–C |match_DDD_EEE=<small>3 Sep '15</small> |match_EEE_FDT=E–F |match_EEE_BBB=9–5 |match_EEE_CCC=<small>16 Nov '14</small> |match_EEE_DDD=E–D }} |
Apa yang ia kelihatan seperti |
Arahan utama adalah {{#invoke:Sports results|main}}, yang memanggil modul dan menetapkan struktur asas. Kemudian anda menyenaraikan urutan pasukan yang disenaraikan sebagai |team1=
, |team2=
, dll untuk seberapa banyak pasukan yang anda perlukan dalam meja. Sekiranya anda menetapkan Jika anda menetapkan |showteam=
kepada pasukan, maka keputusan pasukan itu diserlahkan seperti contoh. Paparan nama pasukan untuk pasukan TTT kini diatur oleh |name_TTT=
dan |short_TTT=
untuk tajuk baris dan lajur masing-masing. Hasil untuk permainan TTT vs SSS kini dapat dimasukkan oleh |match_TTT_SSS=
. Jadual meja dibina dengan cara ini, permainan masa depan boleh disenaraikan dengan tarikhnya atau mereka boleh dibiarkan kosong.
Sumber dikendalikan oleh |source=
. TTarikh kemas kini boleh ditetapkan oleh |update=date
ketika musim aktif; dapat dikeluarkan setelah musim dengan |update=complete
dan dapat ditetapkan untuk tarikh permulaan yang akan datang dengan menggunakan |update=future
dan menetapkan tarikh mula dengan |start_date=
.
Lebar ruangan boleh ditetapkan oleh |match_col_width=
.
Nota/Catatan boleh ditambahkan pada hasil menggunakan |match_TTT_SSS_note=
.
Contoh lain adalah:
Apa yang anda taip | {{#invoke:Sports results|main |team1=CZE |team2=ISL |team3=KAZ |team4=LVA |team5=NED |team6=TUR |name_CZE={{fb|CZE}} |short_CZE={{flagicon|CZE}} |name_ISL={{fb|ISL}} |short_ISL={{flagicon|ISL}} |name_KAZ={{fb|KAZ}} |short_KAZ={{flagicon|KAZ}} |name_LVA={{fb|LVA}} |short_LVA={{flagicon|LVA}} |name_NED={{fb|NED}} |short_NED={{flagicon|NED}} |name_TUR={{fb|TUR}} |short_TUR={{flagicon|TUR}} |match_CZE_ISL=[[Kelayakan UEFA Euro 2016 Kumpulan A#Republik Czech v Iceland|<small>16 Nov '14</small>]] |match_CZE_KAZ=[[Kelayakan UEFA Euro 2016 Kumpulan A#Republik Czech v Kazakhstan|<small>3 Sep '15</small>]] |match_CZE_LVA=[[Kelayakan UEFA Euro 2016 Kumpulan A#Republik Czech v Latvia|<small>28 Mac '15</small>]] |match_CZE_NED=[[Kelayakan UEFA Euro 2016 Kumpulan A#Republik Czech v Belanda|2–1]] |match_CZE_TUR=[[Kelayakan UEFA Euro 2016 Kumpulan A#Republik Czech v Turki|<small>10 Okt '15</small>]] |match_ISL_CZE=[[Kelayakan UEFA Euro 2016 Kumpulan A#Iceland v Republik Czech|<small>12 Jun '15</small>]] |match_ISL_KAZ=[[Kelayakan UEFA Euro 2016 Kumpulan A#Iceland v Kazakhstan|<small>6 Sep '15</small>]] |match_ISL_LVA=[[Kelayakan UEFA Euro 2016 Kumpulan A#Iceland v Latvia|<small>10 Okt '15</small>]] |match_ISL_NED=[[Kelayakan UEFA Euro 2016 Kumpulan A#Iceland v Belanda|2–0]] |match_ISL_TUR=[[Kelayakan UEFA Euro 2016 Kumpulan A#Iceland v Turki|3–0]] |match_KAZ_CZE=[[Kelayakan UEFA Euro 2016 Kumpulan A#Kazakhstan v Republik Czech|2–4]] |match_KAZ_ISL=[[Kelayakan UEFA Euro 2016 Kumpulan A#Kazakhstan v Iceland|<small>28 Mac '15</small>]] |match_KAZ_LVA=[[Kelayakan UEFA Euro 2016 Kumpulan A#Kazakhstan v Latvia|0–0]] |match_KAZ_NED=[[Kelayakan UEFA Euro 2016 Kumpulan A#Kazakhstan v Belanda|<small>10 Okt '15</small>]] |match_KAZ_TUR=[[Kelayakan UEFA Euro 2016 Kumpulan A#Kazakhstan v Turki|<small>12 Jun '15</small>]] |match_LVA_CZE=[[Kelayakan UEFA Euro 2016 Kumpulan A#Latvia v Republik Czech|<small>6 Sep '15</small>]] |match_LVA_ISL=[[Kelayakan UEFA Euro 2016 Kumpulan A#Latvia v Iceland|0–3]] |match_LVA_KAZ=[[Kelayakan UEFA Euro 2016 Kumpulan A#Latvia v Kazakhstan|<small>13 Okt '15</small>]] |match_LVA_NED=[[Kelayakan UEFA Euro 2016 Kumpulan A#Latvia v Belanda|<small>12 Jun '15</small>]] |match_LVA_TUR=[[Kelayakan UEFA Euro 2016 Kumpulan A#Latvia v Turki|1–1]] |match_NED_CZE=[[Kelayakan UEFA Euro 2016 Kumpulan A#Belanda v Republik Czech|<small>13 Okt '15</small>]] |match_NED_ISL=[[Kelayakan UEFA Euro 2016 Kumpulan A#Belanda v Iceland|<small>3 Sep '15</small>]] |match_NED_KAZ=[[Kelayakan UEFA Euro 2016 Kumpulan A#Belanda v Kazakhstan|3–1]] |match_NED_LVA=[[Kelayakan UEFA Euro 2016 Kumpulan A#Belanda v Latvia|<small>16 Nov '14</small>]] |match_NED_TUR=[[Kelayakan UEFA Euro 2016 Kumpulan A#Belanda v Turki|<small>28 Mac '15</small>]] |match_TUR_CZE=[[Kelayakan UEFA Euro 2016 Kumpulan A#Turki v Republik Czech|1–2]] |match_TUR_ISL=[[Kelayakan UEFA Euro 2016 Kumpulan A#Turki v Iceland|<small>13 Okt '15</small>]] |match_TUR_KAZ=[[Kelayakan UEFA Euro 2016 Kumpulan A#Turki v Kazakhstan|<small>16 Nov '14</small>]] |match_TUR_LVA=[[Kelayakan UEFA Euro 2016 Kumpulan A#Turki v Latvia|<small>3 Sep '15</small>]] |match_TUR_NED=[[Kelayakan UEFA Euro 2016 Kumpulan A#Turki v Belanda|<small>6 Sep '15</small>]] }} |
Apa yang ia kelihatan seperti |
Warna Menang/Seri/Kalah
[sunting sumber]Warna menang/seri/kalah dapat ditentukan oleh |matches_style=FBR
.
Apa yang anda taip | {{#invoke:sports results|main |source = |update=22 April 2018 |matches_style = FBR |team1=CER |team2=DAV |team3=GLC |team4=JPV |team5=KAY |team6=STA |name_CER=[[Ceres–Negros F.C.|Ceres–Negros]] |name_DAV=[[Davao Aguilas F.C.|Davao Aguilas]] |name_GLC=[[Global Cebu F.C.|Global Cebu]] |name_JPV=[[JPV Marikina F.C.|JPV Marikina]] |name_KAY=[[Kaya F.C.|Kaya–Iloilo]] |name_STA={{nowrap|[[Stallion Laguna F.C.|Stallion Laguna]]}} |match_CER_DAV={{small|{{small|23 Mei}}}} |match_CER_GLC={{small|{{small|30 Mei}}}} |match_CER_JPV={{small|{{small|20 Jun}}}} |match_CER_KAY=2–1 |match_CER_STA={{small|{{small|2 Jun}}}} |match_DAV_CER={{small|{{small|2 Mei}}}} |match_DAV_GLC={{small|{{small|20 Jun}}}} |match_DAV_JPV=3–2 |match_DAV_KAY=2–2 |match_DAV_STA={{small|{{small|6 Mei}}}} |match_GLC_CER=0–2 |match_GLC_DAV=2–2 |match_GLC_JPV={{small|{{small|27 Mei}}}} |match_GLC_KAY={{small|{{small|23 Mei}}}} |match_GLC_STA=1–2 |match_JPV_CER=0–3 |match_JPV_DAV={{small|{{small|9 Jun}}}} |match_JPV_GLC=2–1 |match_JPV_KAY={{small|{{small|5 Mei}}}} |match_JPV_STA={{small|{{small|19 Mei}}}} |match_KAY_CER={{small|{{small|12 Mei}}}} |match_KAY_DAV={{small|{{small|20 Mei}}}} |match_KAY_GLC={{small|{{small|2 Mei}}}} |match_KAY_JPV=1–0 |match_KAY_STA=4–1 |match_STA_CER={{small|{{small|26 Mei}}}} |match_STA_DAV=0–1 |match_STA_GLC={{small|{{small|12 Mei}}}} |match_STA_JPV=1–2 |match_STA_KAY=null }} |
Apa yang ia kelihatan seperti |
Tempat pasukan
[sunting sumber]Untuk menukar lalai Home \ Away
tempat pasukan, gunakan |team_header=
.
Timbal Balik
[sunting sumber]Untuk dua perlawanan setiap pasangan pasukan, gunakan |legs=2
dan |match1_AAA_BBB=
/ |match2_AAA_BBB=
sebaliknya |match_AAA_BBB=
. Untuk meja lebar, gunakan |multirowlegs=y
yang memberikan format yang lebih sempit.
Sel kosong dan pangsi
[sunting sumber]Sel pangsi lalai untuk ditunjukkan —
(m-dash), tetapi mereka boleh diubah menjadi sel berwarna padat menggunakan kod |solid_cell=
di mana warna sel dapat ditetapkan dengan menunjukkan dengan frasa (i.e. grey). Juga, setiap sel boleh dibuat tidak aktif dengan frasa null.
Menghasilkan meja kosong
[sunting sumber]Untuk menghasilkan meja kosong, gunakan
{{subst:#invoke:Sports results/blank|main | team1 = AAA | team2 = BBB | ... }}
dimana |team1=
, |team2=
, ... adalah singkatan untuk nama pasukan mengikut urutan yang anda inginkan. Anda mungkin termasuk |name_...=
dan parameter lain juga, dan ia harus dimasukkan dalam keputusannya.
-- Module to build results cross-tables for standings in Sports
-- See documentation for details
require('Modul:No globals')
local p = {}
-- Main function
function p.main(frame)
-- Get the args, stripping out blank values
local getArgs = require('Modul:Arguments').getArgs
local Args = getArgs(frame, {parentFirst = true})
-- Exit early if we are using section transclusion for a different section
if (Args['transcludesection'] and Args['section'])
and Args['transcludesection'] ~= Args['section'] then
return ''
end
-- Declare locals
local t = {}
local t_footer = {}
local t_return = {}
local team_list = {}
local notes_exist = false
local ii, ii_fw, bg_col, team_name, team_code_ii, ii_start, ii_end
-- Optional custom team header
local team_header = Args['team_header'] or 'Rumah \\ Pelawat'
-- Number of legs
local legs = tonumber(Args['legs']) or 1
local multirowlegs = (Args['multirowlegs'] or 'tiada') ~= 'no'
-- Edit links if requested
local baselink = frame:getParent():getTitle()
if mw.title.getCurrentTitle().text == baselink then baselink = '' end
local template_name = Args['template_name']
or (baselink ~= '' and (':' .. baselink))
or ''
local edit_links = template_name == '' and ''
or frame:expandTemplate{ title = 'navbar',
args = { mini=1, style='float:right', template_name} }
-- Get the custom start point for the table (most will start by default at 1)
local top_pos = tonumber(Args['highest_pos']) or 1
-- Get the custom end point for the table (unrestricted if bottom_pos is < top_pos)
local bottom_pos = tonumber(Args['lowest_pos']) or 0
local N_teams = top_pos - 1 -- Default to 0 at start, but higher number needed to skip certain entries
-- Load some other modules
local p_sub = require('Modul:Sports table/sub')
-- Alternative syntax for team list
if Args['team_order'] and Args['team_order'] ~= '' then
local tlist = mw.text.split(Args['team_order'], '%s*[;,]%s*')
for k, tname in ipairs(tlist) do
if tname ~= '' then
Args['team' .. k] = tname
end
end
end
if Args['team_header_note'] then
notes_exist=true
local note_string = frame:expandTemplate{ title = 'efn',
args = { group='lower-alpha', Args['team_header_note']} }
team_header = team_header .. note_string
end
-- Read in number of consecutive teams (ignore entries after skipping a spot)
ii_start = N_teams
while Args['team'..N_teams+1] ~= nil and (bottom_pos < top_pos or N_teams < bottom_pos) do
N_teams = N_teams+1
-- Sneakily add it twice to the team_list parameter, once for the actual
-- ranking, the second for position lookup in sub-tables
-- This is possible because Lua allows both numbers and strings as indices.
team_list[N_teams] = Args['team'..N_teams] -- i^th entry is team X
team_list[Args['team'..N_teams]] = N_teams -- team X entry is position i
end
ii_end = N_teams
-- Get team to show
local ii_show = team_list[Args['showteam']] -- nil if non-existant
-- Set the font size
local font_size=Args['font_size'] or '100%'
-- Create header
-- Open table
table.insert(t,'{|class="wikitable plainrowheaders" style="text-align:center;font-size:'..font_size..';"\n')
-- Table title
if Args['title'] then
table.insert(t,'|+ ' .. Args['title'] .. '\n')
end
-- First column
t_return.count = 0 -- Dummy parameter, using subfunction call seems best at this point because both module are intertwined
t_return.tab_text = t -- Actual text
t_return = p_sub.colhead(t_return,'auto', edit_links .. ' ' .. team_header)
-- Other columns passed to subfunction
t_return = p.header(t_return,Args,p_sub,N_teams,team_list,legs,multirowlegs)
t = t_return.tab_text
-- Random value used for uniqueness
math.randomseed( os.clock() * 10^8 )
local rand_val = math.random()
local note_string, note_id
local note_id_list = {}
-- Now create individual rows
ii_start = tonumber(Args['highest_row']) and (tonumber(Args['highest_row']) > top_pos) and tonumber(Args['highest_row']) or top_pos
ii_end = tonumber(Args['lowest_row']) and (tonumber(Args['lowest_row']) < N_teams) and tonumber(Args['lowest_row']) or N_teams
for ii=ii_start,ii_end do
-- Get team info
team_code_ii = team_list[ii]
team_name = Args['name_'..team_code_ii] or team_code_ii
local ii_style = 'text-align:' .. (Args['team_align'] or 'right') .. ';'
.. (ii and ii == ii_show and 'font-weight:bold;' or '')
.. (Args['team_nowrap'] and 'white-space:nowrap;' or '')
local team_note = Args['note_'..team_code_ii]
if team_note then
notes_exist = true
-- Only when it exist
-- First check for existence of reference for note
if not Args['note_'..team_note] then
-- It's the entry
-- Add random end for unique ID if more tables are present on article (which might otherwise share an ID)
note_id = '"table_note_'..team_code_ii..rand_val..'"'
note_id_list[team_code_ii] = note_id
note_string = frame:expandTemplate{ title = 'efn',
args = { group='lower-alpha', name=note_id, team_note} }
else
-- Check for existence elsewhere
local note_local_num = team_list[team_note] or ii_end + 1
if note_id_list[team_note] or ((note_local_num >= ii_start) and (note_local_num <= ii_end)) then
-- It exists
note_id = '"table_note_'..team_note..rand_val..'"' -- Identifier
note_string = frame:extensionTag{ name = 'ref',
args = { group = 'lower-alpha', name = note_id} }
else
-- Now define the identifier for this
-- Add random end for unique ID
note_id = '"table_note_'..team_note..rand_val..'"'
note_id_list[team_note] = note_id
-- Call refn template
note_string = frame:expandTemplate{ title = 'efn',
args = { group='lower-alpha', name=note_id, Args['note_'..team_note]} }
end
end
-- Now append this to the team_name string
team_name = team_name..note_string
end
-- Team names
table.insert(t,'|- \n') -- New row
table.insert(t,'! scope="row"'.. (multirowlegs and ' rowspan=' .. legs or '')
.. 'style="'.. ii_style ..'"| '..team_name..'\n') -- Position number
-- Now include note to match results if needed
for jj=top_pos,N_teams do
local team_code_jj = team_list[jj]
if ii == jj then
-- Nothing
else
for l=1,legs do
local m = (legs == 1) and 'match_' or 'match' .. l .. '_'
local match_note = Args[m ..team_code_ii..'_'..team_code_jj..'_note']
if match_note then
notes_exist = true
-- Only when it exist
-- First check for existence of reference for note
if not (Args['note_'..match_note] or Args[m ..match_note..'_note']) then
-- It's the entry
-- Add random end for unique ID if more tables are present on article (which might otherwise share an ID)
note_id = '"table_note_'..team_code_ii..'_'..team_code_jj..rand_val..'"'
note_id_list[team_code_ii..'_'..team_code_jj] = note_id
note_string = frame:expandTemplate{ title = 'efn',
args = { group='lower-alpha', name=note_id, match_note} }
else
-- Check for existence elsewhere
local note_local_num = team_list[match_note] or ii_end + 1
if note_id_list[match_note] or ((note_local_num >= ii_start) and (note_local_num <= ii_end)) then
-- It exists
note_id = '"table_note_'..match_note..rand_val..'"' -- Identifier
note_string = frame:extensionTag{ name = 'ref',
args = { group = 'lower-alpha', name = note_id} }
else
-- Now define the identifier for this
-- Add random end for unique ID
note_id = '"table_note_'..match_note..rand_val..'"'
note_id_list[match_note] = note_id
-- Call refn template
note_string = frame:expandTemplate{ title = 'efn',
args = { group='lower-alpha', name=note_id, Args['note_'..match_note]} }
end
end
-- Now append this to the match result string
Args[m..team_code_ii..'_'..team_code_jj] = (Args[m..team_code_ii..'_'..team_code_jj] or '–')..note_string
end
end
end
end
-- Then individual results
t = p.row(t,Args,N_teams,team_list,ii,ii_show,legs,multirowlegs)
end
-- Close table
table.insert(t, '|}\n')
-- Get info for footer
local update = Args['update']
or 'tidak diketahui'
local start_date = Args['start_date']
or 'tidak diketahui'
local source = Args['source']
or frame:expandTemplate{ title = 'citation needed',
args = { reason='No source parameter defined', date=os.date('%B %Y') } }
-- Create footer text
-- Date updating
if string.lower(update)=='complete' then
-- Do nothing
elseif update=='' then
-- Empty parameter
table.insert(t_footer,'Dikemaskini untuk perlawanan dimainkan tidak diketahui. ')
elseif string.lower(update)=='future' then
-- Future start date
table.insert(t_footer,'Perlawanan pertama dimainkan pada '..start_date..'. ')
else
table.insert(t_footer,'Dikemaskini untuk perlawanan dimainkan pada '..update..'. ')
end
table.insert(t_footer,'Sumber: '..source)
if (Args['matches_style'] or '') == 'FBR' then
table.insert(t_footer, Args['team_header']
and '<br />Kunci warna: Biru = pasukan lajur kiri menang; Kuning = seri; Merah = pasukan teratas menang.'
or '<br />Kunci warna: Biru = pasukan rumah menang; Kuning = seri; Merah = pasukan pelawat menang.')
elseif (Args['matches_style'] or '') == 'BSR' then
table.insert(t_footer, Args['team_header']
and '<br />Legend: Biru = pasukan lajur kiri menang; Merah = pasukan teratas menang.'
or '<br />Kunci warna: Biru = pasukan rumah menang; Merah = pasukan pelawat menang.')
end
if Args['a_note'] then
table.insert(t_footer, '<br />Untuk perlawanan yang akan datang, tanda "a" menunjukkan ada artikel mengenai persaingan antara kedua peserta.')
end
if Args['ot_note'] then
table.insert(t_footer, '<br />Perlawanan dengan warna latar yang lebih terang diputuskan setelah lembur.')
end
-- Add notes (if applicable)
if notes_exist then
table.insert(t_footer,'<br>Nota:')
-- As reflist size text
t_footer = '<div class="reflist">'..table.concat(t_footer)..'</div>'
t_footer = t_footer..frame:expandTemplate{ title = 'notelist', args = { group='lower-alpha'} }
else
-- As reflist size text
t_footer = '<div class="reflist">'..table.concat(t_footer)..'</div>'
end
-- Add footer to main text table
table.insert(t,t_footer)
-- Rewrite anchor links
for k=1,#t do
if t[k]:match('%[%[#[^%[%]]*%|') then
t[k] = mw.ustring.gsub(t[k], '(%[%[)(#[^%[%]]*%|)', '%1' .. baselink .. '%2')
end
end
return '<div style="overflow:hidden">'
.. '<div class="noresize overflowbugx" style="overflow:auto">\n'
.. table.concat(t) .. '</div></div>'
end
-- Other functions
local function get_short_name(s, t, n, ss)
-- return short name if defined
if s and s ~= '' then
return s
end
-- deflag if necessary
if ss and n then
if ss == 'noflag' then
n = mw.ustring.gsub(n, '%[%[[Ff][Ii][Ll][Ee]:[^%[%]]*%]%]', '')
elseif ss == 'flag' then
n = mw.ustring.gsub(n, '(<span class="flagicon">%s*%[%[[Ff][Ii][Ll][Ee]:[^%[%]]*link=)[^%|%[%]]*(%]%][^<>]*</span>)%s*%[%[([^%[%]%|]*)%|[^%[%]]*%]%]', '%1%3%2')
n = mw.ustring.gsub(n, '.*(<span class="flagicon">%s*%[%[[Ff][Ii][Ll][Ee]:[^%[%]]*%]%][^<>]*</span>).*', '%1')
n = mw.ustring.gsub(n, ' (</span>)', '%1')
end
end
-- replace link text in name with team abbr if possible
if n and t and n:match('(%[%[[^%[%]]*%]%])') then
n = mw.ustring.gsub(n, '(%[%[[^%|%]]*%|)[^%|%]]*(%]%])', '%1' .. t .. '%2')
n = mw.ustring.gsub(n, '(%[%[[^%|%]]*)(%]%])', '%1|' .. t .. '%2')
n = mw.ustring.gsub(n, '(%[%[[^%|%]]*%|)([A-Z][A-Z][A-Z])(%]%]) <span[^<>]*>%([A-Z][A-Z][A-Z]%)</span>', '%1%2%3')
return n
end
-- nothing worked, so just return the unlinked team abbr
return t or ''
end
local function get_score_background(s, c)
local s1, s2
-- Define the colouring
local wc, lc, tc
if c == 'level2' then
wc, lc, tc = '#CCF9FF', '#FCC', '#FFC' -- blue2, red2, yellow2
elseif c == 'level3' then
wc, lc, tc = '#DDFCFF', '#FDD', '#FFD' -- blue3, red3, yellow3
elseif c == 'level4' then
wc, lc, tc = '#EEFFFF', '#FEE', '#FFE' -- blue4, red4, yellow4
else
wc, lc, tc = '#BBF3FF', '#FBB', '#FFB' -- blue1, red1, yellow1
end
-- check for override
if s:match('^%s*<span%s%s*style%s*=["\'%s]*background[%-colr]*%s*:([^\'";<>]*).-$') then
local c = mw.ustring.gsub(s,'^%s*<span%s%s*style%s*=["\'%s]*background[%-colr]*%s*:([^\'";<>]*).-$', '%1')
return c
end
-- delink if necessary
if s:match('^%s*%[%[[^%[%]]*%|([^%[%]]*)%]%]') then
s = s:match('^%s*%[%[[^%[%]]*%|([^%[%]]*)%]%]')
end
if s:match('^%s*%[[^%[%]%s]*%s([^%[%]]*)%]') then
s = s:match('^%s*%[[^%[%]%s]*%s([^%[%]]*)%]')
end
if s:match('<span[^<>]*>(.-)</span>') then
s = s:match('<span[^<>]*>(.-)</span>')
end
-- get the scores
s1 = tonumber(mw.ustring.gsub( s or '',
'^%s*([%d%.][%d%.]*)%s*–%s*([%d%.][%d%.]*).*', '%1' ) or '') or ''
s2 = tonumber(mw.ustring.gsub( s or '',
'^%s*([%d%.][%d%.]*)%s*–%s*([%d%.][%d%.]*).*', '%2' ) or '') or ''
-- return colouring if possible
if s1 ~= '' and s2 ~= '' then
return (s1 > s2) and wc or ((s2 > s1) and lc or tc)
else
return 'transparent'
end
end
local function format_score(s)
s = mw.ustring.gsub(s or '', '^%s*([%d%.]+)%s*[–−—%-]%s*([%d%.]+)', '%1–%2')
s = mw.ustring.gsub(s, '^%s*([%d%.]+)%s*&[MmNn][Dd][Aa][Ss][Hh];%s*([%d%.]+)', '%1–%2')
s = mw.ustring.gsub(s, '^%s*(%[%[[^%[%]]*%|[%d%.]+)%s*%-%s*([%d%.]+)', '%1–%2')
s = mw.ustring.gsub(s, '^%s*(%[[^%[%]%s]*%s+[%d%.]+)%s*%-%s*([%d%.]+)', '%1–%2')
s = mw.ustring.gsub(s, '^%s*(%[%[[^%[%]]*%|[%d%.]+)%s*&[MmNn][Dd][Aa][Ss][Hh];%s*([%d%.]+)', '%1–%2')
s = mw.ustring.gsub(s, '^%s*(%[[^%[%]%s]*%s+[%d%.]+)%s*&[MmNn][Dd][Aa][Ss][Hh];%s*([%d%.]+)', '%1–%2')
return s
end
function p.header(tt,Args,p_sub,N_teams,team_list,legs,multirowlegs)
local ii, team_code_ii, short_name
legs = legs or 1
-- Set match column width
local col_width = Args['match_col_width'] or '28'
-- Get some default values in case it doesn't start at 1
local top_pos = tonumber(Args['highest_pos']) or 1
for l=1,legs do
if multirowlegs and l > 1 then
break
end
for ii=top_pos,N_teams do
team_code_ii = team_list[ii]
short_name = get_short_name(Args['short_'..team_code_ii],
team_code_ii, Args['name_'..team_code_ii], Args['short_style'] or '')
local bl = legs > 1 and ii == top_pos and ' style="border-left:2px solid #aaa;"' or ''
tt = p_sub.colhead(tt,col_width .. bl,short_name)
end
end
return tt
end
function p.row(tt,Args,N_teams,team_list,ii,ii_show,legs,multirowlegs)
-- Note ii is the row number being shown
local jj, fw, bg, result, result_extra, team_code_ii, team_code_jj
legs = legs or 1
-- Set score cell style
local matches_style = Args['matches_style'] or ''
team_code_ii = team_list[ii]
-- Get some default values in case it doesn't start at 1
local top_pos = tonumber(Args['highest_pos']) or 1
for l=1,legs do
if multirowlegs and l > 1 then
table.insert(tt,'|- \n') -- New row
end
for jj=top_pos,N_teams do
team_code_jj = team_list[jj]
local m = (legs == 1) and 'match_' or 'match' .. l .. '_'
result = Args[m..team_code_ii..'_'..team_code_jj] or ''
result_extra = Args['result_'..team_code_ii..'_'..team_code_jj] or ''
local bl = legs > 1 and jj == top_pos and 'border-left:2px solid #aaa;' or ''
if ii == jj or result == 'null' then
-- Solid cell
fw = 'font-weight:' .. (ii==ii_show and 'bold' or 'normal') .. ';'
bg = 'background:transparent;'
-- Grey background color for solid cell
if Args['solid_cell'] == 'grey' then
table.insert(tt,'| style="'..fw..bl..'background:#bbb;" |\n')
else
table.insert(tt,'| style="'..fw..bl..bg..'" | —\n')
end
else
-- Content cell
-- Set bolding and background
fw = 'font-weight:' .. ((ii==ii_show or jj == ii_show) and 'bold' or 'normal') .. ';'
bg = 'background:transparent;'
-- Reformat dashes
if result ~= '' then
result = format_score(result)
end
-- Background coloring if enabled
if matches_style == 'FBR' and result ~= '' then
if result_extra == 'OT' then
bg = 'background:' .. get_score_background(result,'level2') .. ';'
elseif result_extra == 'PK' then
bg = 'background:' .. get_score_background(result,'level3') .. ';'
else
bg = 'background:' .. get_score_background(result,'') .. ';'
end
elseif matches_style == 'BSR' and result ~= '' then
if result_extra == 'OT' then
bg = 'background:' .. get_score_background(result,'level3') .. ';'
elseif result_extra == 'OTL' then
bg = 'background:' .. get_score_background('0–1','level3') .. ';'
elseif result_extra == 'OTW' then
bg = 'background:' .. get_score_background('1–0','level3') .. ';'
elseif result_extra == 'L' then
bg = 'background:' .. get_score_background('0–1','') .. ';'
elseif result_extra == 'W' then
bg = 'background:' .. get_score_background('1–0','') .. ';'
else
bg = 'background:' .. get_score_background(result,'') .. ';'
end
end
table.insert(tt,'| style="white-space:nowrap;'..fw..bl..bg..'" |'..result..'\n')
end
end
end
return tt
end
return p