Module:Football box
-- Implements [[வார்ப்புரு:Football box]]
 local p = {}
 local lang = nil
 local delink = require('Module:Delink')._delink
 local eventschema = &quot;http://schema.org/SportsEvent&quot;
 local teamschema = &quot;http://schema.org/SportsTeam&quot;
 local placeschema = &quot;http://schema.org/Place&quot;
 local penalties = '[[சமன்நீக்கி மோதல்|ச.நீ]]'
 local aet = '[[கூடுதல் நேரம் (விளையாட்டு)|கூ.நே]]'
 local asdet = '[[திடீரென்று முடிக்கும் விதி (விளையாட்டு)|தி.மு.வி]]'
 local agget = '[[கூடுதல் நேரம் (விளையாட்டு)|கூ.நே]]/[[Golden goal|g.g.]]'
 local asget = '[[கூடுதல் நேரம் (விளையாட்டு)|கூ.நே]]/[[Golden goal#Silver goal|s.g.]]'
 local attendance = 'பார்வையாளர்கள்:'
 local referee = 'நடுவர்:'
 local templatestyles = 'Module:Football box/styles.css'
 
 local tracking, preview
 
 local function checkarg(k,v)
 	if not k or type(k) ~= 'string' then return end
 	
 	if  k == 'assistantreferees2' then
 		table.insert(tracking, '[[Category:Pages using football box with assistantreferees|2]]')
 	elseif k == 'aggregatescore' or k == 'assistantreferees' or 
 			k == 'fourthofficial' or k == 'game' or k == 'motm' or 
 			k == 'nobars' or k == 'note' or k == 'result' then
 		-- valid and tracked
 		table.insert(tracking, '[[Category:Pages using football box with ' .. k .. ']]')
 	elseif k == 'size' or k == 'bg' or k == 'id' or k == 'event' or 
 		k == 'date' or k == 'time' or k == 'round' or k == 'team1' or 
 		k == 'team2' or k == 'score1' or k == 'score2' or k == 'score' or k == 'scorenote' or
 		k == 'aet' or k == 'asdet' or k == 'agget' or k == 'asget' or k == 'goals1' or k == 'report' or k == 'goals2' or 
 		k == 'penaltyscore' or k == 'penalties1' or k == 'penalties2' or 
 		k == 'stadium' or k == 'location' or k == 'attendance' or 
 		k == 'referee' or k == 'stack'  then
 		-- valid and not tracked
 	else
 		-- invalid
 		local vlen = mw.ustring.len(k)
 		k = mw.ustring.sub(k, 1, (vlen &lt; 25) and vlen or 25) 
 		k = mw.ustring.gsub(k, '[^%w\-_ ]', '?')
 		table.insert(tracking, '[[Category:Pages using football box with unknown parameters|' .. k .. ']]')
 		table.insert(preview, '&quot;' .. k .. '&quot;')
 	end
 end
 
 local function timestamp(d, t)
 	if not d then return nil end
 	
 	lang = lang or mw.language.getContentLanguage() -- lazy initialize
 	local success, timestamp = pcall(lang.formatDate, lang, 'c', delink({d .. ' ' .. (t or '')}))
 	if success then
 		return timestamp
 	else
 		return nil
 	end
 end
 
 local function fmtlist(s)
 	s = mw.ustring.gsub(s or '', '%[%[ *([%?-]) *%]%]', '%1')
 	s = mw.ustring.gsub(s, '%[%[ *[%?-] *| *(.-) *%]%]', '%1')
 	if mw.ustring.sub(s, 1, 1) == '*' then
 		return tostring(mw.html.create('div'):addClass('plainlist'):newline():wikitext(s))
 	end
 	return s
 end
 
 local function makelink(s,t)
 	if s:match('^[Hh][Tt][Tt][Pp][Ss]?:[^ ]*$') then
 		return '[' .. s .. ' ' .. t .. ']'
 	end
 	return s
 end
 
 local function trim(s)
 	return s:match('^[\'&quot;%s]*(.-)[\'&quot;%s]*$')
 end
 
 local function getid(s)
 	s = trim(s or '')
 	if s and s ~= '' then
 		return s
 	end
 	return nil
 end
 
 function p.main(frame)
 	local args = require('Module:Arguments').getArgs(frame)
 	local id = getid(args['id'])
 	local d = timestamp(args['date'], args['time'])
 	local block
 	
 	tracking, preview = {}, {}
     for k, v in pairs(args) do
     	if v ~= '' then
     		checkarg(k,v)
     	end
 	end
 
 	local score = 'v'
 	if args['score1'] or args['score2'] then
 		score = (args['score1'] or '0') .. '&amp;ndash;' .. (args['score2'] or '0')
 	elseif args['score'] and args['score'] ~= '' then
 		score = args['score']
 	end
 	if args['aet'] then
 		score = score .. ' (' .. aet .. ')'
 	elseif args['asdet'] then
 		score = score .. ' (' .. asdet .. ')'
 	elseif args['agget'] then
 		score = score .. ' (' .. agget .. ')'
 	elseif args['asget'] then
 		score = score .. ' (' .. asget .. ')'
 	end
 	if args['scorenote'] then
 		score = score .. '&lt;br&gt;' .. args['scorenote']
 	end
 	
 	-- Start box
 	local root = 
 		mw.html.create('div')
 			:attr('itemscope', '')
 			:attr('itemtype', eventschema)
 			:addClass('footballbox')
 			:css('width', args['size'])
 			:css('background-color', args['bg'])
 			:attr('id', id)
 	root:newline()
 	
 	if args['event'] then
 		root:tag('div')
 			:addClass('ftitle')
 			:wikitext(args['event'])
 	end
 	
 	-- Start left block
 	block = root:tag('div')
 		:addClass('fleft')
 	
 	local timetag = block:tag('time')
 		:attr('itemprop', d and 'startDate' or nil)
 		:attr('datetime', d)
 		
 	timetag:tag('div')
 		:addClass('fdate')
 		:wikitext(args['date'])
 	
 	if args['time'] then
 		timetag:tag('div')
 			:addClass('ftime')
 			:wikitext(args['time'])
 	end
 	
 	if args['round'] then
 		block:tag('div')
 			:addClass('frnd')
 			:wikitext(args['round'])
 	end
 	-- End block
 	
 	-- Start table
 	local rtable = root:tag('table')
 		:addClass('fevent')
 	local row = rtable:tag('tr')
 		:attr('itemprop', 'name')
 	row:newline()
 	row:tag('th')
 		:addClass('fhome')
 		:attr('itemprop', 'homeTeam')
 		:attr('itemscope', '')
 		:attr('itemtype', teamschema)
 		:tag('span')
 			:attr('itemprop', 'name')
 			:wikitext(args['team1'])
 	row:tag('th')
 		:addClass('fscore')
 		:wikitext(score)
 	row:tag('th')
 		:addClass('faway')
 		:attr('itemprop', 'awayTeam')
 		:attr('itemscope', '')
 		:attr('itemtype', teamschema)
 		:tag('span')
 			:attr('itemprop', 'name')
 			:wikitext(args['team2'])
 
 	row = rtable:tag('tr')
 		:addClass('fgoals')
 		:newline()
 	row:tag('td')
 		:addClass('fhgoal')
 		:wikitext(fmtlist(args['goals1']))
 	row:newline()
 	row:tag('td')
 		:wikitext(makelink(args['report'] or '', 'அறிக்கை'))
 	row:newline()
 	row:tag('td')
 		:addClass('fagoal')
 		:wikitext(fmtlist(args['goals2']))
 	row:newline()	
 	
 	if args['penaltyscore'] then
 		rtable
 			:tag('tr')
 				:tag('th')
 					:attr('colspan', 3)
 					:wikitext(penalties)
 		row = rtable:tag('tr')
 			:addClass('fgoals')
 		row:newline()
 		row:tag('td')
 			:addClass('fhgoal')
 			:wikitext(fmtlist(args['penalties1']))
 		row:newline()
 		row:tag('th')
 			:wikitext(args['penaltyscore'])
 		row:newline()
 		row:tag('td')
 			:addClass('fagoal')
 			:wikitext(fmtlist(args['penalties2']))
 		row:newline()
 	end
 	-- End table
 	
 	-- Start right block
 	block = root:tag('div')
 		:addClass('fright')
 	
 	if args['stadium'] then
 		local sdiv = block:tag('div')
 			:attr('itemprop', 'location')
 			:attr('itemscope', '')
 			:attr('itemtype', placeschema)
 		if args['location'] then
 			sdiv:tag('span')
 				:attr('itemprop', 'name')
 				:wikitext(args['stadium'])
 			sdiv:wikitext(', ')
 			sdiv:tag('span')
 				:attr('itemprop', 'address')
 				:wikitext(args['location'])
 		else
 			sdiv:tag('span')
 				:attr('itemprop', 'name address')
 				:wikitext(args['stadium'])
 		end
 	end
 	
 	if args['attendance'] then
 		block:tag('div'):wikitext(attendance ..' ' .. args['attendance'])
 	end
 	if args['referee'] then
 		block:tag('div'):wikitext(referee .. ' ' .. args['referee'])
 	end
 
 	local trackstr = (#tracking &gt; 0) and table.concat(tracking, '') or ''
 	if #preview &gt; 0 and frame:preprocess( &quot;{{REVISIONID}}&quot; ) == &quot;&quot; then
 		trackstr = tostring(mw.html.create('div')
 			:addClass('hatnote')
 			:css('color','red')
 			:tag('strong'):wikitext('Warning:'):done()
 			:wikitext('Unknown parameters: ' .. table.concat(preview, '; ')))
 	end
 	
 	return frame:extensionTag{ name = 'templatestyles', args = { src = templatestyles} } .. tostring(root) .. trackstr
 end