Module:Tournament: Difference between revisions
From eSportsAmaze
More actions
Esportsamaze (talk | contribs) No edit summary |
Esportsamaze (talk | contribs) No edit summary |
||
| Line 2: | Line 2: | ||
local html = mw.html | local html = mw.html | ||
local lang = mw.getContentLanguage() | local lang = mw.getContentLanguage() | ||
-- ============================================================ | |||
-- ICON LIBRARY (SVGs) - No External Dependencies | |||
-- ============================================================ | |||
local icons = { | |||
instagram = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" fill="currentColor"><path d="M224.1 141c-63.6 0-114.9 51.3-114.9 114.9s51.3 114.9 114.9 114.9S339 319.5 339 255.9 287.7 141 224.1 141zm0 189.6c-41.1 0-74.7-33.5-74.7-74.7s33.5-74.7 74.7-74.7 74.7 33.5 74.7 74.7-33.6 74.7-74.7 74.7zm146.4-194.3c0 14.9-12 26.8-26.8 26.8-14.9 0-26.8-12-26.8-26.8s12-26.8 26.8-26.8 26.8 12 26.8 26.8zm76.1 27.2c-1.7-35.9-9.9-67.7-36.2-93.9-26.2-26.2-58-34.4-93.9-36.2-37-2.1-147.9-2.1-184.9 0-35.8 1.7-67.6 9.9-93.9 36.1s-34.4 58-36.2 93.9c-2.1 37-2.1 147.9 0 184.9 1.7 35.9 9.9 67.7 36.2 93.9s58 34.4 93.9 36.2c37 2.1 147.9 2.1 184.9 0 35.9-1.7 67.7-9.9 93.9-36.2 26.2-26.2 34.4-58 36.2-93.9 2.1-37 2.1-147.8 0-184.8zM398.8 388c-7.8 19.6-22.9 34.7-42.6 42.6-29.5 11.7-99.5 9-132.1 9s-102.7 2.6-132.1-9c-19.6-7.8-34.7-22.9-42.6-42.6-11.7-29.5-9-99.5-9-132.1s-2.6-102.7 9-132.1c7.8-19.6 22.9-34.7 42.6-42.6 29.5-11.7 99.5-9 132.1-9s102.7-2.6 132.1 9c19.6 7.8 34.7 22.9 42.6 42.6 11.7 29.5 9 99.5 9 132.1s2.7 102.7-9 132.1z"/></svg>', | |||
twitter = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="currentColor"><path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z"/></svg>', | |||
youtube = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512" fill="currentColor"><path d="M549.7 124.1c-6.3-23.7-24.8-42.3-48.3-48.6C458.8 64 288 64 288 64S117.2 64 74.6 75.5c-23.5 6.3-42 24.9-48.3 48.6-11.4 42.9-11.4 132.3-11.4 132.3s0 89.4 11.4 132.3c6.3 23.7 24.8 41.5 48.3 47.8C117.2 448 288 448 288 448s170.8 0 213.4-11.5c23.5-6.3 42-24.2 48.3-47.8 11.4-42.9 11.4-132.3 11.4-132.3s0-89.4-11.4-132.3zm-317.5 213.5V175.2l142.7 81.2-142.7 81.2z"/></svg>', | |||
discord = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512" fill="currentColor"><path d="M524.5 69.8a1.5 1.5 0 0 0 -.8-.7A485.1 485.1 0 0 0 404.1 32a1.8 1.8 0 0 0 -1.9 .9 337.5 337.5 0 0 0 -14.9 30.6 447.8 447.8 0 0 0 -134.4 0 309.5 309.5 0 0 0 -15.1-30.6 1.9 1.9 0 0 0 -1.9-.9A483.7 483.7 0 0 0 116.1 69.1a1.7 1.7 0 0 0 -.8 .7C39.1 183.7 18.2 294.7 28.4 404.4a2 2 0 0 0 .8 1.4A487.7 487.7 0 0 0 176 479.9a1.9 1.9 0 0 0 2.1-.7A348.2 348.2 0 0 0 208.1 430.4a1.9 1.9 0 0 0 -1-2.6 321.2 321.2 0 0 1 -45.9-21.9 1.9 1.9 0 0 1 -.2-3.1c3.1-2.3 6.2-4.7 9.1-7.1a1.8 1.8 0 0 1 1.9-.3c96.2 43.9 200.4 43.9 295.5 0a1.8 1.8 0 0 1 1.9 .2c2.9 2.4 6 4.9 9.1 7.2a1.9 1.9 0 0 1 -.2 3.1 301.4 301.4 0 0 1 -45.9 21.8 1.9 1.9 0 0 0 -1 2.6 391.1 391.1 0 0 0 30 48.8 1.9 1.9 0 0 0 2.1 .7A486 486 0 0 0 610.7 405.7a1.9 1.9 0 0 0 .8-1.4C623.7 277.6 590.9 167.5 524.5 69.8zM222.5 337.6c-29 0-52.8-26.6-52.8-59.2S193.1 219.1 222.5 219.1c29.7 0 53.3 26.8 52.8 59.2C275.3 311 251.9 337.6 222.5 337.6zm195.4 0c-29 0-52.8-26.6-52.8-59.2S388.4 219.1 417.9 219.1c29.7 0 53.3 26.8 52.8 59.2C470.7 311 447.5 337.6 417.9 337.6z"/></svg>', | |||
facebook = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="currentColor"><path d="M504 256C504 119 393 8 256 8S8 119 8 256c0 125.7 87.1 231.7 203.2 250V332h-61v-76h61v-53.1c0-60.2 35.8-93.5 90.7-93.5 26.3 0 53.8 4.7 53.8 4.7v59.1h-30.3c-29.8 0-39.1 18.5-39.1 37.5v45.3h66.7l-10.7 76h-56v174C416.9 487.7 504 381.7 504 256z"/></svg>', | |||
website = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="currentColor"><path d="M352 256c0 22.2-1.2 43.6-3.3 64H163.3c-2.2-20.4-3.3-41.8-3.3-64s1.2-43.6 3.3-64h185.4c2.2 20.4 3.3 41.8 3.3 64zm28.8-64h123.1c5.3 20.5 8.1 41.9 8.1 64s-2.8 43.5-8.1 64H380.8c2.1-20.6 3.2-42 3.2-64s-1.1-43.4-3.2-64zm112.6-32H376.7c-10-63.9-29.8-117.4-55.3-151.6 78.3 20.7 142 77.5 171.9 151.6zm-149.1 0H167.7c6.1-36.4 15.5-68.6 27-94.7 10.5-23.6 22.2-40.7 33.5-51.5C239.4 3.2 248.7 0 256 0s16.6 3.2 27.8 13.8c11.3 10.8 23 27.9 33.5 51.5 11.6 26 20.9 58.2 27 94.7zm-209 0H18.6c30-74.1 93.6-130.9 172-151.6-25.5 34.2-45.2 87.7-55.3 151.6zM8.1 192h123.1c-2.1 20.6-3.2 42-3.2 64s1.1 43.4 3.2 64H8.1C2.8 299.5 0 278.1 0 256s2.8-43.5 8.1-64zm18.6 160h116.9c10.1 63.9 29.8 117.4 55.3 151.6-78.4-20.7-142-77.5-172-151.6zm149.1 0h160.4c-6.1 36.4-15.5 68.6-27 94.7-10.5 23.6-22.2 40.7-33.5 51.5-11.2 10.7-20.5 13.9-27.8 13.9s-16.6-3.2-27.8-13.8c-11.3-10.8-23-27.9-33.5-51.5-11.6-26-20.9-58.2-27-94.7zm209 0h116.9c-30 74.1-93.6 130.9-171.9 151.6 25.5-34.2 45.2-87.7 55.3-151.6z"/></svg>', | |||
leftArrow = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512" fill="currentColor"><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l192 192c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 278.6 86.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-192 192z"/></svg>', | |||
rightArrow = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512" fill="currentColor"><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-192 192c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 41.4 86.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l192 192z"/></svg>' | |||
} | |||
-- ============================================================ | -- ============================================================ | ||
| Line 7: | Line 21: | ||
-- ============================================================ | -- ============================================================ | ||
local function formatCurrency(amount) | local function formatCurrency(amount) | ||
if not amount or amount == "" or amount == "0" then return "TBD" end | if not amount or amount == "" or amount == "0" then return "TBD" end | ||
| Line 21: | Line 34: | ||
end | end | ||
local function formatDateRange(startStr, endStr) | local function formatDateRange(startStr, endStr) | ||
if not startStr or startStr == "" then return "TBA" end | if not startStr or startStr == "" then return "TBA" end | ||
| Line 33: | Line 45: | ||
end | end | ||
local function getCleanTitle(pageLink) | local function getCleanTitle(pageLink) | ||
if not pageLink then return "" end | if not pageLink then return "" end | ||
| Line 41: | Line 52: | ||
end | end | ||
-- Helper: Social Icon Generator ( | -- Helper: Social Icon Generator (Uses Embedded SVGs) | ||
local function getSocials(args) | local function getSocials(args) | ||
local container = html.create('div'):addClass('fib-socials plainlinks') | local container = html.create('div'):addClass('fib-socials plainlinks') | ||
local hasSocials = false | local hasSocials = false | ||
local platforms = { | local platforms = { | ||
{arg='instagram', icon= | {arg='instagram', icon=icons.instagram}, | ||
{arg='twitter', icon= | {arg='twitter', icon=icons.twitter}, | ||
{arg='youtube', icon= | {arg='youtube', icon=icons.youtube}, | ||
{arg='discord', icon= | {arg='discord', icon=icons.discord}, | ||
{arg='facebook', icon= | {arg='facebook', icon=icons.facebook}, | ||
{arg='website', icon= | {arg='website', icon=icons.website} | ||
} | } | ||
| Line 59: | Line 69: | ||
if args[p.arg] and args[p.arg] ~= "" then | if args[p.arg] and args[p.arg] ~= "" then | ||
hasSocials = true | hasSocials = true | ||
-- | -- SVG wrapper | ||
container:wikitext('[' .. args[p.arg] .. ' <span class="fib-social-icon"> | container:wikitext('[' .. args[p.arg] .. ' <span class="fib-social-icon">' .. p.icon .. '</span>]') | ||
end | end | ||
end | end | ||
| Line 96: | Line 106: | ||
darkFile = name .. "_dark" .. ext | darkFile = name .. "_dark" .. ext | ||
end | end | ||
local hasLight = mw.title.new('File:' .. lightFile).exists | local hasLight = mw.title.new('File:' .. lightFile).exists | ||
local hasDark = mw.title.new('File:' .. darkFile).exists | local hasDark = mw.title.new('File:' .. darkFile).exists | ||
local container = html.create('div'):addClass('fib-image') | local container = html.create('div'):addClass('fib-image') | ||
local lSpan = container:tag('span'):addClass('logo-lightmode') | local lSpan = container:tag('span'):addClass('logo-lightmode') | ||
| Line 152: | Line 160: | ||
local header = root:tag('div'):addClass('fib-header') | local header = root:tag('div'):addClass('fib-header') | ||
header:tag('div'):addClass('fib-title'):wikitext(args.name or cleanName) | header:tag('div'):addClass('fib-title'):wikitext(args.name or cleanName) | ||
root:wikitext(getInfoboxLogo(page, args.image, args.image_dark)) | root:wikitext(getInfoboxLogo(page, args.image, args.image_dark)) | ||
| Line 187: | Line 193: | ||
root:wikitext(getSocials(args)) | root:wikitext(getSocials(args)) | ||
-- FIXED: Using | -- FIXED: Using embedded SVG Icons for arrows | ||
if args.previous or args.next then | if args.previous or args.next then | ||
local nav = root:tag('div'):addClass('fib-nav') | local nav = root:tag('div'):addClass('fib-nav') | ||
| Line 193: | Line 199: | ||
local prevBtn = nav:tag('div'):addClass('fib-nav-btn prev') | local prevBtn = nav:tag('div'):addClass('fib-nav-btn prev') | ||
if args.previous and args.previous ~= "" then | if args.previous and args.previous ~= "" then | ||
prevBtn:wikitext('[[' .. args.previous .. '|< | prevBtn:wikitext('[[' .. args.previous .. '|<span class="fib-arrow">' .. icons.leftArrow .. '</span> Previous]]') | ||
else | else | ||
prevBtn:css('opacity', '0.3'):wikitext('< | prevBtn:css('opacity', '0.3'):wikitext('<span class="fib-arrow">' .. icons.leftArrow .. '</span> Previous') | ||
end | end | ||
local nextBtn = nav:tag('div'):addClass('fib-nav-btn next') | local nextBtn = nav:tag('div'):addClass('fib-nav-btn next') | ||
if args.next and args.next ~= "" then | if args.next and args.next ~= "" then | ||
nextBtn:wikitext('[[' .. args.next .. '|Next < | nextBtn:wikitext('[[' .. args.next .. '|Next <span class="fib-arrow">' .. icons.rightArrow .. '</span>]]') | ||
else | else | ||
nextBtn:css('opacity', '0.3'):wikitext('Next < | nextBtn:css('opacity', '0.3'):wikitext('Next <span class="fib-arrow">' .. icons.rightArrow .. '</span>') | ||
end | end | ||
end | end | ||
| Line 209: | Line 215: | ||
end | end | ||
function p.listRow(frame) | function p.listRow(frame) | ||
local args = frame.args | local args = frame.args | ||
| Line 218: | Line 221: | ||
local startDate = args.start_date or "" | local startDate = args.start_date or "" | ||
local endDate = args.end_date or "" | local endDate = args.end_date or "" | ||
local row = html.create('div'):addClass('tourney-row') | local row = html.create('div'):addClass('tourney-row') | ||
row:tag('div'):addClass('tr-date'):wikitext(formatDateRange(startDate, endDate)) | row:tag('div'):addClass('tr-date'):wikitext(formatDateRange(startDate, endDate)) | ||
| Line 231: | Line 233: | ||
end | end | ||
function p.listRowMain(frame) | function p.listRowMain(frame) | ||
local args = frame.args | local args = frame.args | ||
| Line 242: | Line 241: | ||
local image = args.image or "" | local image = args.image or "" | ||
local imageDark = args.image_dark or "" | local imageDark = args.image_dark or "" | ||
local row = html.create('div'):addClass('tourney-row tr-compact') | local row = html.create('div'):addClass('tourney-row tr-compact') | ||
row:tag('div'):addClass('tr-date'):wikitext(formatDateRange(startDate, endDate)) | row:tag('div'):addClass('tr-date'):wikitext(formatDateRange(startDate, endDate)) | ||
Revision as of 14:12, 27 January 2026
Documentation for this module may be created at Module:Tournament/doc
local p = {}
local html = mw.html
local lang = mw.getContentLanguage()
-- ============================================================
-- ICON LIBRARY (SVGs) - No External Dependencies
-- ============================================================
local icons = {
instagram = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 448 512" fill="currentColor"><path d="M224.1 141c-63.6 0-114.9 51.3-114.9 114.9s51.3 114.9 114.9 114.9S339 319.5 339 255.9 287.7 141 224.1 141zm0 189.6c-41.1 0-74.7-33.5-74.7-74.7s33.5-74.7 74.7-74.7 74.7 33.5 74.7 74.7-33.6 74.7-74.7 74.7zm146.4-194.3c0 14.9-12 26.8-26.8 26.8-14.9 0-26.8-12-26.8-26.8s12-26.8 26.8-26.8 26.8 12 26.8 26.8zm76.1 27.2c-1.7-35.9-9.9-67.7-36.2-93.9-26.2-26.2-58-34.4-93.9-36.2-37-2.1-147.9-2.1-184.9 0-35.8 1.7-67.6 9.9-93.9 36.1s-34.4 58-36.2 93.9c-2.1 37-2.1 147.9 0 184.9 1.7 35.9 9.9 67.7 36.2 93.9s58 34.4 93.9 36.2c37 2.1 147.9 2.1 184.9 0 35.9-1.7 67.7-9.9 93.9-36.2 26.2-26.2 34.4-58 36.2-93.9 2.1-37 2.1-147.8 0-184.8zM398.8 388c-7.8 19.6-22.9 34.7-42.6 42.6-29.5 11.7-99.5 9-132.1 9s-102.7 2.6-132.1-9c-19.6-7.8-34.7-22.9-42.6-42.6-11.7-29.5-9-99.5-9-132.1s-2.6-102.7 9-132.1c7.8-19.6 22.9-34.7 42.6-42.6 29.5-11.7 99.5-9 132.1-9s102.7-2.6 132.1 9c19.6 7.8 34.7 22.9 42.6 42.6 11.7 29.5 9 99.5 9 132.1s2.7 102.7-9 132.1z"/></svg>',
twitter = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="currentColor"><path d="M389.2 48h70.6L305.6 224.2 487 464H345L233.7 318.6 106.5 464H35.8L200.7 275.5 26.8 48H172.4L272.9 180.9 389.2 48zM364.4 421.8h39.1L151.1 88h-42L364.4 421.8z"/></svg>',
youtube = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 576 512" fill="currentColor"><path d="M549.7 124.1c-6.3-23.7-24.8-42.3-48.3-48.6C458.8 64 288 64 288 64S117.2 64 74.6 75.5c-23.5 6.3-42 24.9-48.3 48.6-11.4 42.9-11.4 132.3-11.4 132.3s0 89.4 11.4 132.3c6.3 23.7 24.8 41.5 48.3 47.8C117.2 448 288 448 288 448s170.8 0 213.4-11.5c23.5-6.3 42-24.2 48.3-47.8 11.4-42.9 11.4-132.3 11.4-132.3s0-89.4-11.4-132.3zm-317.5 213.5V175.2l142.7 81.2-142.7 81.2z"/></svg>',
discord = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 640 512" fill="currentColor"><path d="M524.5 69.8a1.5 1.5 0 0 0 -.8-.7A485.1 485.1 0 0 0 404.1 32a1.8 1.8 0 0 0 -1.9 .9 337.5 337.5 0 0 0 -14.9 30.6 447.8 447.8 0 0 0 -134.4 0 309.5 309.5 0 0 0 -15.1-30.6 1.9 1.9 0 0 0 -1.9-.9A483.7 483.7 0 0 0 116.1 69.1a1.7 1.7 0 0 0 -.8 .7C39.1 183.7 18.2 294.7 28.4 404.4a2 2 0 0 0 .8 1.4A487.7 487.7 0 0 0 176 479.9a1.9 1.9 0 0 0 2.1-.7A348.2 348.2 0 0 0 208.1 430.4a1.9 1.9 0 0 0 -1-2.6 321.2 321.2 0 0 1 -45.9-21.9 1.9 1.9 0 0 1 -.2-3.1c3.1-2.3 6.2-4.7 9.1-7.1a1.8 1.8 0 0 1 1.9-.3c96.2 43.9 200.4 43.9 295.5 0a1.8 1.8 0 0 1 1.9 .2c2.9 2.4 6 4.9 9.1 7.2a1.9 1.9 0 0 1 -.2 3.1 301.4 301.4 0 0 1 -45.9 21.8 1.9 1.9 0 0 0 -1 2.6 391.1 391.1 0 0 0 30 48.8 1.9 1.9 0 0 0 2.1 .7A486 486 0 0 0 610.7 405.7a1.9 1.9 0 0 0 .8-1.4C623.7 277.6 590.9 167.5 524.5 69.8zM222.5 337.6c-29 0-52.8-26.6-52.8-59.2S193.1 219.1 222.5 219.1c29.7 0 53.3 26.8 52.8 59.2C275.3 311 251.9 337.6 222.5 337.6zm195.4 0c-29 0-52.8-26.6-52.8-59.2S388.4 219.1 417.9 219.1c29.7 0 53.3 26.8 52.8 59.2C470.7 311 447.5 337.6 417.9 337.6z"/></svg>',
facebook = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="currentColor"><path d="M504 256C504 119 393 8 256 8S8 119 8 256c0 125.7 87.1 231.7 203.2 250V332h-61v-76h61v-53.1c0-60.2 35.8-93.5 90.7-93.5 26.3 0 53.8 4.7 53.8 4.7v59.1h-30.3c-29.8 0-39.1 18.5-39.1 37.5v45.3h66.7l-10.7 76h-56v174C416.9 487.7 504 381.7 504 256z"/></svg>',
website = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" fill="currentColor"><path d="M352 256c0 22.2-1.2 43.6-3.3 64H163.3c-2.2-20.4-3.3-41.8-3.3-64s1.2-43.6 3.3-64h185.4c2.2 20.4 3.3 41.8 3.3 64zm28.8-64h123.1c5.3 20.5 8.1 41.9 8.1 64s-2.8 43.5-8.1 64H380.8c2.1-20.6 3.2-42 3.2-64s-1.1-43.4-3.2-64zm112.6-32H376.7c-10-63.9-29.8-117.4-55.3-151.6 78.3 20.7 142 77.5 171.9 151.6zm-149.1 0H167.7c6.1-36.4 15.5-68.6 27-94.7 10.5-23.6 22.2-40.7 33.5-51.5C239.4 3.2 248.7 0 256 0s16.6 3.2 27.8 13.8c11.3 10.8 23 27.9 33.5 51.5 11.6 26 20.9 58.2 27 94.7zm-209 0H18.6c30-74.1 93.6-130.9 172-151.6-25.5 34.2-45.2 87.7-55.3 151.6zM8.1 192h123.1c-2.1 20.6-3.2 42-3.2 64s1.1 43.4 3.2 64H8.1C2.8 299.5 0 278.1 0 256s2.8-43.5 8.1-64zm18.6 160h116.9c10.1 63.9 29.8 117.4 55.3 151.6-78.4-20.7-142-77.5-172-151.6zm149.1 0h160.4c-6.1 36.4-15.5 68.6-27 94.7-10.5 23.6-22.2 40.7-33.5 51.5-11.2 10.7-20.5 13.9-27.8 13.9s-16.6-3.2-27.8-13.8c-11.3-10.8-23-27.9-33.5-51.5-11.6-26-20.9-58.2-27-94.7zm209 0h116.9c-30 74.1-93.6 130.9-171.9 151.6 25.5-34.2 45.2-87.7 55.3-151.6z"/></svg>',
leftArrow = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512" fill="currentColor"><path d="M41.4 233.4c-12.5 12.5-12.5 32.8 0 45.3l192 192c12.5 12.5 32.8 12.5 45.3 0s12.5-32.8 0-45.3L109.3 256 278.6 86.6c12.5-12.5 12.5-32.8 0-45.3s-32.8-12.5-45.3 0l-192 192z"/></svg>',
rightArrow = '<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 320 512" fill="currentColor"><path d="M278.6 233.4c12.5 12.5 12.5 32.8 0 45.3l-192 192c-12.5 12.5-32.8 12.5-45.3 0s-12.5-32.8 0-45.3L210.7 256 41.4 86.6c-12.5-12.5-12.5-32.8 0-45.3s32.8-12.5 45.3 0l192 192z"/></svg>'
}
-- ============================================================
-- HELPER FUNCTIONS
-- ============================================================
local function formatCurrency(amount)
if not amount or amount == "" or amount == "0" then return "TBD" end
local currency = "₹"
if string.find(amount, "%$") then currency = "$" end
local n = tostring(amount):gsub(",", ""):gsub("₹", ""):gsub("%$", "")
if #n <= 3 then return currency .. " " .. n end
local last3 = n:sub(-3)
local rest = n:sub(1, -4)
local formattedRest = rest:reverse():gsub("(%d%d)", "%1,"):reverse()
if formattedRest:sub(1, 1) == "," then formattedRest = formattedRest:sub(2) end
return '<span class="pz-prize">' .. currency .. " " .. formattedRest .. "," .. last3 .. '</span>'
end
local function formatDateRange(startStr, endStr)
if not startStr or startStr == "" then return "TBA" end
if endStr and endStr ~= "" and endStr ~= startStr then
local s = lang:formatDate('d M', startStr)
local e = lang:formatDate('d M, Y', endStr)
return s .. " – " .. e
else
return lang:formatDate('d M, Y', startStr)
end
end
local function getCleanTitle(pageLink)
if not pageLink then return "" end
local title = mw.title.new(pageLink)
if title then return title.subpageText end
return pageLink
end
-- Helper: Social Icon Generator (Uses Embedded SVGs)
local function getSocials(args)
local container = html.create('div'):addClass('fib-socials plainlinks')
local hasSocials = false
local platforms = {
{arg='instagram', icon=icons.instagram},
{arg='twitter', icon=icons.twitter},
{arg='youtube', icon=icons.youtube},
{arg='discord', icon=icons.discord},
{arg='facebook', icon=icons.facebook},
{arg='website', icon=icons.website}
}
for _, p in ipairs(platforms) do
if args[p.arg] and args[p.arg] ~= "" then
hasSocials = true
-- SVG wrapper
container:wikitext('[' .. args[p.arg] .. ' <span class="fib-social-icon">' .. p.icon .. '</span>]')
end
end
if hasSocials then return tostring(container) else return "" end
end
-- Helper: Theme Aware Logo (For Lists/Homepage)
local function getTourneyLogo(imageFile, darkImageFile)
local container = html.create('div'):addClass('tr-event-logo')
if imageFile and imageFile ~= "" then
local darkFile = darkImageFile
if not darkFile or darkFile == "" then
local ext = imageFile:match("^.+(%..+)$") or ".png"
local name = imageFile:gsub("%..+$", "")
darkFile = name .. "_dark" .. ext
end
local hasDark = mw.title.new('File:' .. darkFile).exists
container:tag('span'):addClass('logo-lightmode'):wikitext('[[File:' .. imageFile .. '|40px|link=]]')
local dSpan = container:tag('span'):addClass('logo-darkmode')
if hasDark then dSpan:wikitext('[[File:' .. darkFile .. '|40px|link=]]') else dSpan:wikitext('[[File:' .. imageFile .. '|40px|link=]]') end
else
container:wikitext('<i class="fa-solid fa-trophy" style="color:var(--text-muted); opacity:0.3;"></i>')
end
return tostring(container)
end
-- Helper: Theme Aware Logo (For Infobox)
local function getInfoboxLogo(pageName, image, imageDark)
local lightFile = (image ~= "" and image) or (pageName .. '.png')
local darkFile = imageDark
if not darkFile or darkFile == "" then
local ext = lightFile:match("^.+(%..+)$") or ".png"
local name = lightFile:gsub("%..+$", "")
darkFile = name .. "_dark" .. ext
end
local hasLight = mw.title.new('File:' .. lightFile).exists
local hasDark = mw.title.new('File:' .. darkFile).exists
local container = html.create('div'):addClass('fib-image')
local lSpan = container:tag('span'):addClass('logo-lightmode')
if hasLight then lSpan:wikitext('[[File:' .. lightFile .. '|250px]]') else lSpan:wikitext('[[File:Shield_team.png|150px]]') end
local dSpan = container:tag('span'):addClass('logo-darkmode')
if hasDark then dSpan:wikitext('[[File:' .. darkFile .. '|250px]]') elseif hasLight then dSpan:wikitext('[[File:' .. lightFile .. '|250px]]') else dSpan:wikitext('[[File:Shield_team_dark.png|150px]]') end
return tostring(container)
end
-- ============================================================
-- MAIN 1: TOURNAMENT INFOBOX
-- ============================================================
function p.infobox(frame)
local args = frame:getParent().args
local page = args.name or mw.title.getCurrentTitle().text
local cleanName = mw.title.getCurrentTitle().subpageText
local prizeMoney = args.prize_pool or args.prizepool
if mw.ext.cargo and mw.ext.cargo.store then
mw.ext.cargo.store('Tournaments', {
_pageName = mw.title.getCurrentTitle().prefixedText,
name = args.name or cleanName,
series = args.series,
organizer = args.organizer,
sponsor = args.sponsor,
game = args.game or "BGMI",
mode = args.mode,
type = args.type,
tier = args.tier,
device = args.device,
location = args.location,
venue = args.venue,
prize_pool = prizeMoney,
start_date = args.start_date,
end_date = args.end_date,
winner = args.winner,
previous = args.previous,
next = args.next,
image = args.image,
image_dark = args.image_dark,
instagram = args.instagram,
twitter = args.twitter,
youtube = args.youtube,
discord = args.discord,
facebook = args.facebook,
website = args.website
})
end
local root = html.create('div'):addClass('flat-infobox')
local header = root:tag('div'):addClass('fib-header')
header:tag('div'):addClass('fib-title'):wikitext(args.name or cleanName)
root:wikitext(getInfoboxLogo(page, args.image, args.image_dark))
local grid1 = root:tag('div'):addClass('fib-grid')
grid1:tag('div'):addClass('fib-cell'):tag('div'):addClass('fib-label-sm'):wikitext('Event Tier'):done():tag('div'):addClass('fib-value-sm'):wikitext(args.tier or 'Unranked'):done()
grid1:tag('div'):addClass('fib-cell'):tag('div'):addClass('fib-label-sm'):wikitext('Type'):done():tag('div'):addClass('fib-value-sm'):wikitext(args.type or 'Online'):done()
local grid2 = root:tag('div'):addClass('fib-grid')
grid2:tag('div'):addClass('fib-cell'):tag('div'):addClass('fib-label-sm'):wikitext('Mode'):done():tag('div'):addClass('fib-value-sm'):wikitext(args.mode or 'TBD'):done()
grid2:tag('div'):addClass('fib-cell'):tag('div'):addClass('fib-label-sm'):wikitext('Location'):done():tag('div'):addClass('fib-value-sm'):wikitext(args.location or 'India'):done()
if prizeMoney then
root:tag('div'):addClass('fib-prize')
:tag('div'):addClass('fib-label-sm'):wikitext('Total Prize Pool'):done()
:tag('div'):addClass('fib-prize-val'):wikitext(formatCurrency(prizeMoney)):done()
end
local list = root:tag('div'):addClass('fib-list')
local function addRow(label, value)
if value and value ~= "" then
list:tag('div'):addClass('fib-row'):tag('div'):addClass('fib-label'):wikitext(label):done():tag('div'):addClass('fib-data'):wikitext(value):done()
end
end
addRow('Series', args.series and '[[' .. args.series .. ']]')
addRow('Organizer', args.organizer)
addRow('Sponsors', args.sponsor)
addRow('Venue', args.venue)
addRow('Dates', formatDateRange(args.start_date, args.end_date))
addRow('Device', args.device)
if args.winner then addRow('Winner', "'''[[" .. args.winner .. "]]'''") end
root:wikitext(getSocials(args))
-- FIXED: Using embedded SVG Icons for arrows
if args.previous or args.next then
local nav = root:tag('div'):addClass('fib-nav')
local prevBtn = nav:tag('div'):addClass('fib-nav-btn prev')
if args.previous and args.previous ~= "" then
prevBtn:wikitext('[[' .. args.previous .. '|<span class="fib-arrow">' .. icons.leftArrow .. '</span> Previous]]')
else
prevBtn:css('opacity', '0.3'):wikitext('<span class="fib-arrow">' .. icons.leftArrow .. '</span> Previous')
end
local nextBtn = nav:tag('div'):addClass('fib-nav-btn next')
if args.next and args.next ~= "" then
nextBtn:wikitext('[[' .. args.next .. '|Next <span class="fib-arrow">' .. icons.rightArrow .. '</span>]]')
else
nextBtn:css('opacity', '0.3'):wikitext('Next <span class="fib-arrow">' .. icons.rightArrow .. '</span>')
end
end
return tostring(root)
end
function p.listRow(frame)
local args = frame.args
local page = args.Page or ""
local name = getCleanTitle(page)
local startDate = args.start_date or ""
local endDate = args.end_date or ""
local row = html.create('div'):addClass('tourney-row')
row:tag('div'):addClass('tr-date'):wikitext(formatDateRange(startDate, endDate))
local info = row:tag('div'):addClass('tr-info')
info:tag('div'):addClass('tr-name'):wikitext('[[' .. page .. '|' .. name .. ']]')
if args.organizer then info:tag('div'):addClass('tr-org'):wikitext(args.organizer) end
local winDiv = row:tag('div'):addClass('tr-winner mobile-hide')
if args.winner and args.winner ~= "" then winDiv:wikitext("🏆 " .. args.winner) else winDiv:tag('span'):addClass('dim-text'):wikitext('-') end
local prizeDiv = row:tag('div'):addClass('tr-prize')
prizeDiv:wikitext(formatCurrency(args.prize_pool))
return tostring(row)
end
function p.listRowMain(frame)
local args = frame.args
local page = args.Page or ""
local name = getCleanTitle(page)
local startDate = args.start_date or ""
local endDate = args.end_date or ""
local image = args.image or ""
local imageDark = args.image_dark or ""
local row = html.create('div'):addClass('tourney-row tr-compact')
row:tag('div'):addClass('tr-date'):wikitext(formatDateRange(startDate, endDate))
row:tag('div'):addClass('tr-event-logo-col'):wikitext(getTourneyLogo(image, imageDark))
local info = row:tag('div'):addClass('tr-info')
info:tag('div'):addClass('tr-name'):wikitext('[[' .. page .. '|' .. name .. ']]')
if args.organizer then info:tag('div'):addClass('tr-org'):wikitext(args.organizer) end
local prizeDiv = row:tag('div'):addClass('tr-prize')
prizeDiv:wikitext(formatCurrency(args.prize_pool))
return tostring(row)
end
return p