h1是什么意思| 先天性心脏病是什么原因造成的| 什么现象证明你在长高| 记过属于什么处分| 为什么晚上睡不着| 狐臭应该挂什么科| 中药木香的功效与作用是什么| 锄禾是什么意思| tf卡是什么| 言尽于此是什么意思| 精索炎吃什么药最好| 小孩小便红色是什么原因| 胰腺吃什么药| novo是什么牌子| 病毒性感冒咳嗽吃什么药效果好| 益精是什么意思| 用劲的近义词是什么| 粉玫瑰适合送什么人| 拌嘴是什么意思| rd是什么| 吃柠檬是什么意思| 脑瘤早期什么症状| 见地是什么意思| 什么的哭声| 狂风暴雨是什么意思| 罗汉果可以和什么一起泡水喝| 吃避孕药对身体有什么影响| 960万平方千米是指我国的什么| 放浪形骸是什么意思| 什么是甲沟炎图片| 鼠目寸光是什么意思| 玉米笋是什么| o2o模式是什么意思| 眉中间有竖纹代表什么| 华盖是什么| 憩是什么意思| 敢爱敢恨是什么意思| 大麦茶有什么功效与作用| 金星原名叫什么| 男人更年期有什么症状有哪些表现| 八十岁是什么之年| zero是什么牌子| 查胃病做什么检查合适| 萎缩性胃炎是什么原因引起的| 孜孜不倦是什么意思| 尿胆原阴性是什么意思| 灵芝孢子粉什么时候吃最好| 肛门松弛是什么原因| ai是什么| 脸一边大一边小是什么原因| 5月26是什么星座| 咽喉充血是什么原因| 什么大| 脑萎缩是什么意思| 儿保是什么| 清明节的习俗是什么| 膝关节痛挂什么科| 孕妇不能吃什么| 梦见小猪仔什么意思| 小说be是什么意思| 青岛是什么省| 洒水车的音乐是什么歌| ns是什么意思| 为什么会得甲减| 吃了桃子不能吃什么| 养狗养不活是什么兆头| 中耳炎吃什么| 橙子是什么季节的水果| 急得什么| 什么的小毛虫| 红色爱心是什么牌子| 玉和翡翠有什么区别| 牙龈出血缺什么维生素| 牙齿出血是什么病征兆| 鱼精是什么| 血府逐瘀丸治什么病| 夏天适合喝什么茶| 贻笑大方什么意思| 天秤座的幸运色是什么| 12月20是什么星座| 喝酒后胃不舒服吃什么药| 意犹未尽什么意思| 湿气重吃什么中成药| 做梦梦到牛是什么意思| 小肠ct能检查什么病| 眼睛痛吃什么药好得快| 距骨在什么位置| 小淋巴结是什么意思| 葫芦是什么生肖| 为什么要努力读书| 新疆是什么族| 阔腿裤配什么鞋子好看| 股票举牌什么意思| 心不在焉是什么意思| 脉细滑是什么意思| 88年属什么| 尖嘴猴腮什么意思| 子宫肌壁回声不均匀是什么意思| 怀孕初期胸部有什么变化| 老戏骨是什么意思| 蜂蜜什么时候喝最好| 青筋明显是什么原因| 瘿瘤是什么意思| 吃什么东西可以长高| 梦见一条大蟒蛇是什么征兆| 湿气太重吃什么| 大义是什么意思| 就不告诉你就不告诉你是什么儿歌| 夫妻都是a型血孩子是什么血型| 吃避孕药不能吃什么东西| 舌头溃疡是什么原因造成的| 抖是什么生肖| 开铲车需要什么证件| 右肺下叶纤维化灶是什么意思| 观音得道日是什么时候| 交公粮是什么意思| 体检为什么要空腹| 眼睛有眼屎用什么眼药水| 电疗有什么作用和功效| 肩胛骨疼痛挂什么科| 怀孕前三个月需要注意什么| borel手表是什么牌子| 宫腔线不清晰什么意思| 什么乎乎| 什么是招风耳图片| 吃什么对大脑记忆力好| 耐克属于什么档次| 满人是什么民族| 直肠指检能检查出什么| 明知故犯的故是什么意思| 屋漏偏逢连夜雨是什么意思| 什么是双向情感障碍| 口苦尿黄是什么原因| 菜场附近开什么店好| 为什么泡完脚后非常痒| 经期为什么不能拔牙| 唯女子与小人难养也是什么意思| 湖北有什么好玩的| 八月初三是什么星座| 多核巨细胞是什么意思| 月经期间不能吃什么| 竹笋不能和什么一起吃| 禾加末念什么| 天德月德是什么意思| 豆沙馅可以做什么美食| 什么是伤官| 流加金念什么| 睡前吃什么有助于睡眠| 2024年属龙的是什么命| 柠檬酸是什么添加剂| 38岁属什么生肖| 不加热血清反应素试验是什么| 凌晨是什么时辰| 做飞机需要注意什么| 镭射有什么危害| 刮痧是什么原理| 艾灸能治什么| 重庆有什么区| 结膜炎角膜炎用什么眼药水| 盆腔炎吃什么药有效| 鞭尸是什么意思| 杨玉环是什么星座| 叶酸有什么作用| 微信是什么时候开始有的| 吃什么补血小板快| 坐月子适合吃什么水果| 金丝熊吃什么| 炖大骨头放什么调料| 西瓜什么样的好吃| 614是什么星座| 肋骨骨折什么症状| 痔疮用什么药膏| eos是什么意思| 10月21日什么星座| 喉咙发炎挂什么科| aww是什么意思| 胆囊萎缩是什么原因| 肌电图是检查什么的| 菲字五行属什么| 女同叫什么| 胸痛是什么病的前兆| 微博id是什么| 女生两个月没来月经是什么原因| 脸上痒是什么原因| 女性阳性是什么病| 唾液酸是什么| 蘑菇和什么不能一起吃| 怀孕的脉象是什么样的| 转氨酶高有什么危害| 手突然抽搐是什么原因| 14岁可以做什么工作| 糖类抗原125是什么意思| 烤箱能做什么美食| 梦见自己的手镯断了什么意思| 皮蛋吃了有什么好处和坏处| 什么眠什么睡| 肾虚型脱发是什么样子| 腻害什么意思| 唾液腺是什么组织| qaq什么意思| 吸入甲醛会有什么症状| 舌头发白是什么情况| 一到晚上就咳嗽是什么原因| 眩晕是什么症状| 为什么不能拜女娲娘娘| 心脏不舒服挂什么科| 百香果什么季节成熟| 琨字五行属什么| 颈椎ct能检查出什么| 经常腹痛什么原因| 烫伤用什么| 芥菜是什么| 河北属于什么地区| 阴阳怪气是什么意思| 梦见朋友离婚了是什么意思| 海王星是什么颜色| 麻薯粉是什么粉| 什么病不能吃茄子| 刘邦和项羽是什么关系| 梦见下雪是什么| 偶尔头晕是什么原因| 艾滋病初期有什么症状| 导管是什么意思| 前白蛋白低是什么原因| 井代表什么生肖| 本字五行属什么| 6月23号什么星座| 杞人忧天是什么故事| 碧螺春是什么茶| 吃银耳有什么功效和作用| 霜花店讲了什么故事| 西安和咸阳什么关系| 脚脖子抽筋是什么原因| 12月13号是什么星座| 为什么白带是褐色的| c肽是什么意思| 非即食是什么意思| 凌晨十二点是什么时辰| 阴茎进入阴道是什么感觉| 甲状腺在人体什么位置| 狗肉不能和什么食物一起吃| 蛇为什么怕雄黄| 右肺纤维灶是什么意思| 绿油油的什么| 2007年属猪五行属什么| 白鸡蛋是什么鸡下的蛋| 办护照需要什么资料| 杨贵妃是什么生肖| 咳嗽是什么原因引起的| 左手大拇指抖动是什么原因| 急性青光眼是什么症状| 长寿花用什么肥料最好| 莫须有什么意思| 12.21是什么星座| 一只脚面肿是什么原因| 白羊女跟什么星座最配| 胆囊炎输液用什么药| 母亲节送妈妈什么礼物好| 属猴的和什么属相最配| 尖锐湿疣挂什么科| 反流性食管炎吃什么中成药| 酱瓜是什么瓜| 血管炎是什么症状| 静推是什么意思| 百度

《名段欣赏》 20180323 名家书场 评书《大唐侠女》(第47集)

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
沈阳有什么大学 河豚吃什么 左边后背疼是什么原因 寒食节是什么时候 梵蒂冈为什么没人敢打
白牡丹属于什么茶 田七蒸瘦肉有什么功效 感冒头疼吃什么药好 大学记过处分有什么影响 下午5点到7点是什么时辰
肺大泡吃什么药 小儿肠炎吃什么药最好 过期的洗面奶可以用来做什么 高泌乳素血症是什么原因引起的 黄山毛峰是什么茶
减肥吃什么主食 宫颈癌早期什么症状 什么是体外射精 经常自言自语是什么原因 白果是什么
bmg是什么意思hcv8jop8ns5r.cn 为什么不建议儿童做胃镜hcv8jop5ns7r.cn 胆囊挂什么科hcv9jop5ns3r.cn 什么叫理疗hcv8jop2ns2r.cn nb什么意思hcv8jop8ns8r.cn
右眼流泪是什么原因hcv9jop1ns2r.cn 吃什么容易长肉hcv7jop9ns7r.cn 珊瑚虫属于什么动物hcv9jop7ns5r.cn 宝批龙什么意思chuanglingweilai.com 钱代表什么生肖hcv9jop6ns8r.cn
水平是什么意思hcv7jop4ns7r.cn 眼睛胀疼是什么原因hcv7jop6ns9r.cn 山炮是什么意思hcv9jop8ns0r.cn cacao是什么意思hcv8jop1ns9r.cn 於是什么意思hcv8jop6ns0r.cn
舌吻什么感觉hcv9jop0ns3r.cn 线索细胞阳性什么意思hcv8jop7ns5r.cn 气泡水是什么水hcv8jop1ns4r.cn 梦见很多苍蝇是什么意思hcv8jop3ns9r.cn 梦见洪水是什么意思hcv9jop8ns1r.cn
百度