Module:Navbox or wikitable
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('^') then
line = string.format('%s%s', 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