Module:Sports table/CricketRR
-- Style for cricket tables
 local pp = { }
 
 
 local function args_points(Args)
     local pts = {}
 
     -- Do not change these defaults without first checking which tables use them
     pts.win = tonumber(Args['winpoints']) or 2
     pts.tie = tonumber(Args['tiepoints']) or 1
     pts.nr = tonumber(Args['nrpoints']) or 1
     pts.loss = tonumber(Args['losspoints']) or 0
     pts.bonus = tonumber(Args['bonuspoints']) or 1
 
     return pts
 end
 
 local function abbr_header(txt, abbr, show_header_pts, pts)
     if show_header_pts then
         txt = txt .. ' – ' .. pts .. (pts == 1 and ' point' or ' points')
     end
 
     return '&lt;abbr title=&quot;' .. txt .. '&quot;&gt;' .. abbr .. '&lt;/abbr&gt;'
 end
 
 function pp.header(t, Args, p_sub, pos_label, group_col, VTE_text, full_table, results_header_txt)
 	-- Load relevant modules
     local yesno = require('Module:Yesno')
 	
 	-- Create table header
 	-- Pre stuff
 
     local team_width = Args['teamwidth'] or '180'
     local sort_text = yesno(Args['sortable_table'] or 'no') and ' sortable' or ''
 
 	table.insert(t,'{|class=&quot;wikitable'..sort_text..'&quot; style=&quot;text-align:center;&quot;\n')            			-- Open table
 
 	-- Table title
 	if Args['title'] then
         table.insert(t,'|+ ' .. Args['title'] .. '\n')
 	end
 
     --Header specific options
     local show_pts = yesno(Args['show_header_pts'] or 'no')
     local pts = args_points(Args)
 
 	local group_head_text = Args['group_header'] or '&lt;abbr title=&quot;Group&quot;&gt;Grp&lt;/abbr&gt;'
 	local team_head_text = Args['team_header'] or 'அணி'
     local tie_head_text = Args['tie_header'] or abbr_header('சமம்', 'ச', show_pts, pts.tie)
     local nr_head_text  = Args['nr_header']  or abbr_header('முடிவில்லை', 'மு.இ', show_pts, pts.nr)
     local bonus_head_text = Args['bonus_header'] or '&lt;abbr title=&quot;மேலதிக புள்ளிகள்&quot;&gt;மே.பு&lt;/abbr&gt;'
     local deduct_head_text = Args['deduct_header'] or '&lt;abbr title=&quot;கழிக்கப்பட்ட புள்ளிகள்&quot;&gt;கழி.&lt;/abbr&gt;'
     local nrr_head_text = Args['nrr_header'] or '&lt;abbr title=&quot;நிகர ஓட்ட விகிதம்&quot;&gt;[[நிகர ஓட்ட விகிதம்|நிஓவி]]&lt;/abbr&gt;'
     -- 
     local loss_first = yesno(Args['loss_before_tie']  or 'yes')
     local show_tie = yesno(Args['show_tie'] or 'yes')
     local show_nr = yesno(Args['show_nr'] or 'yes')
     local show_deduct = yesno(Args['show_deductions'] or 'no')
     local show_bonus_points = yesno(Args['show_bonus_points'] or 'no')
     local show_nrr = yesno(Args['show_nrr'] or 'yes')
     local show_nrr_fa = yesno(Args['show_nrr_fa'] or 'no') and show_nrr
 
     -- Initialize
     local tt = {}
 	tt.count = 0 		-- Up by one after every call
 
     tt.tab_text = t		-- Actual text
 
 	-- Actual headers
     if pos_label ~= nil then
         tt = p_sub.colhead(tt,28,pos_label)								-- Position col
     end
 
 	-- Add group header
 	if full_table and group_col then
 		tt = p_sub.colhead(tt,28,group_head_text)			-- Group col
 	end
 
     tt = p_sub.colhead(tt, team_width, team_head_text..VTE_text)        -- Team col
 
     tt = p_sub.colhead(tt,28,'&lt;abbr title=&quot;விளையாடிய ஆட்டங்கள்&quot;&gt;வி&lt;/abbr&gt;')			-- Matches played col
 	
 	if full_table then
 
         tt = p_sub.colhead(tt,28,abbr_header('வெற்றி','வெ',show_pts,pts.win)) -- Win col
         local loss_head_text = abbr_header('தோல்வி', 'தோ', show_pts, pts.loss)
 		
         if loss_first then
             tt = p_sub.colhead(tt,28,loss_head_text)					-- Loss col
 
 			if show_tie then
                 tt = p_sub.colhead(tt,28,tie_head_text)					-- Tie col
             end
 		else
 			if show_tie then
                 tt = p_sub.colhead(tt,28,tie_head_text)					-- Tie col
             end
 
             tt = p_sub.colhead(tt, 28, loss_head_text)					-- Loss col
         end
         if show_nr then
             tt = p_sub.colhead(tt,28,nr_head_text)	                    -- No result col
         end
         if show_bonus_points then
             tt = p_sub.colhead(tt,28,bonus_head_text)	                -- Bonus points col
         end
         if show_deduct then
             tt = p_sub.colhead(tt,28,deduct_head_text)	                -- Deduction col
         end
     end
 
     tt = p_sub.colhead(tt, 28, '&lt;abbr title=&quot;புள்ளிகள்&quot;&gt;புள்ளி&lt;/abbr&gt;')       -- Points col
 	
 	if full_table then
         if show_nrr then
             tt = p_sub.colhead(tt,28,nrr_head_text)	                    -- NRR col
         end
         if show_nrr_fa then
             tt = p_sub.colhead(tt, 60, 'For')
             tt = p_sub.colhead(tt, 60, 'Against')
         end
         tt.count = tt.count+1
 		table.insert(tt.tab_text, results_header_txt)
     end
  
 	return tt
 end
 
 
 local function rr_to_dec(runs, overs, balls_per_over)
     if overs == 0 then
         return 0
     end
     local balls = overs % 1
     return runs / (overs - balls + balls * 10 / balls_per_over)
 end
 
 
 function pp.row(frame, t, Args, p_sub, notes_exist, hth_id_list, full_table, rand_val, team_list, team_code_ii, ii_start, ii_end, ii_fw, bg_col, N_teams, ii, ii_show)
 	-- Build the inner parts of individual rows
 	
 	-- Sub-module usage
     local mm = require('Module:Math')
     local yesno = require('Module:Yesno')
 
     -- table options, to match those in the header        
     local loss_first = yesno(Args['loss_before_tie']  or 'yes')
     local show_tie = yesno(Args['show_tie'] or 'yes')
     local show_nr = yesno(Args['show_nr'] or 'yes')
     local show_bonus_points = yesno(Args['show_bonus_points'] or 'no')
     local show_deduct = yesno(Args['show_deductions'] or 'no')
     local show_nrr = yesno(Args['show_nrr'] or 'yes')
     local show_nrr_fa = yesno(Args['show_nrr_fa'] or 'no') and show_nrr
 
     -- Get some input
     local wins = tonumber(Args['win_'..team_code_ii])       or 0
 	local ties = tonumber(Args['tie_'..team_code_ii])       or 0
  	local losses = tonumber(Args['loss_'..team_code_ii])    or 0
 	local noresults = tonumber(Args['nr_'..team_code_ii])   or 0
     local bonuses = tonumber(Args['bonus_'..team_code_ii])  or 0
     local deductions = tonumber(Args['ded_'..team_code_ii]) or 0
     local nrr = tonumber(Args['nrr_'..team_code_ii]) or nil
 
     local oversbowled = tonumber(Args['ob_'..team_code_ii])   or 0
  	local runsconceded = tonumber(Args['rc_'..team_code_ii])  or 0
 	local oversreceived = tonumber(Args['or_'..team_code_ii]) or 0
 	local runsscored = tonumber(Args['rs_'..team_code_ii])    or 0
     local balls_per_over = tonumber(Args['balls_per_over']) or 6
 
 	local hth_local = Args['hth_'..team_code_ii]             or nil
 	
 	-- Then calculate some values
     local matches = wins + losses + ties + noresults
 
     local pts = args_points(Args)
     local s_bps = pts.bonus*bonuses
     local points = pts.win*wins + pts.loss*losses + pts.tie*ties + pts.nr*noresults + s_bps - deductions
     
     -- Some local vars
     local hth_string
     local tt_return = p_sub.hth(frame, Args, full_table, hth_id_list, hth_local, notes_exist, team_list, team_code_ii, ii_start, ii_end, rand_val)
     hth_string = tt_return.str
 
     hth_id_list = tt_return.list
     notes_exist = tt_return.notes_exist
 
             -- What to rank the teams by
     local ranking_style = Args['ranking_style'] or 'pts'
 	local win_fw, win_string, pts_fw, pts_string
 
     ranking_style = string.lower(ranking_style)
 	if ranking_style=='p' or ranking_style=='pts' or ranking_style=='points' then
 		-- Based on points
         win_fw = ii_fw
 
         win_string = ''
 		pts_fw = 'font-weight: bold;'
 		pts_string = hth_string
 	else
 		-- Based on wins
         win_fw = 'font-weight: bold;'
 
         win_string = hth_string
         pts_fw = ii_fw
 
         pts_string = ''
 	end
 	
     local nrr_for = rr_to_dec(runsscored, oversreceived, balls_per_over)
     local nrr_against = rr_to_dec(runsconceded, oversbowled, balls_per_over)
 
     -- Set Net Run Rate. This is probabaly over-engineered and could just be done with a single precalculated value
     if nrr ~= nil then
         nrr = mm._precision_format(nrr, 3)
     elseif (oversbowled == 0) or (oversreceived == 0) then -- if 0 or null then have mdash rather than 0?
        nrr = '&amp;mdash;'
     else
         nrr = mm._precision_format(nrr_for - nrr_against, 3)
     end
 
 	-- Row building
     table.insert(t,'| style=&quot;'..ii_fw..bg_col..'&quot; |'..matches..'\n') 		-- Played
 
 	if full_table then
 		-- Use actual values if wins, ties, and losses are not numeric. Copied this from other module.
 		if (wins == 0 and ties == 0 and losses == 0) then
             local function numorval(s)
 				return s and((s == '' and 0) or tonumber(s) or s) or 0
 			end
             wins = numorval(Args['win_'..team_code_ii])
             ties = numorval(Args['tie_'..team_code_ii])
             losses = numorval(Args['loss_'..team_code_ii])
         end
         table.insert(t,'| style=&quot;'..win_fw..bg_col..'&quot; |'..wins..win_string..'\n')  -- Won
         if loss_first then
             table.insert(t,'| style=&quot;'..ii_fw..bg_col..'&quot; |'..losses..'\n')             -- Lost
             if show_tie then
                 table.insert(t,'| style=&quot;'..ii_fw..bg_col..'&quot; |'..ties..'\n') 	        -- Ties
             end
         else
             if show_tie then
                 table.insert(t,'| style=&quot;'..ii_fw..bg_col..'&quot; |'..ties..'\n') 	        -- Ties
             end
             table.insert(t,'| style=&quot;'..ii_fw..bg_col..'&quot; |'..losses..'\n')             -- Lost
         end
         if show_nr then
             table.insert(t,'| style=&quot;'..ii_fw..bg_col..'&quot; |'..noresults..'\n')         -- No Results
         end
 	    if show_bonus_points then
 		    if s_bps&lt; 0 then
                 table.insert(t,'| style=&quot;'..bg_col..'&quot; | &amp;minus;'..-s_bps..'\n')
 		    else
 			    table.insert(t,'| style=&quot;'..bg_col..'&quot; | '..s_bps..'\n')
 		    end
     	end
     	if show_deduct then 
     	table.insert(t,'| style=&quot;'..ii_fw..bg_col..'&quot; | '..deductions..'\n')
     	end
 	end
 	if points&lt;0 then
         table.insert(t,'| style=&quot;'..pts_fw..bg_col..'&quot; | &amp;minus;'..-points..pts_string..'\n')
 	else
 		table.insert(t,'| style=&quot;'..pts_fw..bg_col..'&quot; | '..points..pts_string..'\n')
 	end
 	if full_table then
         if show_nrr then
             table.insert(t,'| style=&quot;'..ii_fw..bg_col..'&quot; |'..nrr..'\n') 		-- Net run rate
         end
         if show_nrr_fa then
             local nrr_for_text = oversreceived &gt; 0 and runsscored..'/'..oversreceived or '&amp;mdash;'
             local nrr_against_text = oversbowled &gt; 0 and runsconceded..'/'..oversbowled or '&amp;mdash;'
             table.insert(t, '| data-sort-value=&quot;'..nrr_for..'&quot; style=&quot;'..ii_fw..bg_col..'&quot; |'..nrr_for_text..'\n')
             table.insert(t, '| data-sort-value=&quot;'..nrr_against..'&quot; style=&quot;'..ii_fw..bg_col..'&quot; |'..nrr_against_text..'\n')
         end
     end
 
 	return {t=t, notes_exist=notes_exist, hth_id_list=hth_id_list}
 end
 
 function pp.status(Args)
 	-- Declare status options
 	-- ------------------------------------------------------------
 	-- NOTE: If you add to status_code, also add to status_called and status_letters!!
 	-- Or functionality will be compromised
 	-- ------------------------------------------------------------
 	local status_code, status_called = {},{}
 
     status_code = {	A='அடுத்த ஒரு சுற்றுக்குத் தெரிவு', C='வாகையாளர்', D='தகுதி நீக்கம்', 
 		E='வெளியேற்றம்', G='Guest', H='நடத்தும் நாடு', O='Play-off winner', P='Promoted', Q='அடுத்த கட்டத்திற்குத் தெரிவு',
 		R='Relegated', T='Qualified, but not yet to the particular phase indicated' }
 	
 	local status_letters = (Args['status_order'] or '') .. 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'
 
     -- Status position(before or after read and default)
 
     local stat_pos_val = string.lower(Args['status_pos'] or '')
 	local status_position = 'after'-- Default location
 	if stat_pos_val=='before' then
         status_position = 'before'
     elseif stat_pos_val=='after' then
         status_position = 'after'
     end
 	
 	for l in mw.text.gsplit(status_letters, '') do
 		status_called[l] = false
 		status_code[l] = status_code[l] or '?'
 		status_letters = mw.ustring.gsub(status_letters, '(' .. l..'.-)' .. l, '%1')
 
 		if Args['status_text_'..l] then
             status_code[l] = Args['status_text_'..l]
         end
      end
 	
 	return {code=status_code, called=status_called, letters=status_letters, position=status_position}
 end