苡字五行属什么| 复查是什么意思| 晚上11点多是什么时辰| 负数是什么| 一什么| 五月二十六是什么星座| 全身出虚汗多是什么原因造成的| 鼻窦粘膜增厚什么意思| 贝果是什么| 氯雷他定片主治什么| 生肖本命带红花是什么生肖| 新生儿吐奶什么原因| 金黄金黄的什么填空| 海棠花的花语是什么| 为什么吃饱了就犯困| 为什么不能近亲结婚| 给孩子测骨龄应该挂什么科| 吃什么可以降胆固醇| 脸肿挂什么科| 睡美人叫什么名字| 郭德纲什么学历| 一垒二垒三垒全垒打是什么意思| 一个口一个且念什么字| 流产可以吃什么水果| 穿刺和活检有什么区别| 宝藏是什么意思| ubras是什么牌子| 磨盘有什么风水说法| 2024是什么年生肖| 指甲变紫色是什么原因| 冠心病吃什么药最有效| 脸上起红疙瘩是什么原因| 孕妇多吃什么食物好| 幽门螺杆菌是一种什么病| 粉瘤是什么| 吃什么下奶快下奶多| 抽血抽不出来是什么原因| 什么体质人容易长脚气| 舌头有黑点是什么原因| 黄钻有什么用| 吃什么减肥最好最快| 嘴唇一圈发黑是什么原因造成的| 扁桃体发炎能吃什么水果| 左卵巢囊性回声什么意思| cmv病毒是什么病毒| 258是什么意思| 微蛋白高是什么原因| 4月17是什么星座| 凭什么| 什么程度要做肾穿刺| 风油精有什么作用| 朱迅什么病| 胚胎和囊胚有什么区别| 重阳节干什么| 孔子是什么圣人| 不孕不育有什么症状| 刺梨有什么功效| 睡觉趴着睡什么原因| 脸部痤疮用什么药| 一元硬币是什么材质| 芒果有什么营养| 灼热是什么意思| 多囊是什么原因引起的| 坐骨神经痛挂什么科| 正局级什么级别| 多吃丝瓜有什么好处和坏处| 袁隆平是什么家| beyond什么意思| 牛逼是什么| 地瓜什么时候成熟| 白带异味是什么原因| 卜在姓氏里读什么| 嗯是什么意思| 入幕之宾是什么意思| 肝火大吃什么药| 猪油不凝固是什么原因| 阴道是什么意思| 双歧杆菌三联和四联有什么区别| 供奉观音菩萨有什么讲究| 黑色代表什么| 吃什么抑制食欲| 嗝什么意思| braf基因v600e突变是什么意思| 什么动物吃蛇| 金枝玉叶什么生肖| 煎中药用什么锅| c1和c2有什么区别| 脂蛋白高说明什么问题| 床上放什么可以驱蟑螂| 出虚恭是什么意思| 风疹病毒抗体阳性是什么意思| 思密达是什么意思| 献血前检查什么项目| 火眼是什么症状| 为什么会流黄鼻涕| 量贩式ktv什么意思| 物欲横流什么意思| 罗衣是什么意思| 罗姓男孩取什么名字好| 肚子胀气吃什么| 汆水是什么意思| 物欲横流什么意思| 6月23日是什么星座| 硬性要求是什么意思| 异麦芽酮糖醇是什么| 邓超什么星座的| 1942年属什么生肖属相| 荷塘月色是什么菜| 澈字五行属什么| 蓝脸的窦尔敦盗御马是什么歌| 雪茄为什么不过肺| 什么都想要| 黑眼圈是什么原因引起的| 吃什么能减脂肪肝| 这个季节吃什么水果最好| 屎黄色是什么颜色| 孕前检查一般有什么项目| 不什么好什么| 38年属什么生肖| 何许人也是什么意思| 条索灶是什么意思| 到底是什么| 牛河是什么| 什么肠小道成语| 张钧甯为什么读mi| 头昏是什么原因| 孩子爱啃指甲是什么原因| 什么地散步| 三点水山今读什么| 心脏造影是什么检查| 舌根放血有什么好处| 世界上最深的湖泊是什么| 纤维瘤是什么| 清热解毒是什么意思| 做妇科检查前需要注意什么| 心脏支架不能吃什么| 观音坐莲是什么姿势| 齐白石擅长画什么| mr什么意思| 土猪肉和普通猪肉有什么分别| 粉丝是什么做的| 甜叶菊有什么功效| 西施姓什么| 孩子脾虚内热大便干吃什么药| 畏手畏脚是什么意思| 什么样的智齿需要拔| 牙疼不能吃什么| 双皮奶是什么| 什么头什么节| 男性睾丸一边大一边小是什么原因| 罗纹布是什么面料| 梦见自己穿孝衣有什么征兆| 什么体质的人才有季经| 梦见狮子是什么预兆| 4.23是什么星座| 攻心翻是什么病| 梦见葡萄是什么意思| 天可以加什么偏旁| 一树梨花压海棠什么意思| 阴虚火旺是什么意思| 颜值控是什么意思| 小媳妇是什么意思| 原浆是什么意思| 红烧排骨用什么排骨比较好| 养殖什么赚钱| 洗内裤用什么洗比较好| 总是饿是什么原因| 醋栗是什么东西| bhpc是什么牌子| 爱恨就在一瞬间是什么歌| 胃烧灼感是什么原因引起的| 脚气缺什么维生素| 欧米茄算什么档次| 嘴唇为什么会变黑| 什么是三宝| 吃什么可以解决便秘| 什么是高嘌呤食物| 抽血能检查出什么| 很轴是什么意思| 女人鼻头有痣代表什么| 阴囊潮湿是什么原因| 平均红细胞体积偏高是什么原因| 观音菩萨成道日是什么意思| 927什么星座| 支数是什么意思| 梦到自己的妈妈死了是什么意思| 贤者模式是什么意思| 纠葛是什么意思| 一号来的月经排卵期是什么时候| 今年16岁属什么| 梦到吃花生是什么意思| 主加一笔是什么字| 小孩风寒感冒吃什么药| 梦见吃米饭是什么意思| 划扣是什么意思| 纯是什么意思| 男人要的归属感是什么| 血压低吃什么药| 多汗症是什么原因引起的| 痛风是什么原因造成的| 孕妇脚肿是什么原因引起的| 女攻是什么意思| 什么食物利尿| 桑黄是什么东西| 指甲花学名叫什么| 抽血前喝水有什么影响| 军五行属什么| 坐月子能吃什么蔬菜| 乐不思蜀是什么意思| 参片泡水喝有什么功效| 你叫什么名字英语怎么说| 金銮殿是什么意思| 优五行属性是什么| 霸王别姬是什么生肖| 吃什么解酒| 6点是什么时辰| 梦见撒尿是什么意思| 疟原虫是什么生物| 狐媚子是什么意思| 泉中水是什么生肖| 幽门螺旋杆菌吃什么药最好| 儿童急性肠胃炎吃什么药| 科学家是干什么的| 大腿两侧疼痛什么原因| 小孩肠胃感冒吃什么药比较好| 706代血浆又叫什么| 什么胆什么心| 惊世骇俗的意思是什么| 夏天用什么带饭不馊| 什么人不能吃韭菜| 小孩个子矮小吃什么促进生长发育| 512是什么星座| 旮旯是什么意思| 心跳加速心慌吃什么药| 做b超挂什么科| 高压高是什么原因| 为什么会感冒| 聤耳是什么意思| 人活着为了什么| 学子是什么意思| 什么动物不喝水| 宝宝嘴巴臭臭的是什么原因| 喝茶心慌的人什么体质| 早上6点半是什么时辰| 眩晕症吃什么药最好| 诅咒是什么意思| 为什么德牧不能打| 低脂牛奶适合什么人喝| 甲鱼和什么食物相克| 枝柯是什么意思| 口腔溃疡是缺什么维生素| 精神可嘉是什么意思| 手肿是什么病的前兆| pbr是什么意思| cmyk代表什么颜色| c13阳性是什么意思| 甘油三酯偏高说明什么| 拔罐拔出水泡是什么原因| 家人是什么意思| 三朵花代表什么意思| 梦到父母离婚是什么意思| 出家人是什么意思| 寄生虫长什么样子| 冬虫夏草为什么叫冬虫夏草| 百度Aller au contenu

68穨叭安ш盜规フ碔 腇╧щ戈

Z? Wikipedia
百度 这一次,微博热搜终于给了她应得的尊重!张女士不仅研究了得,还很风趣幽默,气度不凡!5分钟的演讲中出现了法语、英语、汉语、俄语、瑞典语,全程没有读稿子,也没有看小抄,节奏平稳,发音清晰,简短的发言赢得数次掌声,一举一动无不大方优雅。
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 = 'Hlist/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.

TODO: FINISH loading base templatestyles here rather than in
MediaWiki:Common.css. There are 4-5000 pages with 'raw' infobox tables.
See [[Mediawiki_talk:Common.css/to_do#Infobox]] and/or come help :).
When we do this we should clean up the inline CSS below too.
Will have to do some bizarre conversion category like with sidebar.

]=]
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
牛黄安宫丸什么季节吃 神助攻什么意思 欲盖弥彰是什么意思 脾切除后有什么影响 玫瑰花的花语是什么
排骨烧什么好吃 做梦抓鱼什么意思周公解梦 果丹皮是用什么做的 joan什么意思 民营企业和私营企业有什么区别
工匠精神的核心是什么 谷丙转氨酶什么意思 湖北人喜欢吃什么菜 rh阴性血是什么血型 维c什么时候吃效果最好
大量出汗是什么原因引起的 鲜黄花菜含有什么毒素 吃什么可以散结节 怀孕有什么感觉 但愿人长久的下一句是什么
心衰吃什么恢复的快hcv9jop5ns6r.cn 卤牛肉放什么调料wuhaiwuya.com lee是什么品牌wmyky.com 脉弦滑是什么意思hcv8jop2ns3r.cn 山竹里面黄黄的是什么hcv8jop4ns8r.cn
grace什么意思中文hcv8jop2ns2r.cn 疱疹在什么情况下传染hcv7jop4ns5r.cn 中国信仰什么教hcv9jop8ns0r.cn 玉越戴越亮是什么原因hcv9jop3ns1r.cn 人间四月芳菲尽的尽是什么意思hcv8jop8ns5r.cn
教师节送老师什么礼物最好hcv8jop5ns2r.cn 啐了一口是什么意思hcv8jop3ns3r.cn 咖色是什么颜色hanqikai.com 冬至说什么祝福语hcv7jop6ns3r.cn 做肠镜要挂什么科hcv9jop7ns0r.cn
下巴长闭口是什么原因hcv8jop0ns1r.cn 蚕豆病不能吃什么dajiketang.com 肠胃不好吃什么比较好hcv9jop4ns6r.cn 分水岭是什么意思hcv8jop5ns1r.cn supreme是什么牌子hcv7jop5ns1r.cn
百度