Module:Tabber
Jump to navigation
Jump to search
This module implements {{Tabber}}
.
local p = {}
local lib = require('Module:Feature')
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame)
return p._main(args, frame)
end
function p._main(args, frame)
if args == nil then return ''
elseif type(args) ~= 'table' then return args
end
frame = frame or mw.getCurrentFrame()
local tabber = mw.html.create('div'):addClass('tabber')
local labels = mw.html.create('ul'):addClass('tabber__header ' .. (args.no_border == nil and 'with-bottom-border' or ''))
local contents = mw.html.create()
local i = 1
local y = '1'
local validTabs = 0
local function addContent(container, content)
if type(content) == 'string' then
if args.nowiki then
local content =
frame:preprocess(
mw.text.decode(
mw.text.unstripNoWiki(
content
)
)
)
container:wikitext(content) --plain string content encased in nowiki as to avoid bad mediawiki parsing
else
container:wikitext(content) --plain string content
end
elseif type(content) == 'table' and tostring(content) == 'table' then --table content
for _, subContent in ipairs(content) do
addContent(container, subContent)
end
elseif type(content) == 'table' then container:node(content) --html content
end
end
while (args[i] and args[i+1]) or (args['label' .. y] and args['content' .. y]) do
local label = args['label' .. y] or args[i]
local content = args['content' .. y] or args[i+1]
if lib.isNotEmpty(label) and lib.isNotEmpty(content) then
validTabs = validTabs + 1
labels
:tag('li')
:addClass('tabber__tab')
:attr('aria-selected', i==1 and 'true' or 'false')
:attr('id', 'tab-' .. label:gsub(' ', '_') .. '-0')
:attr('href', '#' .. label:gsub(' ', '_') .. '-0')
:wikitext(label)
local contentContainer =
contents
:tag('div')
:attr('id', label:gsub(' ', '_') .. '-0')
:attr('aria-hidden', i==1 and 'false' or 'true')
:addClass('tabber__panel')
contentContainer:newline()
addContent(contentContainer, content)
contentContainer:newline()
end
i = i + 2 --unnamed go in pairs
y = tostring(tonumber(y)+1)
end
if validTabs <2 then return (args['content1'] or args[2] or '') end
tabber:node(labels)
tabber:node(contents)
return tabber
end
return p