孩子经常流鼻血是什么原因| 肠炎吃什么药好| qp是什么牌子| delsey是什么牌子| 血糖的单位是什么| 脸上长小疙瘩是什么原因| 羹是什么意思| 肺热会引起什么症状| 谨遵医嘱是什么意思| 吃什么最补胶原蛋白| 女性肛门瘙痒用什么药| 医保断了一个月有什么影响| 侯亮平是什么级别| 胃疼喝什么可以缓解| 米娜桑是什么意思| 空腹血糖受损是什么意思| 空调有异味是什么原因| 很轴是什么意思| 印度尼西亚是什么人种| 局长是什么级别干部| 武昌鱼是什么鱼| 辛未日五行属什么| 棉花糖是什么做的| tct检查什么项目| 念叨是什么意思| 臭虫长什么样| 吃什么能升血小板| 骨密度是检查什么的| 丹凤朝阳什么意思| 射手座女和什么星座最配| 女生的小鸡鸡长什么样| 尿培养能查出什么病| 清热败火的败是什么意思| 女人为什么要穿高跟鞋| 神经衰弱吃什么药最好| 5月31号什么星座| 六七是什么意思| 先算什么再算什么| 鱼鳞云代表什么天气| 我国四大发明是什么| 做肠镜要挂什么科| 什么是肩袖损伤| 心颤吃什么药效果好| 玉皇大帝的老婆叫什么| 尖嘴鱼叫什么鱼| 负罪感什么意思| 热伤风是什么意思| 爱有什么用| tab是什么意思| 10月份是什么星座的| 引体向上有什么好处| 农历十月初五是什么星座| 乳头痛是什么原因| 科技布是什么材质| 开封有什么大学| 办护照照片有什么要求| 上嘴唇发白是因为什么原因| 红色加绿色是什么颜色| 猫摇尾巴是什么意思| 为什么越睡越困越疲惫| 感冒吃什么好得快| 什么样的秋天| 百年好合是什么意思| 避孕套长什么样| 什么样的血管瘤不用治| 不超过是什么意思| 罡什么意思| 芭蕉和香蕉有什么区别| 6月份是什么星座的| 胃胀胃疼吃什么药| 铅是什么颜色| 尺寸是什么意思| 浅笑安然是什么意思| 换手率什么意思| 刮痧不出痧是什么原因| 皮赘是什么| 绝什么意思| 解构是什么意思| 子宫收缩是什么感觉| 打玻尿酸有什么副作用吗| 酸是什么| 遇难呈祥是什么生肖| 什么书什么画| 点了斑不能吃什么| 兰姓是什么民族| 1975年属兔五行属什么| 26度穿什么衣服合适| 子婴是秦始皇什么人| 花肠是母猪的什么部位| 阑尾炎可以吃什么水果| 身体多病戴什么首饰| 一九八七年属什么生肖| 百事可乐和可口可乐有什么区别| 默契什么意思| 脸长的人适合什么发型| 喝水都长肉是什么原因| 女人脸肿是什么原因引起的| 气性坏疽是什么病| 腿脚酸软无力是什么原因| h是什么元素| 一直流鼻血是什么原因| 什么叫慢性萎缩性胃炎| 火龙果有什么营养| 牛油果是什么味道| 人五人六是什么意思| 汗是什么味道| 出汗有异味是什么原因| 双规什么意思| 七月十三日是什么日子| 6月22是什么星座| 什么东西补精子最快| 龙和什么属相相克| 6月29日是什么星座| 心脏支架和搭桥有什么区别| 懦弱的近义词是什么| 蟹爪兰什么时候开花| 大秀是什么意思| 改良剂是什么| 置之死地而后生是什么意思| 回族女人为什么戴头巾| 刻舟求剑的寓意是什么| 孕妇吃菠萝对胎儿有什么好处| 亚甲炎是什么原因引起的| plover是什么牌子| 下身灼热感什么原因| 月经突然停止是什么原因| 害怕的近义词是什么| 袋鼠属于什么类动物| 下降头是什么意思| 父母什么血型会溶血| 洛基是什么神| 欺骗餐是什么意思| 什么香什么鼻| cm什么单位| 吃韭菜有什么好处和坏处| 缺碘有什么症状| 一月出生是什么星座| 甲状腺炎是什么引起的| 寒门子弟是什么意思| 小苏打和食用碱有什么区别| rm是什么币| 脾肾两虚吃什么中成药最好| 中指和无名指一样长代表什么| siv是什么意思| 什么东东| 去香港澳门需要什么证件| 脖子痛挂什么科| 八月一日是什么日子| 男方派去接亲要说什么| 每天尿都是黄的是什么原因| 胆红素偏高是什么原因| 贡眉是什么茶| bmg是什么意思| 头疼什么原因| 1月21是什么星座| 酒后第二天吃什么| 婀娜多姿是什么意思| 子宫内膜病变有什么症状| 血糖低吃什么补得最快| 月经提前十天是什么原因| 吃完饭就拉肚子是什么原因| 干咳嗽喉咙痒是什么原因| 两毛四是什么军衔| hpv52阳性是什么病| 硌得慌是什么意思| 猪下水是什么| 溃疡是什么| 小腹胀痛男性什么原因| 祸害是什么意思| 晚上吃什么有助于睡眠| met什么意思| 指甲起层是什么原因| 9月是什么星座| p是什么意思啊| 癞蛤蟆长什么样| 菊花有什么颜色| 浙江有什么旅游景点| 装孙子是什么意思| 入珠是什么意思| 胡说八道是什么意思| 去势是什么意思| 什么草药能治肿瘤| 头发的主要成分是什么| 心脏不舒服有什么症状| notice是什么意思| 经常干呕是什么原因| 蝉的鸣叫声像什么| 囊肿是什么东西| 望穿秋水的意思是什么| 周公解梦掉牙齿意味着什么| 三月份是什么星座| 分拣员是做什么的| 什么叫体制内| 你什么都没看见| 背疼是什么原因| 怀不上孕是什么原因造成的| 备孕吃什么好| 稀饭配什么菜好吃| 鲁冰花是什么花| 宝宝咳嗽流鼻涕吃什么药| 什么是扁桃体| 晕车药吃多了有什么副作用| 藏语扎西德勒是什么意思| 开小差是什么意思| 宫腔镜检查后需要注意什么| 二级产前超声检查是什么| 未免是什么意思| 为什么老是出汗| 妨夫痣是什么意思| 待字闺中是什么意思| 阑尾炎挂什么科室| 说女人强势是什么意思| 子宫糜烂用什么药| 夏天可以做什么| 做试管前需要检查什么项目| 蛇蛋长什么样子| 脚上长水泡是什么原因| 流浓黄鼻涕是什么原因| 阿魏酸是什么| 为什么总是想吐| 破瓜年华是什么意思| 96166是什么电话| 上海是什么省| 移动迷宫到底讲的什么| 梦见黑蛇是什么意思| 离子四项是检查什么的| 伏特加是什么| 标本是什么意思| 澈字五行属什么| 梦见穿裤子是什么意思| 什么蛇可以吃| 五海瘿瘤丸主要治什么病| 澳门有什么特产| 82年属狗是什么命| 弛张热常见于什么病| 内分泌科看什么| 乙肝125阳性是什么意思| 治疗舌苔白厚用什么药| 手术后吃什么恢复快| 什么叫放疗| 体温低是什么原因| 黄墙绿地的作用是什么| 醋酸视黄酯是什么| 腰椎间盘突出看什么科| 一树梨花压海棠什么意思| 6月6日什么星座| 孕妇吃蓝莓对胎儿有什么好处| 癫痫病是什么症状| 蔬菜用什么肥料最好| 酸菜鱼用什么鱼做好吃| 肉丝炒什么菜好吃| 副县长是什么级别干部| 经常感冒吃什么增强抵抗力| 鼻腔干燥是什么原因| 吃什么补充膝盖润滑液| vsc是什么意思| 蚝油是什么原料做的| 抗环瓜氨酸肽抗体高是什么意思| 官杀混杂是什么意思| 尿频吃什么药最好| 间奏是什么意思| 日语一个一个是什么意思| 小孩睡觉说梦话是什么原因| 牙神经疼吃什么药| 百度??????? ?? ????

加拿大BC省旅业推介会在南京、杭州、深圳成功举办

Permanently protected module
????? ???????? ?????????? ??

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
多走路有什么好处 蜂蜜吃有什么好处 cathy是什么意思 肉桂是什么茶 化橘红是什么东西
蟑螂是什么样子的 一什么月光 宝宝睡觉头上出汗多是什么原因 口渴是什么原因 婴儿长牙有什么症状
吉祥物是什么生肖 头部紧绷感是什么原因 肺的主要功能是什么 恨铁不成钢是什么意思 脂肪垫是什么
bang什么意思 柔是什么意思 水瓶座是什么象 寄生树有什么功效作用 内火重吃什么药见效快
无以言表是什么意思hcv8jop2ns4r.cn 甘蓝是什么hcv9jop6ns1r.cn 什么生水hcv9jop3ns8r.cn abs材质是什么hcv9jop2ns6r.cn 男人得了hpv有什么症状hcv8jop9ns0r.cn
什么颜色属木hcv7jop5ns3r.cn 50米7秒什么水平dajiketang.com jhs空调是什么牌子hcv8jop5ns0r.cn 升结肠憩室是什么意思hcv8jop8ns3r.cn crf是什么意思hcv8jop4ns3r.cn
梦见烧衣服什么预兆hcv9jop4ns8r.cn 内膜厚吃什么药掉内膜hcv8jop9ns1r.cn 喉咙痒咳嗽有痰是什么原因0735v.com 边缘视力是什么意思hcv7jop9ns7r.cn 什么牌子手机好hcv9jop2ns6r.cn
高什么远什么hcv8jop4ns7r.cn 南瓜吃多了有什么坏处hcv9jop5ns9r.cn 皮草是什么意思hcv8jop2ns2r.cn 泞字五行属什么96micro.com 尿糖1十是什么意思hcv9jop0ns0r.cn
百度