Module:Event list

This is an old revision of this page, as edited by Frietjes (talk | contribs) at 21:36, 17 September 2016. The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

-- this module implements [[Template:Event list]]
local p = {}

local mArguments = require('Module:Arguments')

function p.main(frame)
	local args = mArguments.getArgs(frame)
	
	local title = args['title'] or 'Chronology of events for ' .. mw.title.getCurrentTitle().text
	local cols = tonumber(args['columns'] or '2') or 2
	local datewidth = args['datewidth'] or '-1'
	local collapse = args['collapse'] or 'collapsed'

	-- append the suffix to the date width or set to auto
	if (tonumber(datewidth) or -1) >= 0 then
		datewidth = tonumber(datewidth) .. 'px'
	else
		datewidth = 'auto'
	end
	
	-- build a list of event parameter numbers
	eventnums = {}
	for k,v in pairs(args) do
		local i = tonumber(tostring(k):match( '^%s*date([%d]+)%s*$' ) or '-1')
		if i ~= -1 then
			table.insert(eventnums, k)
		else
			i = tonumber(tostring(k):match( '^%s*event([%d]+)%s*$' ) or '-1')
			if i ~= -1 then
				table.insert(eventnums, k)
			else
				i = tonumber(k) or -1
				if i ~= -1 then
					table.insert(eventnums, math.floor((i+1)/2) )
				end
			end
		end
	end

	-- sort to process in order
	table.sort( eventnums )
	
	-- remove duplicates
	for k = 2,#eventnums do
		if eventnums[k] == eventnums[k-1] then
			table.remove(eventnums, k)
		end
	end

	-- create the root table
	local root = mw.html.create('table')
	root:addClass('wikitable')
		:addClass('collapsible')
		:addClass(collapse)
		:css('width', '100%')
	-- Add the title
	root:tag('tr'):tag('th'):attr('colspan', cols):wikitext(title)
	-- Create the row to hold the columns
	local outerrow = root:tag('tr')
	local percol = math.ceil((#eventnums) / cols)
	k = 0
	for i = 1,cols do
		local outercell = outerrow:tag('td'):css('width', (math.floor(10/cols)/10) .. '%')
		local innertable = outercell:tag('table')
			:css('width', '100%')
			:css('border', 'none')
			:css('cellspacing', '-1px')
			:css('cellpadding', '0px')
			:css('margin', '-1px')
			:css('font-size', '85%')
			:css('line-height', '95%')
		local tr = innertable:tag('tr')
		tr:tag('th'):attr('scope', 'col'):css('width', datewidth):css('text-align', 'left'):wikitext('Date')
		tr:tag('th'):attr('scope', 'col'):css('text-align', 'left'):wikitext('Event description')
		for j=1,percol do
			k = k + 1
			if k <= #eventnums then
				local n = tonumber(eventnums[k])
				local d = (args['date' .. n] or '') .. (args[2*(n-1)+1] or '')
				local e = (args['event' .. n] or '') .. (args[2*(n-1)+2] or '')
				if d ~= '' or e ~= '' then
					tr = innertable:tag('tr')
					tr:tag('td'):wikitext(d)
					tr:tag('td'):wikitext(e)
				end
			end
		end
	end

	return tostring(root)
end

return p