模块:Navbox with columns

求闻百科,共笔求闻
文档图示 模块文档[创建] [跳转到代码]

本模块还没有文档页面。

您可以创建文档以让用户更好地理解本模块的用途。
编者可以在本模块的沙盒创建 | 镜像和测试样例创建页面进行实验。
请将模块自身所属的分类添加在文档中。本模块的子页面
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