--[[     Module for generating league progresion tables intended for use in ICC World Cups and Championships articles. ]]  local _module = {} local convert = require('মডিউল:সংখ্যা রূপান্তরকারী').convert  _module.create = function(frame)          ------------- Functions -------------     local strFind = string.find     local strMatch = string.match     local strSplit = mw.text.split     local strFormat = string.format     local strTrim = mw.text.trim     local strSub = string.sub     local strRepeat = string.rep     local strUpper = string.upper          ------------- Arguments -------------     local args = frame.args     local matchesPerTeam = tonumber(args.matchesPerTeam) or error("Invalid or missing parameter 'matchesPerTeam'")     local teams = strSplit(args.teams or error("Invalid or missing parameter 'teams'"), ',', true)     local matchReportArticle = args.matchReportArticle or ''     local caption = args.caption      -- The colours for each result     local colours_win           = "#99FF99"   -- Win     local colours_loss          = "#FFDDDD"   -- Loss     --local colours_tie           = ""     local colours_noResult      = "#DFDFFF"   -- No result     local colours_eliminated    = "#DCDCDC"   -- Eliminated     local colours_notPossible   = "#DCDCDC"   -- Not technically possible (only used for some playoff matches with knockoutType=2)          -- The CSS classes applied to the cells of each result     local classes_win       = "yes table-yes2"     local classes_loss      = "no table-no2"     local classes_noResult  = "noresult"     --local classes_tie       = ""          -- The output buffer     local output = {}     local outputIndex = 1     function print(s)         output[outputIndex] = s         outputIndex = outputIndex + 1     end          -- Construct the header     print(strFormat([[  দল গ্রুপ ম্যাচ]],     caption and '\n|+' .. caption or , matchesPerTeam))          for i = 1, matchesPerTeam do         -- Generate the headers for each group match         print(strFormat('! scope="col" style="width: 30px;%s" | %s\n', i == 1 and " border-left: 4px solid #454545" or "", convert('bn', tostring(i))))     end              local argCounter = 1          -- Generate the table     for i = 1, #teams do              local team = strTrim(teams[i])         print('\n|-\n! scope="row" style="text-align: left; padding-right: 10px" | ' .. team .. '\n')   -- Add the team name         local gs, ks = args[argCounter] or , args[argCounter + 1] or ''         local j, comma, runningScore, lastMatch = 0, 0, 0, 0         argCounter = argCounter + 2                  repeat             j = j + 1             if j > matchesPerTeam then                 error(strFormat("Too many group stage matches. Expected %d (team: %s)", matchesPerTeam, team))             end                          local startPos = comma + 1             comma = strFind(gs, ',', startPos, true) or 0                          print(j == 1 and '| style="border-left: 4px solid #454545; ' or '|| style="')                          local rpos = strFind(gs, '%S', startPos)             if rpos and (rpos < comma or comma == 0) then                 local result, match = strUpper(strSub(gs, rpos, rpos)), tonumber(strMatch(strSub(gs, rpos + 1, comma - 1), '^(.-)%s*$'))                  -- Check that the match number is a valid non-negative integer greater than the preceding match number.                 if not match or match <= 0 or match % 1 ~= 0 then                     error(strFormat("Match number does not exist or is not a valid integer greater than 0 for group stage result #%d (team: %s)", j, team))                 elseif match <= lastMatch then                     error(strFormat("Invalid match number: %d for group stage result #%d, must be greater than the preceding match number (%d) (team: %s)", match, j, lastMatch, team))                 end                 lastMatch = match                                  if result == 'W' then    -- Win                     runningScore = runningScore + 2                     print(strFormat('background-color: %s" class="%s" | %s ', colours_win, classes_win, matchReportArticle, match, convert('bn', tostring(runningScore))))                 elseif result == 'L' then     -- Loss                     print(strFormat('background-color: %s" class="%s" | %s ', colours_loss, classes_loss, matchReportArticle, match, convert('bn', tostring(runningScore))))                 elseif result == 'N' then     -- No result                     runningScore = runningScore + 1                     print(strFormat('background-color: %s" class="%s" | %s ', colours_noResult, classes_noResult, matchReportArticle, match, convert('bn', tostring(runningScore))))                 --elseif result == 'T' then     -- Tie                 --    runningScore = runningScore + 1                 --    print(strFormat('background-color: %s" class="%s" | %s ', colours_tie, classes_tie, matchReportArticle, match, convert('bn', tostring(runningScore))))                 else                     error(strFormat("Invalid group stage result #%d: '%s', expecting 'W', 'L', 'N', or 'T' as first character (team: %s)", j, result, team))                 end             else                 -- Result not given                 print('" | ')             end         until comma == 0         if j ~= matchesPerTeam then    -- Output empty cells for the remaining matches             print(strRepeat('|| ', matchesPerTeam - j))         end                  j, comma = 0, 0              end          -- Footer     print(strFormat([[  জয় হার ফলাফল হয়নি  টীকা: প্রতিটি গ্রুপ ম্যাচ শেষ হওয়ার পর মোট পয়েন্ট তালিকাভুক্ত করা হয়েছে। টীকা: গ্রুপ ম্যাচের সারাংশ দেখতে পয়েন্টের উপর আর প্লে অফ ম্যাচের সারাংশ দেখতে জ/হা-এর উপর ক্লিক করুন।]],     classes_win, colours_win, classes_loss, colours_loss, classes_noResult, colours_noResult))          return table.concat(output)      end  return _module