Modul:Sports series: Perbedaan antara revisi

Konten dihapus Konten ditambahkan
Tidak ada ringkasan suntingan
penambahan fitur catatan pada agregat dan skor
 
(16 revisi perantara oleh 2 pengguna tidak ditampilkan)
Baris 1:
-- Modul untuk menampilkan tabel agregat hasil pertandingan olahraga
-- Lihat dokumentasi untuk parameter yang digunakan
 
local p = {}
 
Baris 5 ⟶ 8:
return frame:expandTemplate{ title = templateName, args = params }
end
 
-- Function to check the existence of flagTemplate
local function templateExists(templateName)
local title = mw.title.new('TemplateTemplat:' .. templateName)
return title and title.exists
end
 
-- Function to process country codes and variants OR youth team flag templates and age level, dividing parameters by the "+" sign
local function processIcon(iconString)
if not iconString or iconString:match("^%s*$") then
Baris 30 ⟶ 32:
local last_digit = n % 10
local last_two_digits = n % 100
if last_digit == 1 andor last_two_digits ~= 11 then
return n .. 'st'
elseif last_digit == 2 and last_two_digits ~= 12 then
return n .. 'nd'
elseif last_digit == 3 and last_two_digits ~= 13 then
return n .. 'rd'
else
return n .. 'th'
end
end
 
-- Function to replace wiki links with their display text or link text
local function replaceLink(match)
local pipePos = match:find("|")
if pipePos then
return match:sub(pipePos + 1, -3) -- Return text after the '|'
else
return match:sub(3, -3) -- Return text without the brackets
end
end
end
 
-- Function to clean and process the aggregate score for comparison
Baris 57 ⟶ 55:
return ''
end
 
-- Replace wiki links
score = score:gsub("%[%[.-%]%]", replaceLink)
Baris 75 ⟶ 73:
 
-- Function to determine the winner based on scores within parentheses (first) or regular format (second)
local function determineWinner(cleanAggregate, matchType, team1, team2, boldWinner, colorWinner, aggregate, isFBRStyle, legs, leg1Score, leg2Score, disableAwayGoals)
local team1Winner, team2Winner = false, false
local score1, score2
Baris 110 ⟶ 108:
team2 = team2:gsub("''", "")
end
if aggregate then
if aggregate:find("'''") then
aggregate = aggregate:gsub("'''", "")
aggregate = "<strong>" .. aggregate .. "</strong>"
end
manualColorDraw = aggregate:find("''") and not (aggregate:gsub("''", ""):match("^%s*$"))
aggregate = aggregate:gsub("''", "")
end
 
if manualColor1 then
if not team1Winner then
Baris 132 ⟶ 130:
end
if manualColorDraw then
isDraw = true
manualColor = true
end
 
-- Regular winner determination logic if manual bolding or coloring is not conclusive
if not team1Winner and not team2Winner and not isDraw and (boldWinner or colorWinner or isFBRStyle) then
local parenthetical = cleanAggregate:match('%((%d+%-+%d+)%)')
local outsideParenthetical = cleanAggregate:match('^(%d+%-+%d+)')
Baris 149 ⟶ 147:
score1 = tonumber(score1)
score2 = tonumber(score2)
if score1 > score2 then
team1Winner = true
elseif score1 < score2 then
team2Winner = true
elseif score1 == score2 and legs == 2 and not disableAwayGoals then
-- Apply away goals rule
local cleanLeg1 = cleanScore(leg1Score):gsub('[()]', '')
local cleanLeg2 = cleanScore(leg2Score):gsub('[()]', '')
local _, team2AwayGoals = cleanLeg1:match('(%d+)%-+(%d+)')
local team1AwayGoals = cleanLeg2:match('(%d+)%-+(%d+)')
 
if team1AwayGoals and team2AwayGoals then
team1AwayGoals, team2AwayGoals = tonumber(team1AwayGoals), tonumber(team2AwayGoals)
if team1AwayGoals > team2AwayGoals then
team1Winner = true
elseif team2AwayGoals > team1AwayGoals then
team2Winner = true
end
end
end
end
if (colorWinner or isFBRStyle) and legs == 0 then
isDraw = not team1Winner and not team2Winner
end
if (colorWinner or isFBRStyle) and legs == 0 then
isDraw = not team1Winner and not team2Winner
end
end
end
Baris 183 ⟶ 181:
-- Function to check if any parameter in a given row is non-nil and non-empty
local function anyParameterPresent(startIndex, step, args)
-- Check regular parameters
for index = startIndex, startIndex + step - 1 do
if args[index] and args[index]:match("^%s*(.-)%s*$") ~= "" then
Baris 188 ⟶ 187:
end
end
-- Check aggregate note
local rowIndex = math.floor((startIndex - 1) / step) + 1
local aggNote = args['note_agg_' .. rowIndex]
if aggNote and aggNote:match("^%s*(.-)%s*$") ~= "" then
return true
end
 
-- Check leg notes
local numLegs = step - (noFlagIcons and 3 or 5) -- Calculate number of legs
for leg = 1, numLegs do
local legNote = args['note_leg' .. leg .. '_' .. rowIndex]
if legNote and legNote:match("^%s*(.-)%s*$") ~= "" then
return true
end
end
 
return false
end
 
-- Function to add a legend to below the table when isFBRStyle is true
local function createFBRLegend()
return mw.html.create('div')
:css('font-size', '90%')
:css('margin-bottom', '0.5em')
:wikitext("Legend: Blue = home team win; Yellow = draw; Red = away team win.")
end
 
-- Function to check whether to reduce font size for upcoming matches
local function checkSmallText(str)
-- Check for font size or small/big HTML tags
if str:match("font%s?%-?size") or str:match("<small>") or str:match("<big>") then
return false
end
-- Remove MediaWiki's unique placeholder sequences for references
str = str:gsub('\127%\'"`UNIQ.-QINU`"%\'\127', '')
-- Remove superscript tags and their contents
str = str:gsub('<sup.->.-</sup>', '')
-- Check for walkover-related strings (never shown in small text)
if str:lower():match("walkover") or str:lower():match("w%.o%.") or str:lower():match("w/o") then
return false
end
-- Replace wiki links with their display text or link text
str = str:gsub("%[%[.-%]%]", replaceLink)
-- Remove all text inside parentheses
str = str:gsub("%b()", "")
-- Exit if string contains only en/em dash
if str == "—" or str == "–" then
return false
end
-- Convert dashes to a standard format
str = str:gsub('[–—―‒−]+', '-')
-- Remove opening and closing HTML tags
str = str:gsub("</?%w+[^>]*>", "")
-- Remove all whitespace
str = str:gsub("%s+", "")
-- Check if the string matches only a scoreline
if str:match("^%d+-%d+$") then
return false
else
return true
end
end
 
-- Function to format the dashes and winning notes for aggregate/leg score parameters, and divide the score from references/notes/superscripts
local function format_and_extract_score(s, doWrap)
if not s then return '', '' end -- Return empty strings if input is nil
local function format_dash(pattern)
s = mw.ustring.gsub(s, '^' .. pattern, '%1–%2')
s = mw.ustring.gsub(s, '%(' .. pattern, '(%1–%2')
end
 
-- Format dashes
-- Remove MediaWiki's unique placeholder sequences for references
format_dash('%s*([%d%.]+)%s*[–—―‒−%-]%s*([%d%.]+)')
str = str:gsub('\127%\'"`UNIQ.-QINU`"%\'\127', '')
format_dash('%s*([%d%.]+)%s*&[MmNn][Dd][Aa][Ss][Hh];%s*([%d%.]+)')
 
format_dash('%s*(%[%[[^%[%]]*%|[%d%.]+)%s*[–—―‒−%-]%s*([%d%.]+)')
-- Remove superscript tags and their contents
format_dash('%s*(%[[^%[%]%s]*%s+[%d%.]+)%s*[–—―‒−%-]%s*([%d%.]+)')
str = str:gsub('<sup.->.-</sup>', '')
format_dash('%s*(%[%[[^%[%]]*%|[%d%.]+)%s*&[MmNn][Dd][Aa][Ss][Hh];%s*([%d%.]+)')
format_dash('%s*(%[[^%[%]%s]*%s+[%d%.]+)%s*&[MmNn][Dd][Aa][Ss][Hh];%s*([%d%.]+)')
 
-- Format winning notes in brackets
-- Check for walkover-related strings (never shown in small text)
if str:lower():match("walkover")doWrap orand not str:lower()s:match("w%(.o*%.(") or str:lower():match("w/o") then
s = mw.ustring.gsub(s, '(%(%d+%s*–%s*%d+)%s+[Pp]%.?[EeSs]?%.?[NnOo]?%.?%)', '%1 [[Adu penalti|a.p]])')
return false
s = mw.ustring.gsub(s, '%([Aa]%.?[Ee]%.?[Tt]%.?%)', '([[Perpanjangan waktu (sepak bola)|p.w.]])')
else
s = mw.ustring.gsub(s, '(%(%d+%s*–%s*%d+)%s+[Pp]%.?[EeSs]?%.?[NnOo]?%.?%)', '<span class="nowrap">%1 [[Adu penalti|a.p]])</span>')
s = mw.ustring.gsub(s, '%([Aa]%.?[Ee]%.?[Tt]%.?%)', '<span class="nowrap">([[Perpanjangan waktu (sepak bola)|p.w.]])</span>')
end
s = mw.ustring.gsub(s, '%([Aa]%.?[Gg]?%.?[Rr]?%.?%)', '([[Peraturan gol tandang|p.g.t]])')
 
-- Extract end text
-- Replace wiki links with their display text or link text
-- Pattern to match superscript
str = str:gsub("%[%[.-%]%]", replaceLink)
local supStart = s:find('<sup')
-- Pattern to match the unique placeholder
local placeholderStart = s:find('\127%\'"`UNIQ')
 
-- Function to find the first parenthesis outside of wikilinks
-- Remove all text inside parentheses
local function find_paren_outside_wikilinks(s)
str = str:gsub("%b()", "")
local pos = 1
while true do
pos = s:find('%(', pos)
if not pos then break end
 
-- ExitCheck if stringthere are unclosed contains[[ onlybefore en/emthis dashposition
local beforeParen = s:sub(1, pos - 1)
if str == "—" or str == "–" then
return false local openLinks = 0
for linkStart in beforeParen:gmatch('%[%[') do
openLinks = openLinks + 1
end
for linkEnd in beforeParen:gmatch('%]%]') do
openLinks = openLinks - 1
end
 
-- If there are no unclosed links, this is a valid parenthesis
if openLinks == 0 then
return pos
end
 
pos = pos + 1
end
return nil
end
 
-- Find the first parenthesis outside of wikilinks
-- Convert dashes to a standard format
local parenStart = find_paren_outside_wikilinks(s)
str = str:gsub('[–—―‒−]+', '-')
 
-- RemoveStore openingall andstart closingpositions HTMLin tagsa table
local startPositions = {}
str = str:gsub("</?%w+[^>]*>", "")
if supStart then table.insert(startPositions, supStart) end
if placeholderStart then table.insert(startPositions, placeholderStart) end
if parenStart then table.insert(startPositions, parenStart) end
 
local startPos
-- Remove all whitespace
if #startPositions > 0 then
str = str:gsub("%s+", "")
startPos = math.min(unpack(startPositions)) -- Find the minimum start position
end
 
if startPos then
-- Check if the string matches only a scoreline
-- Find the preceding whitespace
if str:match("^%d+-%d+$") then
local wsStart = s:find("%s*$", 1, startPos)
return false
 
-- Extract the score and endText
local scoreMatch = s:sub(1, wsStart and wsStart - 1 or startPos - 1)
local endText = s:sub(wsStart or startPos)
 
return scoreMatch, endText
else
-- If no match found, return truethe entire score
return s, ""
end
end
 
-- Function to formatclean theteam dashesnames and winninggenerate notes for aggregate/leg score parameterslinks
local function format_scorecleanAndGenerateLinks(steam1, noWrapteam2, score, isSecondLeg)
local function cleanTeam(str, defaultName)
if not s then return '' end -- Return empty string if input is nil
if str and str ~= "" then
str = str:gsub('<sup.->.-</sup>', '')
str = str:gsub("</?%w+[^>]*>", "")
str = str:gsub('\127%\'"`UNIQ.-QINU`"%\'\127', '')
str = str:gsub("%[%[[Ff]ile:[^%]]+%]%]", "")
str = str:gsub("%[%[[Bb]erkas:[^%]]+%]%]", "")
str = str:gsub("%[%[[Ii]mage:[^%]]+%]%]", "")
str = str:gsub("%[%[.-%]%]", replaceLink)
str = str:gsub("%s*&nbsp;%s*", "")
str = str:match("^%s*(.-)%s*$") -- Remove leading and trailing whitespace
return str ~= "" and str or defaultName
end
return defaultName
end
 
team1 = cleanTeam(team1, "Team 1")
local function format_dash(pattern)
steam2 = mw.ustring.gsubcleanTeam(steam2, '^' .. pattern,"Team '%1–%2'")
 
s = mw.ustring.gsub(s, '%(' .. pattern, '(%1–%2')
if score and score:match("%S") then
local linkScore = score
if score:find('%[') then
linkScore = score:match('^([%d%.]+–[%d%.]+)')
if not linkScore then
return score
end
end
 
if linkScore then
local link
if isSecondLeg then
link = "[[#" .. team2 .. " v " .. team1 .. "|" .. linkScore .. "]]"
else
link = "[[#" .. team1 .. " v " .. team2 .. "|" .. linkScore .. "]]"
end
return link .. score:sub(#linkScore + 1)
end
end
 
--return Format dashesscore
end
format_dash('%s*([%d%.]+)%s*[–—―‒−%-]%s*([%d%.]+)')
format_dash('%s*([%d%.]+)%s*&[MmNn][Dd][Aa][Ss][Hh];%s*([%d%.]+)')
format_dash('%s*(%[%[[^%[%]]*%|[%d%.]+)%s*[–—―‒−%-]%s*([%d%.]+)')
format_dash('%s*(%[[^%[%]%s]*%s+[%d%.]+)%s*[–—―‒−%-]%s*([%d%.]+)')
format_dash('%s*(%[%[[^%[%]]*%|[%d%.]+)%s*&[MmNn][Dd][Aa][Ss][Hh];%s*([%d%.]+)')
format_dash('%s*(%[[^%[%]%s]*%s+[%d%.]+)%s*&[MmNn][Dd][Aa][Ss][Hh];%s*([%d%.]+)')
 
-- Function to process notes for aggregate and leg scores
-- Format winning notes in brackets
local function processNote(frame, notes, noteKey, noteText, endText, rowIndex, rand_val, noteGroup)
if noWrap then
if not noteText then return endText, notes end
s = mw.ustring.gsub(s, '(%(%d+%s*–%s*%d+)%s+[Pp]%.?[EeSs]?%.?[NnOo]?%.?%)', '%1 [[Penalty shoot-out (association football)|p]])')
if noteText:match("^%s*<sup") or noteText:match("^\127%\'%\"`UNIQ") then
s = mw.ustring.gsub(s, '%([Aa]%.?[Ee]%.?[Tt]%.?%)', '([[Overtime (sports)#Association football|a.e.t.]])')
return noteText .. endText, notes
else
s = mw.ustring.gsub(s, '(%(%d+%s*–%s*%d+)%s+[Pp]%.?[EeSs]?%.?[NnOo]?%.?%)', '<span class="nowrap">%1 [[Penalty shoot-out (association football)|p]])</span>')
s = mw.ustring.gsub(s, '%([Aa]%.?[Ee]%.?[Tt]%.?%)', '<span class="nowrap">([[Overtime (sports)#Association football|a.e.t.]])</span>')
end
s = mw.ustring.gsub(s, '%([Aa]%.?[Gg]?%.?[Rr]?%.?%)', '([[Away goals rule|a]])')
 
local function createInlineNote(name)
return s
return frame:extensionTag{
name = 'ref',
args = {
name = name,
group = noteGroup
}
}
end
 
-- Check if noteText is a reference to another note
local referenced_note = noteText:match("^(agg_%d+)$") or noteText:match("^(leg%d+_%d+)$")
if referenced_note then
local referenced_note_id = '"table_note_' .. referenced_note .. '_' .. rand_val .. '"'
return endText .. createInlineNote(referenced_note_id), notes
end
 
local note_id = '"table_note_' .. noteKey .. '_' .. rowIndex .. '_' .. rand_val .. '"'
if not notes[note_id] then
notes[note_id] = noteText
end
 
return endText .. createInlineNote(note_id), notes
end
 
-- Function to rewritegenerate anchorthe linksfooter ofif match scoresnecessary
local function createFooter(frame, notes, noteGroup, isFBRStyle, displayNotes, externalNotes, legs)
local function rewriteAnchorLinks(text, baselink)
local needFooter = (isFBRStyle and legs == 0) or displayNotes or (next(notes) ~= nil)
if not text then
 
return text
if not needFooter then
return '' -- Return an empty string if no footer is needed
end
 
return text:gsub('(%[%[)(#[^%[%]]*%|)', '%1' .. baselink .. '%2')
local divContent = mw.html.create('div')
:css('font-size', '90%')
:css('margin-bottom', '0.5em')
 
if isFBRStyle and legs == 0 then
divContent:wikitext("Legend: Blue = home team win; Yellow = draw; Red = away team win.")
end
 
if (next(notes) ~= nil and not externalNotes) or displayNotes then
divContent:wikitext((isFBRStyle and legs == 0) and "<br>Notes:" or "Notes:")
end
 
local footer = tostring(divContent)
 
if next(notes) ~= nil or displayNotes then
local noteDefinitions = {}
for noteId, noteText in pairs(notes) do
if type(noteId) == 'string' and noteId:match('^"table_note') then
table.insert(noteDefinitions, frame:extensionTag{
name = 'ref',
args = {
name = noteId,
group = noteGroup
},
content = noteText
})
end
end
 
if externalNotes then
local hiddenRefs = mw.html.create('span')
:css('display', 'none')
:wikitext(table.concat(noteDefinitions))
if isFBRStyle and legs == 0 then
footer = footer .. tostring(hiddenRefs)
else
footer = tostring(hiddenRefs)
end
else
local reflistArgs = {
refs = table.concat(noteDefinitions),
group = noteGroup
}
footer = footer .. frame:expandTemplate{
title = 'reflist',
args = reflistArgs
}
end
end
 
return footer
end
 
-- Main function that processes input and returns the wikitable
function p.main(frame)
local args = require('Modul:Arguments').getArgs(frame, {trim = true})
 
-- Check for section transclusion
local tsection = frame:getParent().args['transcludesection'] or frame:getParent().args['section'] or ''
local bsection = args['section'] or ''
if tsection ~= '' and bsection ~= '' then
if tsection ~= bsection then
return '' -- Return an empty string if sections don't match
end
end
-- Helper function for boolean checks
local function isTrue(value)
if not value then return false end
local lowerValue = value:lower()
return lowerValue == 'y' or lowerValue == 'yes' or lowerValue == '1' or lowerValue == 'true'
end
 
-- Helper function for negative boolean checks
local function isFalse(value)
if not value then return false end
local lowerValue = value:lower()
return lowerValue == 'n' or lowerValue == 'no' or lowerValue == '0' or lowerValue == 'false' or lowerValue == 'null' or lowerValue == 'none'
end
 
local root = mw.html.create()
local matchType = (args.type == 'WNT' or args.type == 'MNT') and 'NT' or (args.type or 'club') -- Set default match type to 'club'
local isWNT = args.type == 'WNT' -- Track if WNT was set
local flagTemplate, flagParam1
local noFlagIcons = false
local fillBlanks = args.fill_blanks and isTrue(args.fill_blanks == 'y' or args.fill_blanks == 'yes' or args.fill_blanks == '1' or args.fill_blanks == 'true')
local generateLinks = isTrue(args.generate_links)
local solidCell = args.solid_cell and (args.solid_cell == 'y' or args.solid_cell == 'yes' or args.solid_cell == '1' or args.solid_cell == 'true' or args.solid_cell == 'grey' or args.solid_cell == 'gray')
local solidCell = isTrue(args.solid_cell) or args.solid_cell == 'grey' or args.solid_cell == 'gray' or args.solid_cell == 'abu-abu'
local baselink = frame:getParent():getTitle()
if mw.title.getCurrentTitle().text == baselink then baselink = '' end
local notes = {}
 
local noteGroup = args.note_group or 'lower-alpha'
local displayNotes = isTrue(args.note_list)
local externalNotes = isFalse(args.note_list)
math.randomseed(os.clock() * 10^8) -- Initialize random number generator
local rand_val = math.random()
-- Process the font size parameter
local fontSize
if args.font_size then
-- Remove trailing '%' if present and convert to number
fontSize = tonumber((args.font_size:gsub('%s*%%$', '')))
if fontSize then
fontSize = math.max(fontSizesize, 85) -- Ensure font size is at least 85
end
end
-- Calculate the font size for small text
local smallFontSize
if fontSize then
smallFontSize = math.floor(((fontSize / 100) * 0.85) * 100)
else
smallFontSize = 85
end
 
-- Process flag parameter to determine flag template and variant
iflocal args.flagflagTemplate and= args.flag:find( or '+fbaicon') then -- Default to {{fbaicon}}
local noFlagIcons = isFalse(args.flag)
flagTemplate, flagParam1 = processIcon(args.flag) -- Process flag icons with variants
local flagSize = args.flag_size
else
if flagSize and not if args.flagflagSize:match('px$') then
flagSize = flagSize .. flagTemplate = args.flag'px'
elseif isWNT then
flagTemplate = 'fbw' -- Default to {{fbw}} for WNT matches
elseif matchType == 'NT' then
flagTemplate = 'fb' -- Default to {{fb}} for NT/MNT matches
else
flagTemplate = 'fbaicon' -- Default to {{fbaicon}} for club matches
end
end
 
-- Check if flagTemplate exists and adjust if necessary
if args.flag and (flagTemplate == 'n' or flagTemplate == 'no' or flagTemplate == '0' or flagTemplate == 'false' or flagTemplate == 'null' or flagTemplate == 'none' or flagTemplate == 'noflag') then
if not noFlagIcons and flagTemplate ~= 'fbaicon' then
noFlagIcons = true -- Hide flag icons for club matches
if matchTypenot == 'NT'templateExists(flagTemplate) then
flagTemplate = 'flagicon'
flagTemplate = isWNT and 'fbw' or 'fb' -- Set flagTemplate to "fbw"/"fb", as disabling flags is not allowed for NT
flagParam1 = false
end
end
 
-- Determine whether line should be displayed
-- Check if flagTemplate exists and adjust if necessary
local showCountry = args.show_country
if matchType == 'NT' and (flagTemplate ~= 'fb' and flagTemplate ~= 'fbw') then
local function shouldShowRow(team1Icon, team2Icon)
if not templateExists(flagTemplate) or not templateExists(flagTemplate .. '-rt') then
if not showCountry or noFlagIcons then
flagTemplate = isWNT and 'fbw' or 'fb'
return true
end
end
elseif not noFlagIcons and flagTemplate ~= 'fbaicon' then
return team1Icon == showCountry or team2Icon == showCountry
if not templateExists(flagTemplate) then
flagTemplate = 'fbaicon'
end
end
 
local legs = (isFalse(args.legs == '1') or args.legs == 'n' or args.legs == 'no' or args.legs == 'false' or args.legs == 'null' or args.legs == 'none' or args.legs == 'single' or args.legs == 'one1') and 0 or tonumber(args.legs) or 2
if legs and legs < 0 then
legs = 2
end
local teamWidth = (tonumber(args['team_width']) and args['team_width'] .. 'px') or '250px'
local scoreWidth = (tonumber(args['score_width']) and args['score_width'] .. 'px') or '80px'
local boldWinner = not isFalse(args.bold_winner == 'n' or args.bold_winner == 'no' or args.bold_winner == '0' or args.bold_winner == 'false' or args.bold_winner == 'null')
local colorWinner = args.color_winner and isTrue(args.color_winner == 'y' or args.color_winner == 'yes' or args.color_winner == '1' or args.color_winner == 'true')
local matchesStyle = args.matches_style
local isFBRStyle = matchesStyle and matchesStyle:upper() == "FBR"
local isHA = isTrue(args.h_a == 'y') or args.h_a(isFBRStyle ==and 'yes' or args.h_a == '1' or args.h_alegs == 'true'0)
local disableAwayGoals = isFalse(args.away_goals == 'n' or args.away_goals == 'no' or args.away_goals == '0' or args.away_goals == 'false' or args.away_goals == 'null')
local disableSmallText = isFalse(args.small_text == 'n' or args.small_text == 'no' or args.small_text == '0' or args.small_text == 'false' or args.small_text == 'null')
local noWrap = args.nowrap and isTrue(args.nowrap == 'y' or args.nowrap == 'yes' or args.nowrap == '1' or args.nowrap == 'true')
local disableNoWrap = isFalse(args.nowrap)
 
local doWrap = not noWrap and not disableNoWrap
local tableClass = 'wikitable'
local tableStyle = 'text-align: center;'
if args.collapsed and isTrue(args.collapsed == 'y' or args.collapsed == 'yes' or args.collapsed == '1' or args.collapsed == 'true') then
tableClass = 'wikitable mw-collapsible mw-collapsed'
tableStyle = tableStyle .. ' width: 100%;'
end
if isTrue(args.center_table) then
tableStyle = tableStyle .. ' margin-left: auto; margin-right: auto; border: none;'
end
if noWrap then
Baris 382 ⟶ 584:
end
if fontSize then
tableStyle = tableStyle .. ' font-size: ' .. fontSize .. '%;'
end
 
Baris 391 ⟶ 593:
if args.id then
table:attr('id', args.id) -- Optional id parameter to allow anchor to table
end
 
-- Add FBR legend if isFBRStyle is true
if isFBRStyle and legs == 0 then
root:node(createFBRLegend())
isHA = true
end
 
Baris 418 ⟶ 614:
-- Create the header row with team and score columns
local header = table:tag('tr')
if doWrap then
local defaultTeam1 = isHA and 'Home' or 'Team 1'
header:css('white-space', 'nowrap')
local defaultTeam2 = isHA and 'Away' or 'Team 2'
end
local defaultTeam1 = isHA and 'Tim kandang' or 'Tim 1'
local defaultTeam2 = isHA and 'Tim tandang' or 'Tim 2'
header:tag('th')
:attr('scope', 'col')
:css('text-align', 'right')
:css('width', teamWidth)
:wikitext(args['team1'] or defaultTeam1)
header:tag('th')
:attr('scope', 'col')
:css('width', scoreWidth)
:wikitext(args['aggregate'] or legs == 0 and 'Hasil' or 'Agregat')
:wikitext(args['aggregate'] or legs == 0 and 'Score' or '[[Aggregate score|<abbr title="Aggregate score">Agg.</abbr>]]<span class="sr-only" style="border: 0; clip: rect(0, 0, 0, 0); clip-path: polygon(0px 0px, 0px 0px, 0px 0px); height: 1px; margin: -1px; overflow: hidden; padding: 0; position: absolute; width: 1px; white-space: nowrap;">Tooltip Aggregate score</span>')
header:tag('th')
:attr('scope', 'col')
:css('text-align', 'left')
:css('width', teamWidth)
:wikitext(args['team2team1'] or defaultTeam2)
 
-- Add columns for each leg if applicable
if legs > 0 then
for leg = 1, legs do
local legHeading = args['leg' .. leg]
 
-- Check if "legN" parameter is present
if args['leg'not .. leg]legHeading then
legHeading = args['leg' .. leg]
else
-- Check if "leg_prefix" parameter is present
if args.leg_prefix then
--legHeading Check if= isTrue(args.leg_prefix) isand y,('Leg yes,' 1,.. leg) or true(args.leg_prefix .. ' ' .. leg)
ifelseif args.leg_prefixleg_suffix ==and 'y' ornot isTrue(args.leg_prefix == 'yes' or args.leg_prefix == '1' or args.leg_prefix == 'true'leg_suffix) then
legHeading = args.leg_suffix .. 'Leg ' .. ordinal(leg)
else
legHeading = args.leg_prefix .. ' ' .. leg
end
-- Check if "leg_suffix" parameter is present and does not equal y, yes, 1, or true
elseif args.leg_suffix and args.leg_suffix ~= 'y' and args.leg_suffix ~= 'yes' and args.leg_suffix ~= '1' and args.leg_suffix ~= 'true' then
legHeading = ordinal(leg) .. ' ' .. args.leg_suffix
else
legHeading = ordinal(leg)'Laga ' .. ' ordinal(leg')
end
end
 
header:tag('th')
:attr('scope', 'col')
:css('width', scoreWidth)
:wikitext(legHeading)
end
end
 
local step = (matchType == 'NT' and 3 or (noFlagIcons and 3 or 5)) + legs -- Determine the step size based on the match type and presence of flag icons
local i = 1
while anyParameterPresent(i, step, args) do
local rowIndex = math.floor((i - 1) / step) + 1
local aggNote = args['note_agg_' .. rowIndex]
local headingParam = args['heading' .. rowIndex]
local team1, team2, aggregateScore, aggregateEndText, legEndText, team1Icon, team2Icon, team1Variant, team2Variant
-- Add a heading above a given row in the table
if headingParam then
local headingRow = table:tag('tr')
headingRow:tag('td')
:attr('colspan', colCount)
:css('background', 'whitesmoke')
:wikitext('<strong>' .. headingParam .. '</strong>')
end
 
local row = table:tag('tr')
local team1, team2, aggregateScore, team1Icon, team2Icon, team1Variant, team2Variant
local team1Winner, team2Winner, manualBold, manualColor, isDraw = false, false, false, false, false
local leg1Score, leg2Score = false, false
local team1Asterick, team2Asterick = false, false
-- Process rows from input
 
team1 = args[i]
-- Process rows for both national team and club matches
if matchType == 'NT'noFlagIcons then
team1 = args[i]
if team1 and team1:match("^%s*%*") then
team1 = team1:gsub("^%s*%*", "")
team1Asterick = true
else
team1, team1Variant = processIcon(args[i])
end
aggregateScore = args[i+1]
team2 = args[i+2]
if team2 and team2:match("^%s*%*") then
team2 = team2:gsub("^%s*%*", "")
team2Asterick = true
else
team2, team2Variant = processIcon(args[i+2])
end
else
team1team1Icon, team1Variant = processIcon(args[i+1])
ifaggregateScore noFlagIcons= thenargs[i+2]
aggregateScoreteam2 = args[i+13]
team2Icon, team2team2Variant = processIcon(args[i+24])
else
team1Icon, team1Variant = processIcon(args[i+1])
aggregateScore = args[i+2]
team2 = args[i+3]
team2Icon, team2Variant = processIcon(args[i+4])
end
end
 
-- NameCheck if the 1st/2ndline should be legshown scoresbased foron two-leggedboth tiesteams
if legsshouldShowRow(team1Icon, == 2team2Icon) then
if-- matchTypeAdd ==a 'NT'heading orabove noFlagIconsa thengiven row in the table
if headingParam and not leg1ScoreshowCountry = args[i+3]then
leg2Scorelocal headingRow = args[i+4]table:tag('tr')
else headingRow:tag('td')
leg1Score = args[i+5] :attr('colspan', colCount)
leg2Score = args[i+6] :css('background', 'whitesmoke')
:wikitext('<strong>' .. headingParam .. '</strong>')
end
end
 
-- Clean the aggregate scorelocal row = table:tag('tr')
local cleanAggregate = cleanScore(aggregateScore)
-- Format and rewrite anchor links for aggregate score
aggregateScore = format_score(aggregateScore, noWrap)
if baselink ~= '' then
aggregateScore = rewriteAnchorLinks(aggregateScore, baselink)
end
 
-- DetermineName the winning1st/2nd teamleg onscores for two-legged aggregateties
if legs == 2 then
team1, team2, team1Winner, team2Winner, manualBold, manualColor, isDraw, aggregateScore = determineWinner(cleanAggregate, matchType, team1, team2, boldWinner, colorWinner, aggregateScore, isFBRStyle, legs, leg1Score, leg2Score, disableAwayGoals)
if noFlagIcons then
leg1Score = args[i+3]
leg2Score = args[i+4]
else
leg1Score = args[i+5]
leg2Score = args[i+6]
end
end
 
-- Add background-color for winning team-- ifClean setthe byaggregate userscore
local team1StylecleanAggregate = 'text-align: right;'cleanScore(aggregateScore)
-- Format and rewrite anchor links for aggregate score
local team2Style = 'text-align: left;'
aggregateScore, aggregateEndText = format_and_extract_score(aggregateScore, doWrap)
if team1Winner and (colorWinner or manualColor) then
aggregateEndText, notes = processNote(frame, notes, 'agg', aggNote, aggregateEndText, rowIndex, rand_val, noteGroup)
team1Style = team1Style .. ' background-color: #CCFFCC;'
if generateLinks and legs == 0 then
end
aggregateScore = cleanAndGenerateLinks(team1, team2, aggregateScore, false)
if team2Winner and (colorWinner or manualColor) then
end
team2Style = team2Style .. ' background-color: #CCFFCC;'
 
end
-- Determine the winning team on aggregate
local skipDetermineWinner = legs == 0 and aggregateScore ~= '' and checkSmallText(aggregateScore)
 
-- Generate text to displayif fornot eachskipDetermineWinner teamthen
team1, team2, team1Winner, team2Winner, manualBold, manualColor, isDraw, aggregateScore = determineWinner(cleanAggregate, team1, team2, boldWinner, colorWinner, aggregateScore, isFBRStyle, legs, leg1Score, leg2Score, disableAwayGoals)
local team1Text, team2Text
if matchType == 'NT' then
if flagParam1 then -- Check whether youth team flag template with age level is used
team1Text = (not team1Asterick and team1 ~= "" and team1 ~= nil) and (expandTemplate(frame, flagTemplate .. '-rt', {flagParam1, team1, variant = team1Variant})) or (team1 ~= nil and team1 or "")
team2Text = (not team2Asterick and team2 ~= "" and team2 ~= nil) and (expandTemplate(frame, flagTemplate, {flagParam1, team2, variant = team2Variant})) or (team2 ~= nil and team2 or "")
else -- Use standard national team flag template without age level
team1Text = (not team1Asterick and team1 ~= "" and team1 ~= nil) and (expandTemplate(frame, flagTemplate .. '-rt', {team1, variant = team1Variant})) or (team1 ~= nil and team1 or "")
team2Text = (not team2Asterick and team2 ~= "" and team2 ~= nil) and (expandTemplate(frame, flagTemplate, {team2, variant = team2Variant})) or (team2 ~= nil and team2 or "")
end
else
team1Text = noFlagIcons and (team1 or '') or ((team1Icon ~= "" and team1Icon ~= nil) and ((team1 or '') .. ' ' .. expandTemplate(frame, flagTemplate, {team1Icon, variant = team1Variant})) or (team1 or ''))
team2Text = noFlagIcons and (team2 or '') or ((team2Icon ~= "" and team2Icon ~= nil) and (expandTemplate(frame, flagTemplate, {team2Icon, variant = team2Variant}) .. ' ' .. (team2 or '')) or (team2 or ''))
end
 
-- When set by user,-- addsAdd blank flags when string is usedbackground-color for awinning team insteadif ofset nationalby team flag templateuser
local team1Style = 'text-align: right;'
if fillBlanks then
iflocal matchTypeteam2Style == 'NTtext-align: left;' then
if team1Winner and (colorWinner ifor team1AsterickmanualColor) then
team1Textteam1Style = team1Textteam1Style .. ' <span class="flagicon">[[Filebackground-color:Flag placeholder.svg|25x17px|link=]]</span>#CCFFCC;'
end
if team2Winner and (colorWinner or manualColor) then
team2Style = team2Style .. ' background-color: #CCFFCC;'
end
-- Function to create flag template parameters
local function getFlagParams(icon, variant)
local params = {icon, variant = variant}
if flagSize then
params.size = flagSize
end
ifreturn team2Asterick thenparams
end
team2Text = '<span class="flagicon">[[File:Flag placeholder.svg|25x17px|link=]]</span> ' .. team2Text
 
end
elseif-- notGenerate noFlagIconstext thento display for each team
local team1Text = noFlagIcons and (team1 or '') or ((team1Icon ~= "" and team1Icon ~= nil) and ((team1 or '') .. '&nbsp;' .. expandTemplate(frame, flagTemplate, getFlagParams(team1Icon, team1Variant))) or (team1 or ''))
local team2Text = noFlagIcons and (team2 or '') or ((team2Icon ~= "" and team2Icon ~= nil) and (expandTemplate(frame, flagTemplate, getFlagParams(team2Icon, team2Variant)) .. '&nbsp;' .. (team2 or '')) or (team2 or ''))
 
-- When set by user, adds blank flag placeholder next to team names
if fillBlanks and not noFlagIcons then
if not team1Icon or team1Icon == "" then
team1Text = team1Text .. ' &nbsp;<span class="flagicon">[[File:Flag placeholder.svg|25x17px|link=]]</span>'
end
if not team2Icon or team2Icon == "" then
team2Text = '<span class="flagicon">[[File:Flag placeholder.svg|25x17px|link=]]</span> &nbsp;' .. team2Text
end
end
end
 
-- Create aggregate score celllocal with conditional stylingaggregateContent
if not disableSmallText and skipDetermineWinner then
local aggregateStyle = ''
if legs == 0 and not disableSmallText and aggregateScoreaggregateContent ~= '<span style="font-size:85%;">' and.. checkSmallText(aggregateScore) then.. '</span>' .. aggregateEndText
else
aggregateStyle = 'font-size: ' .. smallFontSize .. '%;'
aggregateContent = aggregateScore .. aggregateEndText
end
if isFBRStyle and legs == 0 thenend
 
if team1Winner then
-- Create aggregate score cell with conditional styling
aggregateStyle = aggregateStyle .. 'background-color: #BBF3FF;'
elseiflocal team2WinneraggregateStyle then= ''
if doWrap and not (cleanAggregate:match("%(.*%(")) then
aggregateStyle = aggregateStyle .. 'background-color: #FFBBBB;'
aggregateStyle = 'white-space: nowrap;'
end
if isFBRStyle and legs == 0 then
if team1Winner then
aggregateStyle = aggregateStyle .. 'background-color: #BBF3FF;'
elseif team2Winner then
aggregateStyle = aggregateStyle .. 'background-color: #FFBBBB;'
elseif isDraw then
aggregateStyle = aggregateStyle .. 'background-color: #FFFFBB;'
end
elseif isDraw then
aggregateStyle = aggregateStyle .. 'background-color: #FFFFBB;'
end
elseif isDraw then
aggregateStyle = aggregateStyle .. 'background-color: #FFFFBB;'
end
 
-- Create rows for aggregate score and team names, bolded if set by user
row:tag('td'):cssText(team1Style):wikitext((team1Winner and (boldWinner or manualBold) and team1Text ~= '') and ('<strong>' .. team1Text .. '</strong>') or team1Text)
row:tag('td'):cssText(aggregateStyle ~= '' and aggregateStyle or nil):wikitext(aggregateScoreaggregateContent)
row:tag('td'):cssText(team2Style):wikitext((team2Winner and (boldWinner or manualBold) and team2Text ~= '') and ('<strong>' .. team2Text .. '</strong>') or team2Text)
 
-- Add columns for each leg score if applicable
if legs > 0 then
for leg = 1, legs do
local legIndex = i + 4 + leg + (matchType == 'NT' and -2 or (noFlagIcons and -2 or 0))
local legScore = args[legIndex]
if legScore ~ local legNote = "nil"args['note_leg' .. leg .. '_' .. thenrowIndex]
if legScore =~= "nullnil" then
if solidCelllegScore == "null" then
row:tag('td'):css('background',if '#BBBBBB')solidCell then
else row:tag('td'):css('background', '#BBBBBB')
row:tag('td'):wikitext('—')else
legScore = '—'
end
end
 
else
--if FormatlegScore and~= rewrite"null" anchor links for leg scoresthen
legScore = format_score(legScore, noWrap) -- Format and rewrite anchor links for leg scores
if baselink ~= '' thenlocal cleanLeg = cleanScore(legScore)
legScore, legEndText = rewriteAnchorLinksformat_and_extract_score(legScore, baselinkdoWrap)
legEndText, notes = processNote(frame, notes, 'leg' .. leg, legNote, legEndText, rowIndex, rand_val, noteGroup)
end
local legStyle = '' if generateLinks and not aggregateContent:lower():find("bye") then
if not disableSmallText and legScore ~= '' and checkSmallText(legScore)if leg == 1 then
legStyle = 'font-size: ' .. smallFontSize .. '%;' legScore = cleanAndGenerateLinks(team1, team2, legScore, false)
elseif leg == 2 then
legScore = cleanAndGenerateLinks(team1, team2, legScore, true)
end
end
local legContent
if not disableSmallText and legScore ~= '' and checkSmallText(legScore) then
legContent = '<span style="font-size:85%;">' .. legScore .. '</span>' .. legEndText
else
legContent = legScore .. legEndText
end
local legStyle = ''
if doWrap and not (cleanLeg:match("%(.*%(")) then
legStyle = 'white-space: nowrap;'
end
-- Write cells for legs
row:tag('td'):cssText(legStyle ~= '' and legStyle or nil):wikitext(legContent)
end
-- Write cells for legs
row:tag('td'):cssText(legStyle ~= '' and legStyle or nil):wikitext(legScore)
end
end
Baris 635 ⟶ 827:
 
i = i + step
end
-- Generate footer text
local footerText = createFooter(frame, notes, noteGroup, isFBRStyle, displayNotes, externalNotes, legs)
root:wikitext(footerText)
 
local tableCode = tostring(root)
 
-- Rewrite anchor links for the entire table
if baselink ~= '' then
tableCode = mw.ustring.gsub(tableCode, '(%[%[)(#[^%[%]]*%|)', '%1' .. baselink .. '%2')
end
 
return tostring(root)tableCode
end