模块:InfoBox

来自「荏苒之境」
Sicusa留言 | 贡献2025年8月8日 (五) 01:28的版本

此模块的文档可以在模块:InfoBox/doc创建

local html = mw.html

local csv = require("Module:Csv")

local infobox = {}

local function append_full_row(table_elem)
	return table_elem:tag("tr"):tag("th")
		:attr("colspan", "2")
end

local function append_header(frame, parent, text)
	local title = append_full_row(parent):wikitext(text)
		
	local args = frame.args
	local title_color = args.title_color
	local title_background = args.title_background
	
	if title_color then
		title:css("color", title_color)
	elseif title_background then
		title:css("background", title_background)
	end
	
	return title
end

local row_appenders = {
	title = function(...)
		append_header(...):addClass("infobox-title")
	end,
	section = function(...)
		append_header(...):addClass("infobox-header")
	end,
	image = function(frame, parent, file)
		append_full_row(parent)
			:addClass("infobox-image")
			:wikitext("[[File:{{{"..file.."}}}|300px]]")
	end,
	caption = function(frame, parent, text)
		append_full_row(parent)
			:addClass("infobox-caption")
			:wikitext(text)
	end,
	text = function(frame, parent, header, data)
		parent:tag("tr")
			:tag("th"):wikitext(header):done()
			:tag("td"):wikitext(data):done()
	end
}

local function append_row(frame, parent, row_type, ...)
	local appender = row_appenders[row_type]
	if appender == nil then
		return
	end
	return appender(frame, parent, ...)
end

infobox.show = function(frame)
	local args = frame:getParent().args
	local view = html.create("div"):addClass("infobox")
	local table_elem = view:tag("table")
	
	for i = 1, #args do
		view:tag("p"):wikitext(args[i])
		append_row(frame, table_elem, unpack(csv.parse_row(args[i])))
	end
	
	return view
end

return infobox