Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

Module:GroupDraw: Difference between revisions

From eSportsAmaze
No edit summary
No edit summary
 
(5 intermediate revisions by the same user not shown)
Line 3: Line 3:
local cargo = mw.ext.cargo
local cargo = mw.ext.cargo


local function buildLogo(teamName, tourneyData, masterData)
local function sqlEscape(s)
    if not s then return "" end
    s = s:gsub("\\", "\\\\")
    s = s:gsub("'", "\\'")
    return s
end
 
local function getTournamentName(args)
if args.tournament and args.tournament ~= "" then return args.tournament end
local pageTitle = mw.title.getCurrentTitle().text
local parts = mw.text.split(pageTitle, '/')
if parts[2] == "Tournaments" and parts[3] then return parts[3] end
return mw.title.getCurrentTitle().baseText
end
 
local function getTeamDisplay(teamName, tData, mData)
local lightLogo = "Shield_team.png"
local lightLogo = "Shield_team.png"
local darkLogo = "Shield_team_dark.png"
local darkLogo = "Shield_team_dark.png"
local displayName = teamName


if tourneyData and tourneyData.image and tourneyData.image ~= "" then
if tData then
lightLogo = tourneyData.image
if tData.display_name and tData.display_name ~= "" then
darkLogo = (tourneyData.image_dark and tourneyData.image_dark ~= "") and tourneyData.image_dark or lightLogo
displayName = tData.display_name
elseif masterData then
end
if masterData.image and masterData.image ~= "" then
if tData.image and tData.image ~= "" then
lightLogo = masterData.image
lightLogo = tData.image
darkLogo = (tData.image_dark and tData.image_dark ~= "") and tData.image_dark or lightLogo
end
end
 
if lightLogo == "Shield_team.png" and mData then
if mData.image and mData.image ~= "" then
lightLogo = mData.image
else
else
lightLogo = teamName .. ".png"
lightLogo = teamName .. ".png"
end
end
if masterData.image_dark and masterData.image_dark ~= "" then
if mData.image_dark and mData.image_dark ~= "" then
darkLogo = masterData.image_dark
darkLogo = mData.image_dark
else
else
darkLogo = lightLogo
darkLogo = lightLogo
Line 23: Line 46:
end
end


local container = html.create('span'):addClass('team-logo-wrapper')
local container = html.create('div'):addClass('team-cell-flex')
container:tag('span'):addClass('logo-lightmode'):wikitext('[[File:' .. lightLogo .. '|30px|link=|class=team-logo]]')
local logoWrap = container:tag('span'):addClass('team-logo-wrapper')
container:tag('span'):addClass('logo-darkmode'):wikitext('[[File:' .. darkLogo .. '|30px|link=|class=team-logo]]')
logoWrap:tag('span'):addClass('logo-lightmode'):wikitext('[[File:' .. lightLogo .. '|20px|link=|class=team-logo]]')
logoWrap:tag('span'):addClass('logo-darkmode'):wikitext('[[File:' .. darkLogo .. '|20px|link=|class=team-logo]]')
container:tag('span'):wikitext('[[' .. teamName .. '|' .. displayName .. ']]')
 
return tostring(container)
return tostring(container)
end
end
Line 31: Line 57:
function p.main(frame)
function p.main(frame)
local args = frame:getParent().args
local args = frame:getParent().args
local tournamentName = args.tournament or mw.title.getCurrentTitle().text
local mainTitle = args.title
local mainTitle = args.title
local tournamentName = getTournamentName(args)


local groupsInfo = {}
local groupsData = {}
local allTeams = {}
local allTeams = {}
local maxRows = 0
local maxRows = 0


for i = 1, 20 do
for i = 1, 20 do
local gName = args['g' .. i]
local gTitle = args['g' .. i]
local gTeamsStr = args['g' .. i .. 'teams']
local gTeamsStr = args['g' .. i .. 'teams']


if gName and gTeamsStr then
if gTitle and gTeamsStr then
local teamList = mw.text.split(gTeamsStr, ",")
local teamList = mw.text.split(gTeamsStr, ",")
local cleanedTeams = {}
local cleanedTeams = {}
Line 49: Line 75:
local trimmedTeam = mw.text.trim(tName)
local trimmedTeam = mw.text.trim(tName)
if trimmedTeam ~= "" then
if trimmedTeam ~= "" then
table.insert(cleanedTeams, trimmedTeam)
local isText = false
table.insert(allTeams, "'" .. trimmedTeam:gsub("'", "\\'") .. "'")
local printName = trimmedTeam
 
if trimmedTeam:lower():sub(1, 5) == "text:" then
isText = true
printName = mw.text.trim(trimmedTeam:sub(6))
end
 
table.insert(cleanedTeams, { name = trimmedTeam, display = printName, textOnly = isText })
 
if not isText then
table.insert(allTeams, "'" .. sqlEscape(trimmedTeam) .. "'")
end
end
end
end
end


table.insert(groupsInfo, { title = gName, squad = cleanedTeams })
table.insert(groupsData, { heading = gTitle, squad = cleanedTeams })
if #cleanedTeams > maxRows then maxRows = #cleanedTeams end
if #cleanedTeams > maxRows then maxRows = #cleanedTeams end
end
end
end
end


if #groupsInfo == 0 then return "" end
if #groupsData == 0 then return "" end


local teamSql = table.concat(allTeams, ",")
local teamSql = table.concat(allTeams, ",")
local tourneyDb = {}
local masterDb = {}


local tourneyDb = {}
if cargo and cargo.query and teamSql ~= "" then
if cargo and cargo.query and teamSql ~= "" then
local tResults = cargo.query("Tournament_Teams", "team, display_name, image, image_dark", { where = "tournament='" .. tournamentName:gsub("'", "\\'") .. "' AND team IN (" .. teamSql .. ")", limit = 500 })
local tResults = cargo.query("Tournament_Teams", "team, display_name, image, image_dark", { where = "tournament='" .. sqlEscape(tournamentName) .. "' AND team IN (" .. teamSql .. ")", limit = 500 })
for _, rowData in ipairs(tResults) do tourneyDb[rowData.team] = rowData end
if tResults then
for _, row in ipairs(tResults) do tourneyDb[row.team:lower()] = row end
end
end


local masterDb = {}
if cargo and cargo.query and teamSql ~= "" then
local mResults = cargo.query("Teams", "name, image, image_dark", { where = "name IN (" .. teamSql .. ")", limit = 500 })
local mResults = cargo.query("Teams", "name, image, image_dark", { where = "name IN (" .. teamSql .. ")", limit = 500 })
for _, rowData in ipairs(mResults) do masterDb[rowData.name] = rowData end
if mResults then
for _, row in ipairs(mResults) do masterDb[row.name:lower()] = row end
end
end
end


local mainContainer = html.create('div'):addClass('group-draw-wrapper')
local wrapper = html.create('div'):addClass('modern-group-draw')
local drawTable = mainContainer:tag('table'):addClass('wikitable group-draw-table'):css('width', '100%'):css('border-collapse', 'collapse')
local drawTable = wrapper:tag('table'):addClass('sharp-table')


if mainTitle and mainTitle ~= "" then
if mainTitle and mainTitle ~= "" then
local titleRow = drawTable:tag('tr')
local titleRow = drawTable:tag('tr')
titleRow:tag('th'):attr('colspan', tostring(#groupsInfo)):wikitext(mainTitle):css('text-align', 'center'):css('background-color', '#e6edf4'):css('font-size', '1.1em'):css('padding', '8px')
titleRow:tag('th'):attr('colspan', tostring(#groupsData)):addClass('distinct-main-header'):wikitext(mainTitle)
end
end


local topHeader = drawTable:tag('tr')
local topHeader = drawTable:tag('tr')
for _, grp in ipairs(groupsInfo) do
for _, grp in ipairs(groupsData) do
topHeader:tag('th'):wikitext(grp.title):css('text-align', 'center'):css('background-color', '#f2f6fa')
topHeader:tag('th'):addClass('distinct-group-header'):wikitext(grp.heading)
end
end


for rIndex = 1, maxRows do
for rIndex = 1, maxRows do
local tableRow = drawTable:tag('tr')
local tableRow = drawTable:tag('tr')
for _, grp in ipairs(groupsInfo) do
for _, grp in ipairs(groupsData) do
local cellContent = tableRow:tag('td')
local cellContent = tableRow:tag('td')
local targetTeam = grp.squad[rIndex]
local targetData = grp.squad[rIndex]


if targetTeam then
if targetData then
local tData = tourneyDb[targetTeam]
if targetData.textOnly then
local mData = masterDb[targetTeam]
local container = html.create('div'):addClass('team-cell-flex')
local displayName = targetTeam
local logoWrap = container:tag('span'):addClass('team-logo-wrapper')
 
logoWrap:tag('span'):addClass('logo-lightmode'):wikitext('[[File:Shield_team.png|20px|link=|class=team-logo]]')
if tData and tData.display_name and tData.display_name ~= "" then
logoWrap:tag('span'):addClass('logo-darkmode'):wikitext('[[File:Shield_team_dark.png|20px|link=|class=team-logo]]')
displayName = tData.display_name
container:tag('span'):wikitext(targetData.display)
cellContent:node(container)
else
local tData = tourneyDb[targetData.name:lower()]
local mData = masterDb[targetData.name:lower()]
cellContent:wikitext(getTeamDisplay(targetData.name, tData, mData))
end
end
local generatedLogo = buildLogo(targetTeam, tData, mData)
local cellDiv = cellContent:tag('div'):css('display', 'flex'):css('align-items', 'center'):css('gap', '10px')
cellDiv:wikitext(generatedLogo .. ' [[' .. targetTeam .. '|' .. displayName .. ']]')
end
end
end
end
end
end


return tostring(mainContainer)
return tostring(wrapper)
end
end


return p
return p

Latest revision as of 01:31, 3 March 2026

Documentation for this module may be created at Module:GroupDraw/doc

local p = {}
local html = mw.html
local cargo = mw.ext.cargo

local function sqlEscape(s)
    if not s then return "" end
    s = s:gsub("\\", "\\\\")
    s = s:gsub("'", "\\'")
    return s
end

local function getTournamentName(args)
if args.tournament and args.tournament ~= "" then return args.tournament end
local pageTitle = mw.title.getCurrentTitle().text
local parts = mw.text.split(pageTitle, '/')
if parts[2] == "Tournaments" and parts[3] then return parts[3] end
return mw.title.getCurrentTitle().baseText
end

local function getTeamDisplay(teamName, tData, mData)
local lightLogo = "Shield_team.png"
local darkLogo = "Shield_team_dark.png"
local displayName = teamName

if tData then
if tData.display_name and tData.display_name ~= "" then
displayName = tData.display_name
end
if tData.image and tData.image ~= "" then
lightLogo = tData.image
darkLogo = (tData.image_dark and tData.image_dark ~= "") and tData.image_dark or lightLogo
end
end

if lightLogo == "Shield_team.png" and mData then
if mData.image and mData.image ~= "" then
lightLogo = mData.image
else
lightLogo = teamName .. ".png"
end
if mData.image_dark and mData.image_dark ~= "" then
darkLogo = mData.image_dark
else
darkLogo = lightLogo
end
end

local container = html.create('div'):addClass('team-cell-flex')
local logoWrap = container:tag('span'):addClass('team-logo-wrapper')
logoWrap:tag('span'):addClass('logo-lightmode'):wikitext('[[File:' .. lightLogo .. '|20px|link=|class=team-logo]]')
logoWrap:tag('span'):addClass('logo-darkmode'):wikitext('[[File:' .. darkLogo .. '|20px|link=|class=team-logo]]')
container:tag('span'):wikitext('[[' .. teamName .. '|' .. displayName .. ']]')

return tostring(container)
end

function p.main(frame)
local args = frame:getParent().args
local mainTitle = args.title
local tournamentName = getTournamentName(args)

local groupsData = {}
local allTeams = {}
local maxRows = 0

for i = 1, 20 do
local gTitle = args['g' .. i]
local gTeamsStr = args['g' .. i .. 'teams']

if gTitle and gTeamsStr then
local teamList = mw.text.split(gTeamsStr, ",")
local cleanedTeams = {}

for _, tName in ipairs(teamList) do
local trimmedTeam = mw.text.trim(tName)
if trimmedTeam ~= "" then
local isText = false
local printName = trimmedTeam

if trimmedTeam:lower():sub(1, 5) == "text:" then
isText = true
printName = mw.text.trim(trimmedTeam:sub(6))
end

table.insert(cleanedTeams, { name = trimmedTeam, display = printName, textOnly = isText })

if not isText then
table.insert(allTeams, "'" .. sqlEscape(trimmedTeam) .. "'")
end
end
end

table.insert(groupsData, { heading = gTitle, squad = cleanedTeams })
if #cleanedTeams > maxRows then maxRows = #cleanedTeams end
end
end

if #groupsData == 0 then return "" end

local teamSql = table.concat(allTeams, ",")
local tourneyDb = {}
local masterDb = {}

if cargo and cargo.query and teamSql ~= "" then
local tResults = cargo.query("Tournament_Teams", "team, display_name, image, image_dark", { where = "tournament='" .. sqlEscape(tournamentName) .. "' AND team IN (" .. teamSql .. ")", limit = 500 })
if tResults then
for _, row in ipairs(tResults) do tourneyDb[row.team:lower()] = row end
end

local mResults = cargo.query("Teams", "name, image, image_dark", { where = "name IN (" .. teamSql .. ")", limit = 500 })
if mResults then
for _, row in ipairs(mResults) do masterDb[row.name:lower()] = row end
end
end

local wrapper = html.create('div'):addClass('modern-group-draw')
local drawTable = wrapper:tag('table'):addClass('sharp-table')

if mainTitle and mainTitle ~= "" then
local titleRow = drawTable:tag('tr')
titleRow:tag('th'):attr('colspan', tostring(#groupsData)):addClass('distinct-main-header'):wikitext(mainTitle)
end

local topHeader = drawTable:tag('tr')
for _, grp in ipairs(groupsData) do
topHeader:tag('th'):addClass('distinct-group-header'):wikitext(grp.heading)
end

for rIndex = 1, maxRows do
local tableRow = drawTable:tag('tr')
for _, grp in ipairs(groupsData) do
local cellContent = tableRow:tag('td')
local targetData = grp.squad[rIndex]

if targetData then
if targetData.textOnly then
local container = html.create('div'):addClass('team-cell-flex')
local logoWrap = container:tag('span'):addClass('team-logo-wrapper')
logoWrap:tag('span'):addClass('logo-lightmode'):wikitext('[[File:Shield_team.png|20px|link=|class=team-logo]]')
logoWrap:tag('span'):addClass('logo-darkmode'):wikitext('[[File:Shield_team_dark.png|20px|link=|class=team-logo]]')
container:tag('span'):wikitext(targetData.display)
cellContent:node(container)
else
local tData = tourneyDb[targetData.name:lower()]
local mData = masterDb[targetData.name:lower()]
cellContent:wikitext(getTeamDisplay(targetData.name, tData, mData))
end
end
end
end

return tostring(wrapper)
end

return p