啤酒兑什么饮料好喝| 一六年属什么生肖| 越什么越什么的词语| 学士学位证书有什么用| 仕字五行属什么| 羊蛋是什么| 麻子是什么意思| 脱靶是什么意思| 梦见自己死了又活了是什么意思| 花中西施指的是什么花| 苦衷是什么意思| 老人家脚肿是什么原因引起的| 睡觉做梦是什么原因| 子宫内膜增厚是什么原因引起的| 11.24是什么星座| 地黄是什么| 泓字五行属什么| 夏天为什么不能喝中药| 外阴皮肤痒是什么原因| 一冷就咳嗽是什么原因| 什么叫方差| 天天吹空调有什么危害| 额头长痘痘是什么原因怎么调理| 矜贵是什么意思| 居酒屋是什么意思| 孕妇牙龈出血是什么原因| 兆后面的单位是什么| 脑供血不足吃什么中药| b型血为什么叫贵族血| 吡唑醚菌酯治什么病| 约稿是什么意思| 新白娘子传奇许仙为什么用女的演| 花非花雾非雾什么意思| 清肺吃什么好| 油烟机没有吸力是什么原因| 产奶速度慢是什么原因| 包皮炎用什么软膏| 肝火胃火旺盛吃什么药| 胃食管反流有什么症状| 有什么功效| 英文为什么怎么写| 急性扁桃体化脓是什么原因引起的| 什么是心律不齐| 北伐是什么意思| 人体电解质是什么| 大象是什么颜色| 子宫长什么样| 早搏是什么感觉| 微信拥抱表情什么意思| 普通的近义词是什么| 夜尿多是什么原因引起的| 你为什么| 罗马布是什么面料| 纪委是做什么的| 善什么甘什么| 贴膏药发热是什么原因| 老鼠为什么会飞| 头孢和阿莫西林有什么区别| 怀孕前三个月忌吃什么| 回族信奉什么教| 桑螵蛸是什么| 1941年是什么年| 梦见好多水果是什么预兆| r级电影是什么意思| 稀释是什么意思| 胶囊壳是什么原料做的| 表姐的孩子叫我什么| 心绞痛是什么症状| 脂蛋白a高吃什么药| 给男朋友买什么礼物比较好| 扁桃体发炎有什么症状| 一什么不什么四字成语| 头晃动是什么病的前兆| 男人梦见蛇是什么意思| 直采是什么意思| 边沿是什么意思| 为什么会得肾构错瘤| amount是什么意思| l代表什么单位| 攻击是什么意思| 为什么人会打喷嚏| b超检查前要注意什么| 看皮肤挂什么科| 月经三个月没来是什么原因| 信球什么意思| 牙龈发炎吃什么药| 福泽深厚什么意思| 补是什么偏旁| 股票洗盘是什么意思| 小孩老是发烧什么原因| 来月经适合吃什么水果| 籍贯是什么意思| 自信是什么意思| 最熟悉的陌生人是什么意思| wendy什么意思| 五花大绑是什么意思| 洋姜学名叫什么| 公鸡为什么会啄人| 猫拉稀吃什么药| 59岁属什么生肖| 炖大骨头放什么调料| 八月二号是什么星座| r是什么牌子衣服| 猫对什么颜色感兴趣| 长期便秘吃什么药| 骨髓水肿吃什么消炎药| 缺钙吃什么| 76年属什么的生肖| efw是胎儿的什么意思| 小孩睡觉磨牙是什么原因引起的| 中国最贵的烟是什么烟| 卵黄囊偏大是什么原因| 跳蚤的天敌是什么| jk制服什么意思| 给小孩买什么保险好| dpm值阳性什么意思| 猫为什么不怕蛇| 孔雀蓝配什么颜色好看| 黑色车牌是什么车| 什么冰淇淋最贵| 大便干燥一粒一粒的吃什么药| 红军为什么要长征| lt是什么意思| 经常腰疼是什么原因女| 上海松江有什么好玩的地方| 蜜蜡是什么材料| 滑膜疝是一种什么病| 安徒生被誉为什么| 什么手机最贵| 秉承是什么意思| 血脂异常什么意思| 孕妇吃蓝莓对胎儿有什么好处| 我们都没错只是不适合是什么歌| 胆红素高挂什么科检查| 精索是什么| 中国的八大菜系是什么| 肺大泡是什么病严重吗| 智齿发炎吃什么消炎药| 什么情况属于诈骗| 公鸡的尾巴有什么作用| 聪明如你什么意思| a4纸可以做什么手工| 推崇是什么意思| 水满则溢月盈则亏是什么意思| 新生儿吐奶是什么原因| 泰山石敢当什么意思| 彼岸花开是什么意思| 离苦得乐什么意思| 输卵管堵塞是什么原因| 亚甲减是什么意思| 心肌缺血吃什么中药| 涌泉穴在什么地方| 什么是亚健康| 促黄体生成素低说明什么| 糟卤是什么| 两特两重指的是什么| 吃鸡蛋有什么好处| 顾字五行属什么| 喝酒胃出血吃什么药| 睡觉打呼噜是什么病| 茶艺师是做什么的| 便秘吃什么快速通便| 怀孕十天左右有什么反应| blazer是什么意思啊| 属鼠五行属什么| 红霉素软膏有什么作用| 送什么生日礼物给妈妈| 疣吃什么药能治好| 黄鼻涕是什么类型的感冒| 妊娠状态是什么意思| 猴跟什么生肖相冲| papi是什么意思| 小孩子发烧抽搐是什么原因| 什锦菜是什么菜| 恐龙的祖先是什么| 感觉抑郁了去医院挂什么科| 手足口病是什么原因引起的| 痛风是什么地方痛| 锦衣夜行什么意思| 做美甲有什么危害| 经常流眼泪是什么原因| 怀孕为什么会流血| 尿频尿痛吃什么药| 狮子女喜欢什么样的男生| 澄面是什么面粉| 中焦不通用什么中成药| 延字五行属什么| 牙齿黄是什么原因造成的| 便秘是什么| 为什么叫夺命大乌苏| 男人阳气不足有什么症状| 咸鸭蛋为什么会出油| 什么车适合女生开| 日本豆腐是什么材料| 牝是什么意思| 骇人是什么意思| 胰腺不好有什么症状| 宫颈小有什么影响| 有机会是什么意思| 锁骨是什么骨| 电表走的快是什么原因| 生抽是什么| 2008属什么生肖| 什么茶可以减肥消脂| 血糖低怎么办吃什么补| 卦是什么意思| 一感冒就咳嗽是什么原因| 心病是什么病有哪些症状| 12月21是什么星座| 苑什么意思| 上眼皮肿是什么原因| 藏红花是什么| 大意失荆州是什么意思| 马来西亚主食吃什么| 姜子牙为什么没有封神| CAT是什么| 什么鱼没刺| shiraz是什么名字红酒| 脑梗什么不能吃| 籍贯填写什么| 徒木立信是什么意思| 看望病人买什么水果| 木梳子梳头有什么好处| 9月13日是什么纪念日| 青帝是什么意思| 圈名什么意思| 男人吃海参有什么好处| 人乳头瘤病毒是什么意思| 骨癌什么症状| 路上遇到蛇是什么征兆| 成都人民公园有什么好玩的| 第三代身份证什么时候开始办理| 为什么会腰疼| 奥司他韦是什么药| 什么是资本运作| 鸟死在家里是什么征兆| 喜欢一个人是什么感觉| 石敢当是什么意思| 孵化器公司是干什么的| 下焦湿热吃什么药| 口苦是什么毛病| 鸟加衣念什么| 鸡血藤有什么作用| a7是什么意思| 病假需要什么医院证明| 红眼病吃什么药| 张字五行属什么| 胃镜挂什么科| 喂母乳不能吃什么| 皮肤科挂什么科| 海燕是什么鸟| 吃什么精力旺盛有精神| 什么是海藻糖| 输尿管结石挂什么科| 路征和景甜什么关系| 张国荣什么时候去世的| 菊花代表什么生肖| 仙居杨梅什么时候上市| 蘸什么意思| 扁平息肉属于什么性质| 影子代表什么生肖| 今年贵庚是什么意思| 什么是痰湿体质| 一进去就射是什么原因| 百度Jump to content

国家级非遗浙江婺剧瑞士迎新春

Permanently protected module
From Meta, a Wikimedia project coordination wiki
Module documentation
百度 但通过记者的实地考察,发现日本农协与韩国农协在架构、运营和财务状况并不完全相同。

Implements {{Infobox}}.

Usage

{{#invoke:Infobox|infobox}}

local p = {}
local args = {}
local origArgs = {}
local root
local empty_row_categories = {}
local category_in_empty_row_pattern = '%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*]]'
local has_rows = false
local lists = {
	plainlist_t = {
		patterns = {
			'^plainlist$',
			'%splainlist$',
			'^plainlist%s',
			'%splainlist%s'
		},
		found = false,
		styles = 'Plainlist/styles.css'
	},
	hlist_t = {
		patterns = {
			'^hlist$',
			'%shlist$',
			'^hlist%s',
			'%shlist%s'
		},
		found = false,
		styles = 'Flatlist/styles.css'
	}
}

local function has_list_class(args_to_check)
	for _, list in pairs(lists) do
		if not list.found then
			for _, arg in pairs(args_to_check) do
				for _, pattern in ipairs(list.patterns) do
					if mw.ustring.find(arg or '', pattern) then
						list.found = true
						break
					end
				end
				if list.found then break end
			end
		end
	end
end

local function fixChildBoxes(sval, tt)
	local function notempty( s ) return s and s:match( '%S' ) end
	
	if notempty(sval) then
		local marker = '<span class=special_infobox_marker>'
		local s = sval
		-- start moving templatestyles and categories inside of table rows
		local slast = ''
		while slast ~= s do
			slast = s
			s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(%[%[%s*[Cc][Aa][Tt][Ee][Gg][Oo][Rr][Yy]%s*:[^]]*%]%])', '%2%1')
			s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>%s*)(\127[^\127]*UNIQ%-%-templatestyles%-%x+%-QINU[^\127]*\127)', '%2%1')
		end
		-- end moving templatestyles and categories inside of table rows
		s = mw.ustring.gsub(s, '(<%s*[Tt][Rr])', marker .. '%1')
		s = mw.ustring.gsub(s, '(</[Tt][Rr]%s*>)', '%1' .. marker)
		if s:match(marker) then
			s = mw.ustring.gsub(s, marker .. '%s*' .. marker, '')
			s = mw.ustring.gsub(s, '([\r\n]|-[^\r\n]*[\r\n])%s*' .. marker, '%1')
			s = mw.ustring.gsub(s, marker .. '%s*([\r\n]|-)', '%1')
			s = mw.ustring.gsub(s, '(</[Cc][Aa][Pp][Tt][Ii][Oo][Nn]%s*>%s*)' .. marker, '%1')
			s = mw.ustring.gsub(s, '(<%s*[Tt][Aa][Bb][Ll][Ee][^<>]*>%s*)' .. marker, '%1')
			s = mw.ustring.gsub(s, '^(%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
			s = mw.ustring.gsub(s, '([\r\n]%{|[^\r\n]*[\r\n]%s*)' .. marker, '%1')
			s = mw.ustring.gsub(s, marker .. '(%s*</[Tt][Aa][Bb][Ll][Ee]%s*>)', '%1')
			s = mw.ustring.gsub(s, marker .. '(%s*\n|%})', '%1')
		end
		if s:match(marker) then
			local subcells = mw.text.split(s, marker)
			s = ''
			for k = 1, #subcells do
				if k == 1 then
					s = s .. subcells[k] .. '</' .. tt .. '></tr>'
				elseif k == #subcells then
					local rowstyle = ' style="display:none"'
					if notempty(subcells[k]) then rowstyle = ''	end
					s = s .. '<tr' .. rowstyle ..'><' .. tt .. ' colspan=2>\n' ..
						subcells[k]
				elseif notempty(subcells[k]) then
					if (k % 2) == 0 then
						s = s .. subcells[k]
					else
						s = s .. '<tr><' .. tt .. ' colspan=2>\n' ..
							subcells[k] .. '</' .. tt .. '></tr>'
					end
				end
			end
		end
		-- the next two lines add a newline at the end of lists for the PHP parser
		-- [[Special:Diff/849054481]]
		-- remove when [[:phab:T191516]] is fixed or OBE
		s = mw.ustring.gsub(s, '([\r\n][%*#;:][^\r\n]*)$', '%1\n')
		s = mw.ustring.gsub(s, '^([%*#;:][^\r\n]*)$', '%1\n')
		s = mw.ustring.gsub(s, '^([%*#;:])', '\n%1')
		s = mw.ustring.gsub(s, '^(%{%|)', '\n%1')
		return s
	else
		return sval
	end
end

-- Cleans empty tables
local function cleanInfobox()
	root = tostring(root)
	if has_rows == false then
		root = mw.ustring.gsub(root, '<table[^<>]*>%s*</table>', '')
	end
end

-- Returns the union of the values of two tables, as a sequence.
local function union(t1, t2)

	local vals = {}
	for k, v in pairs(t1) do
		vals[v] = true
	end
	for k, v in pairs(t2) do
		vals[v] = true
	end
	local ret = {}
	for k, v in pairs(vals) do
		table.insert(ret, k)
	end
	return ret
end

-- Returns a table containing the numbers of the arguments that exist
-- for the specified prefix. For example, if the prefix was 'data', and
-- 'data1', 'data2', and 'data5' exist, it would return {1, 2, 5}.
local function getArgNums(prefix)
	local nums = {}
	for k, v in pairs(args) do
		local num = tostring(k):match('^' .. prefix .. '([1-9]%d*)$')
		if num then table.insert(nums, tonumber(num)) end
	end
	table.sort(nums)
	return nums
end

-- Adds a row to the infobox, with either a header cell
-- or a label/data cell combination.
local function addRow(rowArgs)
	
	if rowArgs.header and rowArgs.header ~= '_BLANK_' then
		has_rows = true
		has_list_class({ rowArgs.rowclass, rowArgs.class, args.headerclass })
		
		root
			:tag('tr')
				:addClass(rowArgs.rowclass)
				:cssText(rowArgs.rowstyle)
				:tag('th')
					:attr('colspan', '2')
					:addClass('infobox-header')
					:addClass(rowArgs.class)
					:addClass(args.headerclass)
					-- @deprecated next; target .infobox-<name> .infobox-header
					:cssText(args.headerstyle)
					:cssText(rowArgs.rowcellstyle)
					:wikitext(fixChildBoxes(rowArgs.header, 'th'))
		if rowArgs.data then
			root:wikitext(
				'[[Category:Pages using infobox templates with ignored data cells]]'
			)
		end
	elseif rowArgs.data and rowArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
		has_rows = true
		has_list_class({ rowArgs.rowclass, rowArgs.class })
		
		local row = root:tag('tr')
		row:addClass(rowArgs.rowclass)
		row:cssText(rowArgs.rowstyle)
		if rowArgs.label then
			row
				:tag('th')
					:attr('scope', 'row')
					:addClass('infobox-label')
					-- @deprecated next; target .infobox-<name> .infobox-label
					:cssText(args.labelstyle)
					:cssText(rowArgs.rowcellstyle)
					:wikitext(rowArgs.label)
					:done()
		end

		local dataCell = row:tag('td')
		dataCell
			:attr('colspan', not rowArgs.label and '2' or nil)
			:addClass(not rowArgs.label and 'infobox-full-data' or 'infobox-data')
			:addClass(rowArgs.class)
			-- @deprecated next; target .infobox-<name> .infobox(-full)-data
			:cssText(rowArgs.datastyle)
			:cssText(rowArgs.rowcellstyle)
			:wikitext(fixChildBoxes(rowArgs.data, 'td'))
	else
		table.insert(empty_row_categories, rowArgs.data or '')
	end
end

local function renderTitle()
	if not args.title then return end

	has_rows = true
	has_list_class({args.titleclass})
	
	root
		:tag('caption')
			:addClass('infobox-title')
			:addClass(args.titleclass)
			-- @deprecated next; target .infobox-<name> .infobox-title
			:cssText(args.titlestyle)
			:wikitext(args.title)
	
end

local function renderAboveRow()
	if not args.above then return end

	has_rows = true
	has_list_class({ args.aboveclass })
	
	root
		:tag('tr')
			:tag('th')
				:attr('colspan', '2')
				:addClass('infobox-above')
				:addClass(args.aboveclass)
				-- @deprecated next; target .infobox-<name> .infobox-above
				:cssText(args.abovestyle)
				:wikitext(fixChildBoxes(args.above,'th'))
end

local function renderBelowRow()
	if not args.below then return end

	has_rows = true
	has_list_class({ args.belowclass })
	
	root
		:tag('tr')
			:tag('td')
				:attr('colspan', '2')
				:addClass('infobox-below')
				:addClass(args.belowclass)
				-- @deprecated next; target .infobox-<name> .infobox-below
				:cssText(args.belowstyle)
				:wikitext(fixChildBoxes(args.below,'td'))
end

local function addSubheaderRow(subheaderArgs)
	if subheaderArgs.data and
		subheaderArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then
		has_rows = true
		has_list_class({ subheaderArgs.rowclass, subheaderArgs.class })
		
		local row = root:tag('tr')
		row:addClass(subheaderArgs.rowclass)

		local dataCell = row:tag('td')
		dataCell
			:attr('colspan', '2')
			:addClass('infobox-subheader')
			:addClass(subheaderArgs.class)
			:cssText(subheaderArgs.datastyle)
			:cssText(subheaderArgs.rowcellstyle)
			:wikitext(fixChildBoxes(subheaderArgs.data, 'td'))
	else
		table.insert(empty_row_categories, subheaderArgs.data or '')
	end
end

local function renderSubheaders()
	if args.subheader then
		args.subheader1 = args.subheader
	end
	if args.subheaderrowclass then
		args.subheaderrowclass1 = args.subheaderrowclass
	end
	local subheadernums = getArgNums('subheader')
	for k, num in ipairs(subheadernums) do
		addSubheaderRow({
			data = args['subheader' .. tostring(num)],
			-- @deprecated next; target .infobox-<name> .infobox-subheader
			datastyle = args.subheaderstyle,
			rowcellstyle = args['subheaderstyle' .. tostring(num)],
			class = args.subheaderclass,
			rowclass = args['subheaderrowclass' .. tostring(num)]
		})
	end
end

local function addImageRow(imageArgs)

	if imageArgs.data and
		imageArgs.data:gsub(category_in_empty_row_pattern, ''):match('^%S') then

		has_rows = true
		has_list_class({ imageArgs.rowclass, imageArgs.class })
		
		local row = root:tag('tr')
		row:addClass(imageArgs.rowclass)

		local dataCell = row:tag('td')
		dataCell
			:attr('colspan', '2')
			:addClass('infobox-image')
			:addClass(imageArgs.class)
			:cssText(imageArgs.datastyle)
			:wikitext(fixChildBoxes(imageArgs.data, 'td'))
	else
		table.insert(empty_row_categories, imageArgs.data or '')
	end
end

local function renderImages()
	if args.image then
		args.image1 = args.image
	end
	if args.caption then
		args.caption1 = args.caption
	end
	local imagenums = getArgNums('image')
	for k, num in ipairs(imagenums) do
		local caption = args['caption' .. tostring(num)]
		local data = mw.html.create():wikitext(args['image' .. tostring(num)])
		if caption then
			data
				:tag('div')
					:addClass('infobox-caption')
					-- @deprecated next; target .infobox-<name> .infobox-caption
					:cssText(args.captionstyle)
					:wikitext(caption)
		end
		addImageRow({
			data = tostring(data),
			-- @deprecated next; target .infobox-<name> .infobox-image
			datastyle = args.imagestyle,
			class = args.imageclass,
			rowclass = args['imagerowclass' .. tostring(num)]
		})
	end
end

-- When autoheaders are turned on, preprocesses the rows
local function preprocessRows()
	if not args.autoheaders then return end
	
	local rownums = union(getArgNums('header'), getArgNums('data'))
	table.sort(rownums)
	local lastheader
	for k, num in ipairs(rownums) do
		if args['header' .. tostring(num)] then
			if lastheader then
				args['header' .. tostring(lastheader)] = nil
			end
			lastheader = num
		elseif args['data' .. tostring(num)] and
			args['data' .. tostring(num)]:gsub(
				category_in_empty_row_pattern, ''
			):match('^%S') then
			local data = args['data' .. tostring(num)]
			if data:gsub(category_in_empty_row_pattern, ''):match('%S') then
				lastheader = nil
			end
		end
	end
	if lastheader then
		args['header' .. tostring(lastheader)] = nil
	end
end

-- Gets the union of the header and data argument numbers,
-- and renders them all in order
local function renderRows()

	local rownums = union(getArgNums('header'), getArgNums('data'))
	table.sort(rownums)
	for k, num in ipairs(rownums) do
		addRow({
			header = args['header' .. tostring(num)],
			label = args['label' .. tostring(num)],
			data = args['data' .. tostring(num)],
			datastyle = args.datastyle,
			class = args['class' .. tostring(num)],
			rowclass = args['rowclass' .. tostring(num)],
			-- @deprecated next; target .infobox-<name> rowclass
			rowstyle = args['rowstyle' .. tostring(num)],
			rowcellstyle = args['rowcellstyle' .. tostring(num)]
		})
	end
end

local function renderNavBar()
	if not args.name then return end

	has_rows = true
	root
		:tag('tr')
			:tag('td')
				:attr('colspan', '2')
				:addClass('infobox-navbar')
				:wikitext(require('Module:Navbar')._navbar{
					args.name,
					mini = 1,
				})
end

local function renderItalicTitle()
	local italicTitle = args['italic title'] and mw.ustring.lower(args['italic title'])
	if italicTitle == '' or italicTitle == 'force' or italicTitle == 'yes' then
		root:wikitext(require('Module:Italic title')._main({}))
	end
end

-- Categories in otherwise empty rows are collected in empty_row_categories.
-- This function adds them to the module output. It is not affected by
-- args.decat because this module should not prevent module-external categories
-- from rendering.
local function renderEmptyRowCategories()
	for _, s in ipairs(empty_row_categories) do
		root:wikitext(s)
	end
end

-- Render tracking categories. args.decat == turns off tracking categories.
local function renderTrackingCategories()
	if args.decat == 'yes' then return end
	if args.child == 'yes' then
		if args.title then
			root:wikitext(
				'[[Category:Pages using embedded infobox templates with the title parameter]]'
			)
		end
	elseif #(getArgNums('data')) == 0 and mw.title.getCurrentTitle().namespace == 0 then
		root:wikitext('[[Category:Articles using infobox templates with no data rows]]')
	end
end

--[=[
Loads the templatestyles for the infobox.

]=]
local function loadTemplateStyles()
	local frame = mw.getCurrentFrame()
	
	local hlist_templatestyles = ''
	if lists.hlist_t.found then
		hlist_templatestyles = frame:extensionTag{
			name = 'templatestyles', args = { src = lists.hlist_t.styles }
		}
	end
	
	local plainlist_templatestyles = ''
	if lists.plainlist_t.found then
		plainlist_templatestyles = frame:extensionTag{
			name = 'templatestyles', args = { src = lists.plainlist_t.styles }
		}
	end
	
	-- See function description
	local base_templatestyles = frame:extensionTag{
		name = 'templatestyles', args = { src = 'Module:Infobox/styles.css' }
	}

	local templatestyles = ''
	if args['templatestyles'] then
		templatestyles = frame:extensionTag{
			name = 'templatestyles', args = { src = args['templatestyles'] }
		}
	end
	
	local child_templatestyles = ''
	if args['child templatestyles'] then
		child_templatestyles = frame:extensionTag{
			name = 'templatestyles', args = { src = args['child templatestyles'] }
		}
	end
	
	local grandchild_templatestyles = ''
	if args['grandchild templatestyles'] then
		grandchild_templatestyles = frame:extensionTag{
			name = 'templatestyles', args = { src = args['grandchild templatestyles'] }
		}
	end
	
	return table.concat({
		-- hlist -> plainlist -> base is best-effort to preserve old Common.css ordering.
		-- this ordering is not a guarantee because the rows of interest invoking
		-- each class may not be on a specific page
		hlist_templatestyles,
		plainlist_templatestyles,
		base_templatestyles,
		templatestyles,
		child_templatestyles,
		grandchild_templatestyles
	})
end

-- common functions between the child and non child cases
local function structure_infobox_common()
	renderSubheaders()
	renderImages()
	preprocessRows()
	renderRows()
	renderBelowRow()
	renderNavBar()
	renderItalicTitle()
	renderEmptyRowCategories()
	renderTrackingCategories()
	cleanInfobox()
end

-- Specify the overall layout of the infobox, with special settings if the
-- infobox is used as a 'child' inside another infobox.
local function _infobox()
	if args.child ~= 'yes' then
		root = mw.html.create('table')

		root
			:addClass(args.subbox == 'yes' and 'infobox-subbox' or 'infobox')
			:addClass(args.bodyclass)
			-- @deprecated next; target .infobox-<name>
			:cssText(args.bodystyle)
		
		has_list_class({ args.bodyclass })

		renderTitle()
		renderAboveRow()
	else
		root = mw.html.create()

		root
			:wikitext(args.title)
	end
	structure_infobox_common()
	
	return loadTemplateStyles() .. root
end

-- If the argument exists and isn't blank, add it to the argument table.
-- Blank arguments are treated as nil to match the behaviour of ParserFunctions.
local function preprocessSingleArg(argName)
	if origArgs[argName] and origArgs[argName] ~= '' then
		args[argName] = origArgs[argName]
	end
end

-- Assign the parameters with the given prefixes to the args table, in order, in
-- batches of the step size specified. This is to prevent references etc. from
-- appearing in the wrong order. The prefixTable should be an array containing
-- tables, each of which has two possible fields, a "prefix" string and a
-- "depend" table. The function always parses parameters containing the "prefix"
-- string, but only parses parameters in the "depend" table if the prefix
-- parameter is present and non-blank.
local function preprocessArgs(prefixTable, step)
	if type(prefixTable) ~= 'table' then
		error("Non-table value detected for the prefix table", 2)
	end
	if type(step) ~= 'number' then
		error("Invalid step value detected", 2)
	end

	-- Get arguments without a number suffix, and check for bad input.
	for i,v in ipairs(prefixTable) do
		if type(v) ~= 'table' or type(v.prefix) ~= "string" or
			(v.depend and type(v.depend) ~= 'table') then
			error('Invalid input detected to preprocessArgs prefix table', 2)
		end
		preprocessSingleArg(v.prefix)
		-- Only parse the depend parameter if the prefix parameter is present
		-- and not blank.
		if args[v.prefix] and v.depend then
			for j, dependValue in ipairs(v.depend) do
				if type(dependValue) ~= 'string' then
					error('Invalid "depend" parameter value detected in preprocessArgs')
				end
				preprocessSingleArg(dependValue)
			end
		end
	end

	-- Get arguments with number suffixes.
	local a = 1 -- Counter variable.
	local moreArgumentsExist = true
	while moreArgumentsExist == true do
		moreArgumentsExist = false
		for i = a, a + step - 1 do
			for j,v in ipairs(prefixTable) do
				local prefixArgName = v.prefix .. tostring(i)
				if origArgs[prefixArgName] then
					-- Do another loop if any arguments are found, even blank ones.
					moreArgumentsExist = true
					preprocessSingleArg(prefixArgName)
				end
				-- Process the depend table if the prefix argument is present
				-- and not blank, or we are processing "prefix1" and "prefix" is
				-- present and not blank, and if the depend table is present.
				if v.depend and (args[prefixArgName] or (i == 1 and args[v.prefix])) then
					for j,dependValue in ipairs(v.depend) do
						local dependArgName = dependValue .. tostring(i)
						preprocessSingleArg(dependArgName)
					end
				end
			end
		end
		a = a + step
	end
end

-- Parse the data parameters in the same order that the old {{infobox}} did, so
-- that references etc. will display in the expected places. Parameters that
-- depend on another parameter are only processed if that parameter is present,
-- to avoid phantom references appearing in article reference lists.
local function parseDataParameters()

	preprocessSingleArg('autoheaders')
	preprocessSingleArg('child')
	preprocessSingleArg('bodyclass')
	preprocessSingleArg('subbox')
	preprocessSingleArg('bodystyle')
	preprocessSingleArg('title')
	preprocessSingleArg('titleclass')
	preprocessSingleArg('titlestyle')
	preprocessSingleArg('above')
	preprocessSingleArg('aboveclass')
	preprocessSingleArg('abovestyle')
	preprocessArgs({
		{prefix = 'subheader', depend = {'subheaderstyle', 'subheaderrowclass'}}
	}, 10)
	preprocessSingleArg('subheaderstyle')
	preprocessSingleArg('subheaderclass')
	preprocessArgs({
		{prefix = 'image', depend = {'caption', 'imagerowclass'}}
	}, 10)
	preprocessSingleArg('captionstyle')
	preprocessSingleArg('imagestyle')
	preprocessSingleArg('imageclass')
	preprocessArgs({
		{prefix = 'header'},
		{prefix = 'data', depend = {'label'}},
		{prefix = 'rowclass'},
		{prefix = 'rowstyle'},
		{prefix = 'rowcellstyle'},
		{prefix = 'class'}
	}, 50)
	preprocessSingleArg('headerclass')
	preprocessSingleArg('headerstyle')
	preprocessSingleArg('labelstyle')
	preprocessSingleArg('datastyle')
	preprocessSingleArg('below')
	preprocessSingleArg('belowclass')
	preprocessSingleArg('belowstyle')
	preprocessSingleArg('name')
	-- different behaviour for italics if blank or absent
	args['italic title'] = origArgs['italic title']
	preprocessSingleArg('decat')
	preprocessSingleArg('templatestyles')
	preprocessSingleArg('child templatestyles')
	preprocessSingleArg('grandchild templatestyles')
end

-- If called via #invoke, use the args passed into the invoking template.
-- Otherwise, for testing purposes, assume args are being passed directly in.
function p.infobox(frame)
	if frame == mw.getCurrentFrame() then
		origArgs = frame:getParent().args
	else
		origArgs = frame
	end
	
	parseDataParameters()
	
	return _infobox()
end

-- For calling via #invoke within a template
function p.infoboxTemplate(frame)
	origArgs = {}
	for k,v in pairs(frame.args) do origArgs[k] = mw.text.trim(v) end
	
	parseDataParameters()
	
	return _infobox()
end
return p
电饭煲煮粥为什么会溢出来 盆腔少量积液是什么问题 oct是什么意思 老放屁什么原因 西瓜不可以和什么同食
吃饭掉筷子有什么预兆 香兰素是什么东西 脑供血不足用什么药效果最好 仓鼠吃什么食物最好 coa是什么
猫的胡须是干什么用的 rhd阳性是什么意思 女人右下巴有痣代表什么 什么啤酒最好喝 清宫和刮宫有什么区别
身体发冷是什么原因 灯红酒绿是什么意思 并蒂是什么意思 五行缺什么怎么查询 冒汗是什么原因
过堂是什么意思naasee.com pe是什么意思hcv8jop1ns8r.cn 宝宝风寒感冒吃什么药最好hcv8jop8ns7r.cn 开普拉多的都是什么人hcv8jop1ns3r.cn 铅是什么hcv7jop7ns0r.cn
女生没有腋毛代表什么hcv8jop4ns1r.cn 痣发痒是什么原因hcv9jop2ns5r.cn 药流后需要注意什么inbungee.com 心情烦躁吃什么药hcv9jop6ns5r.cn 吃了避孕药有什么副作用hcv9jop8ns3r.cn
11月份什么星座hcv8jop1ns1r.cn 种小麦用什么肥料好hcv9jop0ns3r.cn 金牛座属于什么象星座hcv8jop7ns1r.cn 低压偏高是什么原因hcv9jop1ns1r.cn 山竹为什么这么贵imcecn.com
皮蛋吃多了有什么危害hcv9jop4ns7r.cn 越什么越什么的词语hcv9jop0ns7r.cn 背叛什么意思hcv8jop3ns2r.cn 女人卵巢保养吃什么好hcv7jop5ns3r.cn 身高别体重是什么意思hcv8jop2ns4r.cn
百度