Module:Navbox
Documentation for this module may be created at Module:Navbox/doc
-- Load necessary modules.
require('Module:No globals')
local getArgs
local p = { }
--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------
local function union(t1, t2)
local temp = {}
for _, v in pairs(t1) do
temp[v] = true
end
for _, v in pairs(t2) do
temp[v] = true
end
local ret = {}
for k in pairs(temp) do
table.insert(ret, k)
end
table.sort(ret)
return ret
end
local function getArgNums(prefix)
local ret = { }
for k in pairs(mw.getCurrentFrame():getParent().args) do
if string.match(k, "^" .. prefix .. "[0-9]%d*$") then
table.insert(ret, tonumber(string.sub(k, string.len(prefix) + 1)))
end
end
table.sort(ret)
return ret
end
--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------
local Navbox = {}
Navbox.__index = Navbox
function Navbox.new(args)
args = args or {}
local obj = {}
-- Set the arguments
obj.args = args
mw.logObject(obj)
return setmetatable(obj, Navbox)
end
function Navbox:setParameters()
local args = self.args
self.title = args.title
self.above = args.above
self.rows = self:setRows()
self.below = args.below
self.image = args.image
self.imageleft = args.imageleft
self.subgroup = args[1] == 'child'
end
function Navbox:setRows()
local args = self.args
local nums = union(getArgNums('group'), getArgNums('list'))
local t = { }
for _,v in pairs(nums) do
table.insert(t,
{
group = args['group' .. v],
list = args['list' .. v]
})
end
return t
end
function Navbox:export()
local root = mw.html.create():tag('div')
if not self.subgroup then
root:addClass('navbox')
root:addClass('mw-collapsible')
else
root:addClass('navbox-subgroup')
end
if self.title then
local title = root:tag('div')
title
:addClass('navbox-title')
:wikitext(self.title)
end
local inner = root:tag('div')
inner:addClass('navbox-inner')
if not self.subgroup then
inner:addClass('mw-collapsible-content')
end
if self.above then
local above = inner:tag('div')
above
:addClass('navbox-above')
:wikitext(self.above)
end
if self.imageleft then
local imageleft = inner:tag('div')
imageleft
:addClass('navbox-image')
:addClass('navbox-imageleft')
:wikitext(self.imageleft)
end
if self.image then
local image = inner:tag('div')
image
:addClass('navbox-image')
:wikitext(self.image)
end
for _,v in ipairs(self.rows) do
if v.list then
if v.group then
local group = inner:tag('div')
group:addClass('navbox-group')
group:wikitext(v.group)
end
local list = inner:tag('div')
list:addClass('navbox-list')
list:addClass('hlist')
list:newline()
list:wikitext(v.list)
list:newline()
end
end
if self.below then
local below = inner:tag('div')
below
:addClass('navbox-below')
:wikitext(self.below)
end
local navboxStyle = mw.getCurrentFrame():extensionTag( 'templatestyles', '', { src = 'Template:Navbox/styles.css' } );
local hlistStyle = mw.getCurrentFrame():extensionTag( 'templatestyles', '', { src = 'Template:Hlist/styles.css' } );
return navboxStyle .. hlistStyle .. tostring(root)
end
--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------
function p.navbox(frame)
if not getArgs then
getArgs = require('Module:Arguments').getArgs
end
local box = Navbox.new(getArgs(frame))
box:setParameters()
return box:export()
end
if mw.site.siteName:byte() == 66 then
return p
end