From Wikipedia, the free encyclopedia

--

-- This module implements {{Sidebar games events}}

-- This module was created using code taken directly from [[Module:Sidebar]] 

--

require('strict')



local p = {}



local getArgs = require('Module:Arguments').getArgs



local tracking, preview = {}, {}



local function checkargs(args)

    for k, v in pairs(args) do

    	if v ~= '' then

			if k and type(k) == 'string' then

				if k == 'event' or k == 'games' or k == 'name' or k == 'image' or

					k == 'imageright' or k =='caption' or k =='above' or

					k == 'title' or k == 'alignresults' or k == 'alignevents' or

					k == 'width' or k == 'maxwidth' or k == 'float' or

					k == 'below' or k == 'prev' or k == 'next' then

					-- valid

				elseif k:match('^title%d+$') or k:match('^event%d+$') or

					k:match('^image%d+$') or k:match('^type%d+[a-e]$') or

					k:match('^event%d+%.%d+$') or 

					k:match('^results%d+%.%d+[a-e]?$') or

					k:match('^border%d+%.%d+$') then

					-- valid

				elseif k == 'categories' or k == 'nocat' or k == 'demo' then

					-- valid for doc page

				else

					-- invalid

					local vlen = mw.ustring.len(k)

					k = mw.ustring.sub(k, 1, (vlen < 25) and vlen or 25) 

					k = mw.ustring.gsub(k, '[^%w\-_ ]', '?')

					table.insert(tracking, '[[Category:Pages using sidebar games events with unknown parameters|' .. k .. ']]')

					table.insert(preview, '"' .. k .. '"')

				end

			end

		end

	end

end



function p.sidebar(frame, args)



	if not args then

		args = getArgs(frame)

	end

		

	local root = mw.html.create()



	root = root

		:tag('table')

		:addClass('sidebar-games-events')

		:addClass(args.float == 'left' and 'sidebar-games-events-left' or nil)

		:addClass(args.float == 'none' and 'sidebar-games-events-none' or nil)

		:addClass('sidebar')

		:addClass('nomobile')

		:css('width', args.width or nil)

		:css('max-width', args.maxwidth or nil)



	-- enumerate the rows and count the columns

	local cols = 1

	local colindex = {a = '2', b = '3', c = '4', d = '5', e = '6'}

	local lets = {'a', 'b', 'c', 'd', 'e'}

	local rowNums = {}

	local subevents = 0

	local hasevents = false



	for k, v in pairs(args) do

		k = '' .. k

		

		-- find rows

		local num = k:match('^event(%d+)$') 

			or k:match('^image(%d+)$')

			or k:match('^title(%d+)$')

			or k:match('^type(%d+)[a-e]$')

			or k:match('^event(%d+)%.%d+$')

			or k:match('^results(%d+)%.%d+[a-e]?$')

		if num then table.insert(rowNums, tonumber(num)) end

		

		-- find number of columns

		if k:match('^results%d+%.(%d+)$') then

			cols = (2 > cols) and 2 or cols

		end

		

		-- find number of columns based on let(s)

		local let = k:match('^results%d+%.%d+([a-e])$')

			or k:match('^type%d+([a-e])$')

		if let and colindexlet then

			local n = tonumber(colindexlet])

			cols = (n > cols) and n or cols

		end

		

		-- find subevents

		local subnum = k:match('^results%d+%.(%d+)[a-e]?$')

			or k:match('^event%d+%.(%d+)$')

		if subnum then

			subnum = tonumber(subnum)

			subevents = (subnum > subevents) and subnum or subevents

		end

		

		-- identify events (that match looks awfully similar to subevents)

		if k:match('^(event%d+%.%d+)$') then

			hasevents = true

		end

	end

	-- remove duplicates from the list (e.g. 3 will be duplicated if both event3 and image3 are specified)

	table.sort(rowNums)

	for i = #rowNums, 1, -1 do

		if rowNumsi == rowNumsi - 1 then

			table.remove(rowNums, i)

		end

	end

	

	-- alignment

	local alignevents = nil

	if args.alignevents and args.alignevents == 'right' then

		alignevents = 'event-r'

	end

	local alignresults = nil

	if args.alignresults and args.alignresults == 'right' then

		alignresults = 'result-r'

	elseif args.alignresults and args.alignresults == 'left' then

		alignresults = 'result-l'

	end



	-- add the top level header	

	if args.event or args.title then

		local t = args.event

		if args.title then

			t = args.title

		elseif args.games then

			t = '[[' .. args.event .. ' at the ' .. args.games .. '|' .. args.event .. ']]'

				.. ' at the<br>' .. '[[' .. args.games .. ']]'

		end

		local cell = root:tag('tr'):tag('th')

		cell

			:addClass('sidebar-games-events-title')

			:attr('colspan', cols)

		if args.imageright then

			local d = cell:tag('div')

				:addClass('sidebar-games-events-ir-cont')

			d:tag('div')

				:addClass('sidebar-games-events-ir-title')

				:wikitext(t)

			d:tag('div')

				:addClass('sidebar-games-events-ir')

				:wikitext(args.imageright)

		else

			cell:wikitext(t)

		end

	end



	if args.image then

		local imageCell = root:tag('tr'):tag('td')



		imageCell

			:addClass('sidebar-games-events-image')

			:attr('colspan', cols)

			:wikitext(args.image)



		if args.caption then

			imageCell

				:tag('div')

					:addClass('sidebar-games-events-caption')

					:wikitext(args.caption)

		end

	end



	if args.above then

		local cell = root:tag('tr'):tag('td')

		cell:attr('colspan', cols)

			:wikitext(args.above)

	end

	

	-- start adding rows

	for i, num in ipairs(rowNums) do

		local heading = nil

		local event = args'event' .. num

		local image = args'image' .. num

		local title = args'title' .. num

		if title then

			root:tag('tr')

					:tag('th')

						:addClass('event-title')

						:attr('colspan', cols)

						:wikitext(title)

		end

		

		if event and image then

			heading = event .. '<br>' .. image

		elseif event then

			heading = event

		elseif image then

			heading = image

		end

		

		if heading then

			root

				:tag('tr')

					:tag('th')

						:addClass('sidebar-games-events-heading')

						:attr('colspan', cols)

						:wikitext(heading)

		end



		local showtypes = false

		for j, let in ipairs(lets) do

			if j < cols then

				if args'type' .. num .. let then

					showtypes = true

				end

			end

		end

		if showtypes == true then

			local row = root:tag('tr')

			row:tag('th'):addClass((hasevents == false) and 'no-event' or nil)

			for j, let in ipairs(lets) do

				if j < cols then

					local t = args'type' .. num .. let

					local cell = row:tag('th')

					if t then

						cell

							:addClass('type-let')

							:css('width', (cols > 2) and tostring(math.floor(100/(cols-1))) .. '%' or nil)

							:wikitext(t)

					end

				end

			end

		end



		for k=1,subevents do

			local hasresults = false

			if args'results' .. num .. '.' .. k then

				hasresults = true

			else

				for j, let in ipairs(lets) do

					if j < cols then

						if args'results' .. num .. '.' .. k .. let then

							hasresults = true

						end

					end

				end

			end

	

			if hasresults then

				local row = root:tag('tr')

				local cell = row:tag('th'):addClass((hasevents == false) and 'no-event' or nil)

				local t = args'event' .. num .. '.' .. k

				local border = args'border' .. num .. '.' .. k  and 'erl-border' or nil

				if t then

					cell

						:addClass('event')

						:addClass(alignevents)

						:addClass(border)

						:wikitext(t)

				end

				if args'results' .. num .. '.' .. k then

					row:tag('td')

							:addClass(border)

							:addClass(alignresults)

							:attr('colspan', cols - 1)

							:newline() -- newline required for bullet-points to work

							:wikitext(args'results' .. num .. '.' .. k])

				else

					for j, let in ipairs(lets) do

						if j < cols then

							t = args'results' .. num .. '.' .. k .. let

							row:tag('td')

								:addClass(border)

								:addClass(alignresults)

								:wikitext(t)

						end

					end

				end

			end

		end

	end

		

	if args.below then

		root

			:tag('tr')

				:tag('td')

					:addClass(args.belowclass)

					:attr('colspan', cols)

					:cssText(args.belowstyle)

					:wikitext(args.below)

	end



	if args.prev or args.next then

		local row = root:tag('tr'):tag('td')

			:addClass('sidebar-games-events-prevnext')

			:attr('colspan', cols)

				:tag('div')

		row:tag('div')

			:addClass('sidebar-games-events-prev')

			:wikitext(args.prev)

		row:tag('div')

			:addClass('sidebar-games-events-next')

			:wikitext(args.next)

	end



	if args.navbar ~= 'none' and args.navbar ~= 'off' and

		(args.name or frame:getParent():getTitle():gsub('/sandbox$', '') ~= 'Template:Sidebar games events') then

		root

			:tag('tr')

				:tag('td')

					:addClass('sidebar-games-events-navbar')

					:attr('colspan', cols)

					:wikitext(require('Module:Navbar')._navbar{

						args.name,

						mini = 1,

						fontstyle = args.navbarfontstyle

					})

	end

	

	if mw.title.getCurrentTitle().namespace == 10 and (args.name ~= mw.title.getCurrentTitle().text) and not (mw.title.getCurrentTitle().text:match('Sidebar games events')) then

    	root:wikitext("[[Category:Templates using sidebar games events without correct name]]")

	end

	

	checkargs(args)



	local trackstr = (#tracking > 0) and table.concat(tracking, '') or ''

	if #preview > 0 then

		trackstr = require('Module:If preview')._warning({

			'Unknown parameters ' .. table.concat(preview, '; ') .. '.'

		}) .. trackstr

	end



	return mw.getCurrentFrame():extensionTag{

		name = 'templatestyles', args = { src = 'Module:Sidebar games events/styles.css' }

	} .. tostring(root) .. trackstr

end

return p