小鱼爱吃什么| 木字旁的字与什么有关| 灵芝有什么功效与作用| 授人以鱼不如授人以渔什么意思| 梦见好多死人是什么征兆| 想做肠镜挂什么科| 夏天吃什么汤| 这是什么牌子| u是什么元素| 大学毕业送什么花| 喝牛奶为什么拉肚子| 尿液少是什么原因| 附属国是什么意思| 做肠镜检查需要提前做什么准备| 皮下紫癜是什么引起的| 夏天喝什么| 什么是微单相机| 走花路是什么意思| 什么心所什么| 破处什么感觉| 口腔脱皮是什么原因引起的| 半路杀出个程咬金是什么意思| 阑尾炎能吃什么水果| 丑角是什么意思| dcc是什么意思| 喝苦荞茶有什么好处| 购置是什么意思| 京酱肉丝是什么菜系| 生肖牛和什么生肖最配| 7月24号是什么星座| 着凉吃什么药| pa是什么意思| 葬礼穿什么衣服| 谢霆锋什么学历| 我的星座是什么| 词讼是什么意思| 心电图p是什么意思| mds是什么| 扁桃体炎吃什么药最好| 蝗虫吃什么| 里是什么结构| 冰箱什么牌子好| 三个手念什么| 肝实质弥漫性回声改变什么意思| 什么原因导致脑出血| 乳糖不耐受什么意思| 未羊是什么意思| 户口所在地是什么意思| 纸可以折什么| 腰椎退行性变是什么意思| 刮骨疗毒的意思是什么| 五月二十四号是什么星座| cheese什么意思| 今天什么时候下雨| 田五行属性是什么| yolo是什么| 吃醋是什么意思| 看望病人买什么水果| 张姓五行属什么| 肠道细菌感染吃什么药| 吃伟哥有什么副作用| 4b橡皮和2b橡皮有什么区别| 腰扭伤吃什么药最有效| 微恶风寒是什么意思| 梦见黑蛇是什么预兆| 7月初七是什么日子| 下巴长痘痘什么原因| as是什么意思| 脊椎痛什么原因| 猪肉炖什么好吃| 地中海贫血有什么症状| 正营级是什么军衔| 清朝什么时候建立| 心气虚吃什么药| 司空见惯是什么意思| 脖子长小肉粒是什么原因| 缅铃是什么| 包皮炎吃什么消炎药| 什么是僵尸肉| 什么食物含锌最多| 海带属于什么类| 李幼斌是什么军衔| 甲状腺球蛋白低是什么意思| 1981年五行属什么| 荷叶像什么比喻句| 水满则溢月盈则亏是什么意思| 程门立雪是什么生肖| ofd是什么意思| 射手是什么象星座| 为什么吃了避孕药还是怀孕了| rad是什么单位| 老人家脚肿是什么原因引起的| 不是什么而是什么造句| 药流后吃什么消炎药比较好| 姝字五行属什么的| 为什么打嗝不停| 胃痛看什么科| 小孩血压低是什么原因| 三道鳞是什么鱼| 夫妻备孕检查挂什么科| 海带属于什么植物| 有恃无恐什么意思啊| 你在说什么用英语怎么说| 白敬亭原名叫什么| 考研都考什么科目| 咳嗽买什么药| 平常吃什么补肾| 冰点脱毛的原理是什么| 1954年属什么生肖| 肌肉萎缩有什么症状| 脚趾甲发白是什么原因| 阳起石是什么东西| 什么爱| 三伏天吃什么最好| 吃了火龙果小便红色是什么原因| 连云港有什么特产| 一什么牛奶| ckd是什么意思| 海菜是什么| 背疼挂什么科| 失眠吃什么食物最有效| zutter是什么意思| 演唱会安可是什么意思| 球蛋白偏高是什么意思| 放下执念是什么意思| 废电池乱丢对人体可能造成什么中毒| 经常感冒吃什么提高免疫力| 狗与什么属相相冲| 为什么韩国叫棒子国| 6月13号是什么星座| 胃胀胃不消化吃什么药| 摩什么接什么| 百什么百什么的成语| 吃完就拉是什么原因| 棚户区改造和拆迁有什么区别| 中国女人裹脚是从什么时候开始| 去火吃什么水果| 散光和近视有什么区别| 虔婆是什么意思| 拔罐挂什么科| 手脚不协调是什么原因| 牙龈出血什么原因| 稀松平常是什么意思| 切是什么偏旁| 帮凶是什么意思| 勾股定理是什么意思| 紫苏煮水喝有什么功效| 阴囊潮湿瘙痒用什么药| 强的松又叫什么| 去三亚穿什么衣服合适| 天下无不是的父母是什么意思| 过敏有什么症状| 天蝎什么象| 下午4点多是什么时辰| 男人额头有痣代表什么| 鸡咳嗽吃什么药| 什么舌头| 干眼症滴什么眼药水好| 女人绝经后靠什么排毒| 吃什么食物| rm是什么位置| 蜂蜜不能和什么一起吃| 果葡糖浆是什么| 橘子什么时候成熟| 胆没了对身体有什么影响| 孕吐吃什么| 鸭肉和什么不能一起吃| 欧阳修字什么号什么| 积食是什么症状| 子宫内膜2mm说明什么| 郁郁寡欢的意思是什么| 幅度是什么意思| otc药物是什么意思| 冰粉是什么| 洛什么意思| 酒蒙子什么意思| 手掌发黄是什么原因| 肉苁蓉有什么功效| 喝酒喝多了有什么危害| 酒酿是什么| 2024年五行属什么| 喜丧是什么意思| 嫁给香港人意味着什么| 牙周康又叫什么名字| 儿童过敏性鼻炎吃什么药| 吃什么补血快| 声声慢是什么意思| 77年五行属什么| 睡不着觉去医院挂什么科| 海星吃什么食物| 孕妇吃菠萝对胎儿有什么好处| b型o型生出来的孩子什么血型| 尿液茶色是什么原因| 头发油的快是什么原因| 脚为什么会发麻| 鱼日羽念什么| 毛子是什么意思| 拉屎是绿色的是什么原因| 儿童过敏性结膜炎用什么眼药水| 扁桃体肥大有什么症状| 女性私下有苦味主要是什么原因| 痛风不能吃什么东西| 乳腺无回声结节是什么意思| 肿瘤挂什么科| 喝醋有什么好处和坏处| 杜建英是宗庆后什么人| 李子吃了有什么好处| 淋巴结炎挂什么科| 蒺藜是什么意思| 姨妈发黑量少什么原因| 手心热是什么原因| 肝斑一般在脸上的什么地方| 18K金什么意思| 95年属于什么生肖| 意义是什么| 生吃西红柿有什么好处和坏处| 彩虹代表什么生肖| 嘴巴苦吃什么药| 凋零是什么意思| 生存是什么意思| 宰相肚里能撑船是什么意思| 十月二十六是什么星座| 什么是腹式呼吸| 1991是什么年| 摆地摊卖什么最赚钱而且很受欢迎| 软骨瘤是什么病| 血管造影是什么检查| 女人喜欢什么姿势| 87年属什么的生肖| 生精补精吃什么药最快| 荨麻疹不能吃什么食物| 天津立冬吃什么| 京东什么时候有活动| 甲状腺挂什么科| 什么的北京城| 蜻蜓属于什么类动物| 心口下面疼是什么原因| 强心剂是什么意思| 手淫有什么危害| 惰性是什么意思| 什么梳子梳头最好| 黑芝麻不能和什么一起吃| 试商是什么意思| 四个火念什么字| 什么叫糖类抗原| 喝陈皮水有什么好处| 气喘吁吁什么意思| 前列腺吃什么药效果好| 咳嗽吃什么菜好| c罗全名叫什么| 为什么金生水| 梦见摘水果是什么意思| u型压迹是什么意思| 塔利班是什么组织| 肉鸽是什么意思| 请节哀是什么意思| 铜锣湾有什么好玩的| 为什么会长牙结石| 剁椒鱼头是什么鱼头| rx是什么意思| 大什么大| 普洱茶什么季节喝好| 吃了紧急避孕药会有什么反应| 什么样的充电宝不能带上飞机| 百度Jump to content

Википедиа — Ч?л??т нэвтэрхий толь
百度 针对新疆地域辽阔的特点,在坚持领导干部带头学懂弄通做实党的十九大精神基础上,重点抓好“三个深入”。
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:Инфобокс/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
力不从心的意思是什么 甲基化是什么意思 金融行业五行属什么 丙氨酸是什么 as材质是什么材料
言字旁与什么有关 梦见挖坑什么意思 gas是什么意思 ab型血和o型血生的孩子是什么血型 不什么声什么
赫五行属性是什么 胸闷气短吃什么特效药 非特异性阴道炎是什么意思 脑部缺氧有什么症状 同学过生日送什么礼物好
走马灯是什么意思 k9什么意思 沂字五行属什么 肌红蛋白低说明什么 颈管细胞有是什么意思
脚臭用什么药hcv8jop7ns8r.cn 儿童看牙齿挂什么科hcv8jop2ns3r.cn 名存实亡是什么意思hcv8jop9ns9r.cn 左侧卵巢囊性包块是什么意思hcv8jop6ns0r.cn 12月14是什么星座hcv8jop2ns5r.cn
康复治疗学是做什么的dayuxmw.com 淋巴结节吃什么药最好hcv9jop0ns3r.cn 97年出生属什么hcv8jop4ns1r.cn 恶魔是什么意思liaochangning.com 植物神经紊乱看什么科hcv9jop0ns7r.cn
白什么hcv9jop5ns8r.cn 镜检白细胞是什么意思hcv8jop1ns8r.cn 血卡是什么hcv9jop1ns2r.cn 水肿是什么原因引起的hcv8jop3ns6r.cn 怀孕早期有什么症状beikeqingting.com
死精是什么原因造成的hcv7jop9ns2r.cn 吃什么可以治痔疮hcv7jop6ns9r.cn 静脉曲张溃烂擦什么药hcv9jop6ns4r.cn 牙龈萎缩吃什么维生素fenrenren.com 三峡大坝什么时候建成的hcv7jop5ns6r.cn
百度