local navbox = require 'Module:Navbox'
local tools = require 'Module:TableTools'
local p = {}
setmetatable(p, {__index = navbox})
function p._navbox(args, frame)
local obj = p.new{
args = args,
frame = frame
}
obj:processArgs()
obj:addColumnBeforeRender()
return obj:render()
end
function p.new(paras)
local obj = navbox.new(paras)
-- 格式:
-- { {header, headercolspan, headerstyle, content, width, style, footer, footercolspan, footerstyle} }
obj.columnsData = paras.columnsData or {}
return setmetatable(obj, {__index = p})
end
local acceptedSuffixes = {
[''] = true, header=true, headercolspan=true, headerstyle=true, width=true, style=true, footer=true, footercolspan=true, footerstyle=true
}
function p:processColumnsArg(k, v)
local columnsData = assert(self.columnsData, 'self.columnsData')
if type(k) ~= 'string' then return end
local num, suffix = string.match(k, '^col(%d+)(%l*)$')
num = tonumber(num)
if not num then return end
-- suffix的值通常可以是:
-- 空 header headercolspan headerstyle width style footer footercolspan footerstyle
if not acceptedSuffixes[suffix] then
mw.addWarning(
'来自[[Module:Navbox with collapsible groups]]的警告:未知的参数“' .. tostring(k) .. '”,因为其后缀“' .. tostring(suffix) .. '”未知。')
return
end
if suffix == '' then
suffix = 'content'
end
local columnData = columnsData[num]
if not columnData then
columnData = {}
columnsData[num] = columnData
end
columnData[suffix] = v
end
function p:processArg(k, v, data)
navbox.processArg(self, k, v, data)
self:processColumnsArg(k, v)
end
function p:addColumnBeforeRender()
local columnsData = assert(self.columnsData, 'self.columnsData')
local args = assert(self.args, 'self.args')
local tbl = mw.html.create 'table'
:addClass 'navbox-columns-table'
:css('margin', 'auto')
:cssText(args.coltablesstyle)
if self.args.fullwidth == '1' then
tbl:css('width', '100%')
end
local compressed = tools.compressExtendedSparseArray(columnsData)
local shouldRenderHeading, shouldRenderBody, shouldRenderFooter
for i, columnData in ipairs(compressed) do
if columnData.header then
shouldRenderHeading = true
end
if columnData.content then
shouldRenderBody = true
end
if columnData.footer then
shouldRenderFooter = true
end
end
if not (shouldRenderHeading or shouldRenderBody or shouldRenderFooter) then
mw.addWarning('来自[[Module:Navbox with columns]]的警告:您似乎没有为此模板指定任何列的内容(如col1heading、col1、col1footer等),因此列部分将不会进行渲染。')
return
end
if shouldRenderHeading then
local headingRow = tbl:tag 'tr'
for i, columnData in ipairs(compressed) do
local cell = headingRow:tag 'th':addClass 'navbox-columns-header-row'
cell:attr('colspan', columnData.headercolspan)
cell:cssText(args.colheaderstyle)
cell:cssText(columnData.headerstyle)
cell:wikitext(columnData.header)
end
end
if shouldRenderBody then
local bodyRow = tbl:tag 'tr':addClass 'navbox-columns-body-row'
for i, columnData in ipairs(compressed) do
local cell = bodyRow:tag 'td'
:css('padding', '0')
cell:cssText(args.colstyle)
if i % 2 == 0 then
cell:cssText(args.evencolstyle)
else
cell:cssText(args.oddcolstyle)
end
cell:cssText(columnData.style)
cell:css('width', columnData.width or args.colwidth or '10em')
cell:wikitext(columnData.content)
end
end
if shouldRenderFooter then
local footerRow = tbl:tag 'tr':addClass 'navbox-columns-footer-row'
for i, columnData in ipairs(compressed) do
local cell = footerRow:tag 'th'
cell:attr('colspan', columnData.footercolspan)
cell:cssText(args.colfooterstyle)
cell:cssText(columnData.footerstyle)
cell:cssText(args.footerstyle)
cell:wikitext(columnData.footer)
end
end
local data = assert(self.data, 'self.data')
table.insert(data, 0, {
list = {content = tostring(tbl), style = 'background: transparent'}
})
end
function p.navbox(frame)
-- 通过#invoke直接使用
local getArgs = require 'Module:Arguments'.getArgs
return p._navbox(getArgs(frame), frame)
end
return p