陈皮有什么功效| 为什么月经一次比一次提前| 肝占位是什么意思| 肾虚会导致什么| 5月14日什么星座| 喉咙肿痛吃什么药好| 摩拳擦掌是什么意思| 宫崎骏是什么意思| 根管治疗是什么意思| 女生安全期是什么时候| 周杰伦属什么| 五月十四号是什么情人节| 近视手术有什么后遗症| 火龙果有什么功效| 拉肚子看什么科| 尾巴长长的是什么鸟| 什么发育成种皮| 来月经适合吃什么水果| 6月11日是什么星座| 查输卵管是否堵塞要做什么检查| 牛皮癣用什么药| 什么样的女人最吸引男人| 沉甸甸的爱是什么意思| 降血糖吃什么药| 求人办事送什么礼物好| 政治家是什么意思| 农历六月十九是什么星座| 陪伴是最长情的告白下一句是什么| 皮蛋吃了有什么好处和坏处| 甲木代表什么| 9月3日是什么星座的| 淋球菌培养是检查什么| 逍遥丸是治什么的| 泡面吃多了有什么危害| 大林木是什么数字| 酸梅汤不适合什么人喝| 丑什么意思| 除体内湿热最好的中成药是什么| 姜对头发有什么作用| 减肥为什么不让吃茄子| 欲钱看正月初一是什么生肖| 民间故事有什么| 纸可以折什么| 星标朋友是什么意思| 肝介入治疗是什么意思| 血脂高适合吃什么食物| 一只眼睛充血是什么原因| 拔完罐需要注意什么| 字字珠玑是什么意思| 喝小分子肽有什么好处| becky是什么意思| 人为什么会做梦科学解释| 每天尿都是黄的是什么原因| 四季春茶属于什么茶| 梗米是什么米| 2024属什么生肖| a型血rh阳性是什么意思| 唐山大地震是什么时候| 大脸适合什么发型| 心脏疼挂什么科| 感冒低烧是什么原因| 81年五行属什么| 广州地铁什么时候停运| 景泰蓝是什么| 胆脂瘤是什么病| 瘦西湖为什么叫瘦西湖| 申酉是什么时间| 藕不能和什么一起吃| 低烧吃什么药最好| 食管反流用什么药| 拉肚子喝什么饮料| 脚底痛挂什么科| 什么时候吃饺子| 小孩晚上睡觉流口水是什么原因| 宫颈锥切术是什么意思| 凝字五行属什么| 石加乏念什么| 处女座男和什么星座最配| 住院预交金是什么意思| 猛虎下山是什么生肖| 20岁属什么| 怙恃是什么意思| 什么是结膜炎| 福兮祸兮是什么意思| 霉菌性阴道炎是什么原因引起的| 小孩风寒感冒吃什么药| 女生不来大姨妈是什么原因| 羊齿状结晶代表什么| 三个女是什么字| 小孩肺炎吃什么药| 尿液特别黄是什么原因引起的| 今夕何夕什么意思| 229什么星座| 艾草治什么病| 钾在人体中起什么作用| 2005属什么生肖| 低gi什么意思| 雌雄是什么意思| 为什么不来大姨妈也没有怀孕| 什么蔬菜是温性的| 清高是什么意思| hr过高是什么意思| 胰岛素高是什么原因| 什么药治肝最好最安全| 鼻子两侧挤出来的白色东西是什么| 人生于世上有几个知己是什么歌| 偏执什么意思| 1111是什么意思| 五字五行属什么| 梦见朋友是什么意思| 看灰指甲挂什么科| 血小板压积偏高是什么原因| 什么充电宝可以带上飞机| 混子是什么意思| 跳蚤什么样| 什么是单核细胞百分比| 出生证编号是什么| maybach是什么车| 被老鼠咬了打什么疫苗| 梦到下雪是什么征兆| 退役是什么意思| 扯证是什么意思| 心猿意马是什么意思| 腹部b超能检查什么| 生殖器疱疹用什么药最好| 支原体吃什么药最有效| 打牌老是输是什么原因| 拿手机手抖是什么原因| 嗓子疼吃什么药见效最快| 起死回生是什么意思| 梦见蟒蛇是什么意思| 口腔溃疡用什么药最好| 兑水是什么意思| 为什么一吃完饭就肚子疼| 脚臭用什么洗效果最好| 梦见照相是什么意思| 隔离霜和粉底液有什么区别| 玉髓是什么玉| 拔气罐有什么好处| 客家人是什么意思| 双肺多发结节是什么意思| 属蛇女和什么属相最配| 结售汇是什么意思| 放的屁很臭是什么原因| 梦见小兔子是什么意思| 刮痧有什么好处| 保底和底薪有什么区别| 头发爱出油什么原因| 乳腺增生结节吃什么药效果好| 经常喝红茶有什么好处和坏处吗| 1884年属什么生肖| 农历七月十五是什么节| 散瞳后需要注意什么| 1969年是什么年| 眉毛上长痣代表什么| 吃什么生血| 皮肤黄的人适合穿什么颜色的衣服| 潸然泪下是什么意思| 银色的什么| 麻婆豆腐是什么菜系| 男性孕前检查挂什么科| 植树节什么时候| 单身领养孩子需要什么条件| 好奇害死猫什么意思| 猪横脷是什么| 下午六点半是什么时辰| 新生儿不睡觉是什么原因| 胃火吃什么中成药| 属牛幸运色是什么颜色| 霉菌性阴道炎用什么药| 产前诊断是检查什么| 检查前列腺需要做什么检查| 子宫在肚脐眼什么位置| 小便频繁是什么原因| 15天来一次月经是什么原因| 什么是车震| 绿茶男是什么意思| 汤姆福特属于什么档次| 彩虹像什么挂在天空| 9999是什么意思| 血管造影检查什么| 梦见别人家办丧事是什么意思| 胰腺癌晚期什么症状| 清宫是什么意思| 毫无保留什么意思| 369是什么意思啊| 敌敌畏中毒用什么洗胃| 三个小是什么字| 一朝一夕是什么意思| 鎏是什么意思| 猫有什么病会传染给人| 怎么判断自己什么脸型| 取痣用什么方法最好| 涉嫌是什么意思| 夜猫子是什么意思| 尿是红色的是什么原因| 周杰伦的粉丝叫什么| 什么的山野| 为什么会得扁平疣| 先算什么再算什么| 葫芦的寓意是什么| r代表什么意思| 6月30日是什么节日| 什么是扁平疣图片| 断桥是什么意思| 老花眼是什么原因引起的| 鬼压床是什么原因| 大禹的爸爸叫什么| 梦到熊是什么意思| 北京佑安医院擅长什么| 晴水翡翠属于什么档次| 224是什么星座| facebook是什么意思| 老是想睡觉是什么原因| 金先读什么| 里正是什么官| 女人吃什么能增加雌激素| 碘酸钾是什么| 征字五行属什么| 安利什么意思| 烧心胃酸吃什么药| 沙门氏菌是什么| 乳腺靶向检查是什么| 血糖高的人吃什么主食| 脚气真菌最怕什么| 梦魇是什么意思| 学考是什么| 大拇指抖动是什么原因引起的| 边度什么意思| 宫颈ecc是什么意思| 戒烟吃什么药| 我不知道你在说什么英文| 甲胎蛋白偏高说明什么| 5月25日是什么星座| 什么是鳞状细胞| 鹦鹉能吃什么水果| 血液粘稠吃什么药| 梦见李子是什么意思| 小什么| 网织红细胞高说明什么| 人的肝脏在什么位置| 东南五行属什么| 属虎男和什么属相最配| 荡秋千有什么好处| 蟑螂讨厌什么味道| 吃什么容易长高| 捡肥皂什么意思| 塑造是什么意思| 朱元璋为什么不杀朱棣| 同房干涩什么原因导致的| 流理台是什么| 血糖高什么东西不能吃| 梦见牙齿掉了是什么征兆| low什么意思| hyper是什么意思| 提肛有什么好处| 什么字五行属金| 油性皮肤适合用什么护肤品| 婴儿蓝是什么颜色| 降钙素原偏高说明什么| 什么药补肾壮阳| 神母是什么病| 乏了是什么意思| fr是什么| 百度Jump to content

河南省第12届中国—东盟博览会招商引资项目

Bisangiddwa ku Wikipedia
百度 除赵雷、岑宁儿、Ty.此外,天府好耍音乐节创新之处还在于它注重本土挖掘与重点孵化相结合,覆盖有自贡、内江、泸州、宜宾、南充、达州、广安、雅安、金堂等全川东南西北各城市,首站落地川南自贡,将吸引自贡及内江、泸州、宜宾等城市优秀音乐人及乐队,成为四川全省首个覆盖面最广的大型音乐孵化挖掘平台,体现出四川音乐的味道。

Documentation for this module may be created at Module:Infobox/doc

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
宫外孕有什么危害 杭州市市长什么级别 dhc是什么 碘伏用什么可以洗掉 脸部过敏红痒抹什么药
梦见好多猪肉是什么意思 茹毛饮血什么意思 什么的陪伴 钾是什么东西 彩霞是什么意思
狗狗气喘吃什么药 酪朊酸钠是什么 幽门螺旋杆菌吃什么药最好 自行是什么意思 文定之喜是什么意思
撒尿分叉是什么原因 卡卡西是什么意思 对什么有好处 7.2号是什么星座 黑马比喻什么样的人
陈赫的老婆叫什么名字hcv9jop1ns5r.cn 平行班是什么意思hcv8jop0ns6r.cn 毫无违和感是什么意思helloaicloud.com 偏光镜是什么意思hcv9jop4ns7r.cn 鼻屎多是什么原因hkuteam.com
连长相当于地方什么官hcv9jop6ns5r.cn 做妇科检查前需要注意什么hcv7jop7ns1r.cn 喉咙痛可以吃什么水果hcv9jop5ns0r.cn 男人的魅力是什么hcv9jop3ns2r.cn 物理压榨油是什么意思jasonfriends.com
膝关节疼痛吃什么药好hcv8jop0ns9r.cn 白色情人节什么意思96micro.com 眼皮发肿是什么原因naasee.com 双瞳电影到底讲了什么hcv9jop0ns7r.cn 27虚岁属什么生肖travellingsim.com
耵聍栓塞是什么意思hcv7jop6ns3r.cn 北京大学什么专业最好hcv8jop0ns9r.cn 炖牛肉放什么料hcv8jop3ns9r.cn 什么是电汇xinmaowt.com 什么除湿气效果最好hcv8jop2ns0r.cn
百度