local p = {} local convert = require('মডিউল:সংখ্যা রূপান্তরকারী').convert   Background colours for table cells ---------- local colours = {     H = "#CCCCFF", -- Home team wins     A = "#FFCCCC", -- Away team wins     N = "#FFDEAD", -- Match abandoned     D = "#F0E68C", -- Match drawn     T = "#DDFFDD"  -- Match tied }  local noMatchColour = "#C0C0C0"     -- No match defined local notPlayedColour = "inherit"   -- Not played yet local errorColour = "#FF7777"       -- Error  function trim(s)     if not s then         return nil     else         return (mw.ustring.gsub(s, "^%s*(.-)%s*$", "%1"))     end end  function getArgs(frame)     local parent = frame:getParent();     local args = {}     for k,v in pairs(parent.args) do         args[k] = trim(v)     end     for k,v in pairs(frame.args) do         args[k] = trim(v)     end     return args; end  -- --   Match class -- local cricmatch = {}  cricmatch.__index = function(t, key)     local ret = rawget(t, key)     if ret then         return ret     end     ret = cricmatch[key]     if type(ret) == 'function' then         return function(...)             return ret(t, ...)         end     else         return ret     end end  cricmatch.addResultLink = function(m, cell, text)     cell:tag('span')         :attr('title', convert('bn', string.format('ম্যাচ %d', m.id)))         :wikitext(string.format('%s', m.id, convert('bn', text))) end  cricmatch.getMarginResult = function(m, row, matchNo)     local team = m.result == 'H' and m.home or m.away     local marginText     if m.margin == 'F' then         marginText = "বাজেয়াপ্ত"     elseif m.margin == 'SO' then         marginText = "সুপারওভার"     else         local n = tonumber(string.sub(m.margin, 1, -2))         local t = string.upper(string.sub(m.margin, -1, -1))         if t == 'R' then             marginText = "%d রান"         elseif t == 'W' then             marginText = "%d উইকেট"         elseif t == 'I' then             marginText = "ইনিংস ও %d রান"         end         if marginText and n then             marginText = string.format(marginText, n)             if n > 1 then marginText = marginText .. "" end         else             marginText = matchNo         end         if m.dl then             marginText = marginText                 .. ' (' .. m.dl .. ')'         end     end     local cell = addTableCell(row, colours[m.result])         :tag('span'):wikitext(team.shortName):done()         :tag('br'):done()     m.addResultLink(cell, marginText)     return cell:css('padding', '3px 5px') end  cricmatch.getResult = function(m, row)     local colour, text     local matchNo = string.format('ম্যাচ %s', m.id, convert('bn', tostring(m.id)))     if m.result == 'D' then         -- Drawn match         colour = colours.D         text = 'খেলা ড্র হয়'     elseif m.result == 'N' then         -- Abandoned match         colour = colours.N         text = 'খেলাপরিত্যক্ত'     elseif m.result == 'T' then         -- Tied match         colour = colours.T         text = 'খেলা টাইহয়'     elseif m.result == 'H' or m.result == 'A' then         return m.getMarginResult(row, matchNo)     end     local cell     if text and colour then         cell = addTableCell(row, colour)         m.addResultLink(cell, text)     else         cell = addTableCell(row, notPlayedColour, matchNo)     end     return cell:css('padding', '3px 5px') end  function createMatch(id, home, away, result, margin, dl)     if not home or not away then         return nil     end     local match = {}     setmetatable(match, cricmatch)     match.id = id     match.home = home     match.away = away     match.result = result     match.margin = margin     match.dl = dl     return match end  -- --   Html Builder helpers -- function addTableRow(tbl)     return tbl:tag('tr') end function addTableCell(row, bg, text)     return row:tag('td'):css('background-color', bg):wikitext(text) end function addNoMatch(row)     addTableCell(row, noMatchColour)     return row end  -- --   Helper functions -- function buildLegend(container, types, homeaway)     local key = container:tag('table')         :addClass('wikitable')         :css('float', 'right')         :css('text-align', 'center')         :css('font-size', '90%')         :css('margin', '0 0 0 10px')      local keys = { 'H', 'A' }     local text = {         H = (homeaway and 'স্থানীয় দল জয়ী' or 'অনুভূমিক দল জয়ী'),         A = (homeaway and 'অতিথি দল জয়ী' or 'উল্লম্ব দল জয়ী'),         D = 'খেলা ড্র',         N = 'খেলা পরিত্যক্ত',         T = 'খেলা টাই'     }     local count = 0     for _, _ in pairs(types) do count = count + 1 end     local row = addTableRow(key)     for _, k in ipairs(keys) do         if types[k] then addTableCell(row, colours[k], text[k]) end     end      local list = container:tag('ul')         :css('font-size', '90%')         :tag('li')             :wikitext(homeaway and "দ্রষ্টব্য: ম্যাচের ফলাফল " ..                 "স্থানীয় দল (অনুভূমিকভাবে) এবং অতিথি দল (উলম্বভাবে) অনুযায়ী সাজানো হয়েছে।" or                 "দ্রষ্টব্য: ম্যাচের ফলাফল " ..                 "প্রথম মুখোমুখি (উপরে-ডানে) এবং দ্বিতীয় মুখোমুখি (নিচে-বামে) অনুযায়ী সাজানো হয়েছে।")             :done()         :tag('li')             :wikitext("দ্রষ্টব্য: ম্যাচের পূর্ণাঙ্গ ফলাফল জানতে " ..                 "সংক্ষিপ্ত ফলাফলে ক্লিক করুন।")         :done()     return container end  function getMatchData(args, teams)     local i, m = 0, 1     local match     local matches = {}     local dlText = args.dls == 'Y' and 'ডি/এল' or 'ডিএলএস'     local home, away, result, margin, dl     while args[i * 5 + 5] do         home = teams[trim(args[i * 5 + 1])]         away = teams[args[i * 5 + 2]]         result = args[i * 5 + 3]         margin = args[i * 5 + 4]         dl = args[i * 5 + 5] == "Y"         match = createMatch(m, home, away, result, margin, dl and dlText or nil)         if match then             table.insert(matches, match)             m = m + 1         end         i = i + 1     end     return matches end  p.create = function(args, teams, tableStyle)     local matches = getMatchData(args, teams)      -- organise by team     local codes, results, types = {}, {}, {}     for i, match in ipairs(matches) do         local home = match.home.code         local away = match.away.code         if not results[home] then             table.insert(codes, home)             results[home] = {}         end         if not results[away] then             table.insert(codes, away)             results[away] = {}         end         results[home][away] = match         types[match.result] = true     end     local teamsort = function(t1, t2)         return teams[t1].fullName < teams[t2].fullName     end     table.sort(codes, teamsort)      local wrapper = mw.html.create('div')      -- Construct the header     local container = wrapper:tag('div')         :css('float', 'left')         :css('max-width', '100%')     local tbl = container:tag('table')         :attr('class', 'wikitable module-CricketLeagueGroupStageSummary')         :css('width', '100%')         :css('display', 'block')         :css('overflow', 'auto')         :css('border', 'none')     if tableStyle then         tbl:cssText(tableStyle)     else         tbl:css('text-align', 'center')             :css('white-space', 'nowrap')             :css('width', '100%')         if #codes > 8 then             tbl:css('font-size', (100 - (#codes - 8) * 10) .. '%')         end     end     local homeaway = not (args['homeaway'] and (args['homeaway'] == 'no' or args['homeaway'] == 'n'))     local header = addTableRow(tbl)         :tag('th')             :attr('scope', 'row')             :wikitext(homeaway and 'অতিথি দল →' or 'উল্লম্ব দল →')         :done()     for i, code in ipairs(codes) do         local team = teams[code]         header:tag('th')             :attr('rowspan', homeaway and '2' or '2')             :attr('scope', 'col')             :css('padding', 'inherit 10px')             :wikitext(string.format('%s', team.pageName, team.shortName))             :newline()     end     if homeaway then         tbl:tag('tr'):tag('th'):attr('scope', 'col'):wikitext('স্থানীয় দল ↓')     else         tbl:tag('tr'):tag('th'):attr('scope', 'col'):wikitext('অনুভূমিক দল ↓')     end      -- Output the main body of the table     for i, homecode in ipairs(codes) do         local home = teams[homecode]         local row = addTableRow(tbl)         local teamcell = row:tag('th')             :attr('scope', 'row')             :css('text-align', 'left')             :css('padding', '3px 5px')             :css('white-space', 'normal')             :wikitext(string.format('%s', home.pageName, home.fullName))         for j, awaycode in ipairs(codes) do             local match = results[homecode][awaycode]             if match then match.getResult(row) else addNoMatch(row) end         end     end      -- Legend and notes     buildLegend(container, types, homeaway)     wrapper:tag('div'):css('clear', 'both')     return tostring(wrapper) end  p.ICC= function(frame)     local args = getArgs(frame)     local teams = mw.loadData("মডিউল:আইসিসি দল")     local teamsAssoc = {}     local i = 1     while teams[i] do         teamsAssoc[teams[i].code] = teams[i]         i = i + 1     end     return p.create(args, teamsAssoc) end  p.IPL = function(frame)     local args = getArgs(frame)     local teams = mw.loadData("Module:Indian Premier League teams")     local teamsAssoc = {}     local i = 1     while teams[i] do         teamsAssoc[teams[i].code] = teams[i]         i = i + 1     end     return p.create(args, teamsAssoc) end  p.WPL = function(frame)     local args = getArgs(frame)     local teams = mw.loadData("Module:Women's Premier League teams")     local teamsAssoc = {}     local i = 1     while teams[i] do         teamsAssoc[teams[i].code] = teams[i]         i = i + 1     end     return p.create(args, teamsAssoc) end  p.BBL = function(frame)     local args = getArgs(frame)     local teams = {         ADS = {             code       = "ADS",             fullName   = "Adelaide Strikers",             shortName  = "Strikers",             pageName   = "Adelaide Strikers"         },         BRH = {             code       = "BRH",             fullName   = "Brisbane Heat",             shortName  = "Heat",             pageName   = "Brisbane Heat"         },         HBH = {             code       = "HBH",             fullName   = "Hobart Hurricanes",             shortName  = "Hurricanes",             pageName   = "Hobart Hurricanes"         },         MLR = {             code       = "MLR",             fullName   = "Melbourne Renegades",             shortName  = "Renegades",             pageName   = "Melbourne Renegades"         },         MLS = {             code       = "MLS",             fullName   = "Melbourne Stars",             shortName  = "Stars",             pageName   = "Melbourne Stars"         },         PRS = {             code       = "PRS",             fullName   = "Perth Scorchers",             shortName  = "Scorchers",             pageName   = "Perth Scorchers"         },         SYS = {             code       = "SYS",             fullName   = "Sydney Sixers",             shortName  = "Sixers",             pageName   = "Sydney Sixers"         },         SYT = {             code       = "SYT",             fullName   = "Sydney Thunder",             shortName  = "Thunder",             pageName   = "Sydney Thunder"         }     }     return p.create(args, teams) end p.WBBL = function(frame)     local args = getArgs(frame)     local teams = {         ADS = {             code       = "ADS",             fullName   = "Adelaide Strikers",             shortName  = "Strikers",             pageName   = "Adelaide Strikers (WBBL)"         },         BRH = {             code       = "BRH",             fullName   = "Brisbane Heat",             shortName  = "Heat",             pageName   = "Brisbane Heat (WBBL)"         },         HBH = {             code       = "HBH",             fullName   = "Hobart Hurricanes",             shortName  = "Hurricanes",             pageName   = "Hobart Hurricanes (WBBL)"         },         MLR = {             code       = "MLR",             fullName   = "Melbourne Renegades",             shortName  = "Renegades",             pageName   = "Melbourne Renegades (WBBL)"         },         MLS = {             code       = "MLS",             fullName   = "Melbourne Stars",             shortName  = "Stars",             pageName   = "Melbourne Stars (WBBL)"         },         PRS = {             code       = "PRS",             fullName   = "Perth Scorchers",             shortName  = "Scorchers",             pageName   = "Perth Scorchers (WBBL)"         },         SYS = {             code       = "SYS",             fullName   = "Sydney Sixers",             shortName  = "Sixers",             pageName   = "Sydney Sixers (WBBL)"         },         SYT = {             code       = "SYT",             fullName   = "Sydney Thunder",             shortName  = "Thunder",             pageName   = "Sydney Thunder (WBBL)"         }     }     return p.create(args, teams) end p.PSL = function(frame)     local args = getArgs(frame)     local teams = mw.loadData("Module:PakistanSuperLeagueTeams")     local teamsAssoc = {}     local i = 1     while teams[i] do         teamsAssoc[teams[i].code] = teams[i]         i = i + 1     end     return p.create(args, teamsAssoc) end  p.Aus = function(frame)     local args = getArgs(frame)     local teams = {         NSW = {             code       = "NSW",             fullName   = "New South Wales",             shortName  = "NSW",             pageName   = "New South Wales cricket team"         },         QLD = {             code       = "QLD",             fullName   = "Queensland",             shortName  = "Queensland",             pageName   = "Queensland cricket team"         },         SA = {             code       = "SA",             fullName   = "South Australia",             shortName  = "SA",             pageName   = "South Australia cricket team"         },         TAS = {             code       = "TAS",             fullName   = "Tasmania",             shortName  = "Tasmania",             pageName   = "Tasmania cricket team"         },         VIC = {             code       = "VIC",             fullName   = "Victoria",             shortName  = "Victoria",             pageName   = "Victoria cricket team"         },         WA = {             code       = "WA",             fullName   = "Western Australia",             shortName  = "WA",             pageName   = "Western Australia cricket team"         }     }     return p.create(args, teams) end return p