Jump to content

Module:Navbox or wikitable

Permanently protected module
From Wikipedia, the free encyclopedia

require('strict')

local p = {}

local function isnotempty(s)
	return s and s:match( '^%s*(.-)%s*$' ) ~= ''
end

-- this function was copied from [[Module:Navbox]]
local function processItem(item, nowrapitems)
	if item:sub(1, 2) == '{|' then
		-- Applying nowrap to lines in a table does not make sense.
		-- Add newlines to compensate for trim of x in |parm=x in a template.
		return '\n' .. item .. '\n'
	end
	if nowrapitems == 'yes' then
		local lines = {}
		for line in (item .. '\n'):gmatch('([^\n]*)\n') do
			local prefix, content = line:match('^([*:;#]+)%s*(.*)')
			if prefix and not content:match('^<span class="nowrap">') then
				line = string.format('%s<span class="nowrap">%s</span>', prefix, content)
			end
			table.insert(lines, line)
		end
		item = table.concat(lines, '\n')
	end
	if item:match('^[*:;#]') then
		return '\n' .. item .. '\n'
	end
	return item
end

function p.main(frame)
	
	local yesno = require('Module:Yesno')
	local is_navbox = yesno(frame.args['navbox'] or 'yes', true)

	-- If this is not a table, then jump straight over to the navbox module
	if ( is_navbox ) then
		return require('Module:Navbox').navbox(frame, 'navbox')
	end

	local args = frame.args
	-- get the group and list numbers
	local groups, lists, nums = {}, {}, {}
	for k,v in pairs(args) do
		if type(k) == 'string' and k:match('^list[0-9][0-9]*$') then
			local i = mw.ustring.gsub(k,'^list([0-9][0-9]*)$', '%1')
			i = tonumber(i)
			if lists[i] == nil and groups[i] == nil then
				table.insert(nums, i)
			end
			lists[i] = v
		elseif type(k) == 'string' and k:match('^group[0-9][0-9]*$') then
			local i = mw.ustring.gsub(k,'^group([0-9][0-9]*)$', '%1')
			i = tonumber(i)
			if groups[i] == nil and lists[i] == nil then
				table.insert(nums, i)
			end
			groups[i] = v
		end
	end
	-- sort the group and list numbers
	table.sort(nums)
	
	-- generate the table
	local tbl = mw.html.create('table')
		:addClass('wikitable')
		:addClass('args.bodyclass')
		
	local navbar = require('Module:Navbar')._navbar
	tbl:tag('caption')
		:wikitext(args.title or '')
		:wikitext(navbar{
				['name'] = args.name,
				['mini'] = 1,
				['brackets'] = 1,
				['style'] = 'float:right'
			})
	
	if isnotempty(args['above']) then
		local row = tbl:tag('tr')
		row:tag('td')
			:attr('colspan', 2)
			:css('text-align', 'center')
			:wikitext(args['above'])
	end
	
	for ni = 1, #nums do
		local i = nums[ni]
		if isnotempty(args['group' .. i]) and isnotempty(args['list' .. i]) then
			local row = tbl:tag('tr'):css('vertical-align', 'top')
			row:tag('th')
				:attr('scope', 'row')
				:css('font-weight', 'normal')
				:css('white-space', 'nowrap')
				:wikitext(args['group' .. i])
			row:tag('td')
				:tag('div')
				:addClass(args.listclass)
				:wikitext(processItem(args['list' .. i], args['nowrapitems']))
		elseif isnotempty(args['list' .. i]) then
			local row = tbl:tag('tr')
			row:tag('td')
				:attr('colspan', 2)
				:css('text-align', 'center')
				:tag('div')
				:addClass(args.listclass)
				:wikitext(processItem(args['list' .. i], args['nowrapitems']))
		end
	end
	
	if isnotempty(args['below']) then
		local row = tbl:tag('tr')
		row:tag('td')
			:attr('colspan', 2)
			:css('text-align', 'center')
			:wikitext(args['below'])
	end
	
	return tbl
end

return p