Module:GroupDraw: Difference between revisions
From eSportsAmaze
More actions
Esportsamaze (talk | contribs) No edit summary |
Esportsamaze (talk | contribs) 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 | 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 | if tData then | ||
lightLogo = | if tData.display_name and tData.display_name ~= "" then | ||
darkLogo = ( | displayName = tData.display_name | ||
end | |||
if | if tData.image and tData.image ~= "" then | ||
lightLogo = | 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 | if mData.image_dark and mData.image_dark ~= "" then | ||
darkLogo = | 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') | ||
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) | 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 mainTitle = args.title | local mainTitle = args.title | ||
local tournamentName = getTournamentName(args) | |||
local | local groupsData = {} | ||
local allTeams = {} | local allTeams = {} | ||
local maxRows = 0 | local maxRows = 0 | ||
for i = 1, 20 do | for i = 1, 20 do | ||
local | local gTitle = args['g' .. i] | ||
local gTeamsStr = args['g' .. i .. 'teams'] | local gTeamsStr = args['g' .. i .. 'teams'] | ||
if | 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 | 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( | 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 # | if #groupsData == 0 then return "" end | ||
local teamSql = table.concat(allTeams, ",") | local teamSql = table.concat(allTeams, ",") | ||
local tourneyDb = {} | |||
local masterDb = {} | |||
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 | local tResults = cargo.query("Tournament_Teams", "team, display_name, image, image_dark", { where = "tournament='" .. sqlEscape(tournamentName) .. "' AND team IN (" .. teamSql .. ")", limit = 500 }) | ||
for _, | if tResults then | ||
for _, row in ipairs(tResults) do tourneyDb[row.team:lower()] = row end | |||
end | end | ||
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 _, | if mResults then | ||
for _, row in ipairs(mResults) do masterDb[row.name:lower()] = row end | |||
end | |||
end | end | ||
local | local wrapper = html.create('div'):addClass('modern-group-draw') | ||
local drawTable = | 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(# | 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( | for _, grp in ipairs(groupsData) do | ||
topHeader:tag('th'): | 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( | for _, grp in ipairs(groupsData) do | ||
local cellContent = tableRow:tag('td') | local cellContent = tableRow:tag('td') | ||
local | local targetData = grp.squad[rIndex] | ||
if | if targetData then | ||
local tData = tourneyDb[ | if targetData.textOnly then | ||
local mData = masterDb[ | 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 | ||
end | end | ||
end | end | ||
return tostring( | 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