月经下不来吃什么药| 女人吃山竹有什么好处| 牛奶可以做什么美食| 绍兴本地人喝什么黄酒| 三周年祭日有什么讲究| 热水器什么牌子好| 女人在什么时候最容易怀孕| 什么是福报| 睡意是什么意思| 什么东东| 心电图显示窦性心律是什么意思| 尿液发黄是什么病| 空调管滴水是什么原因| 有什么烟| 颈椎生理曲度变直是什么意思| 牙龈和牙齿分离是什么原因| 什么是理想| 黄盖代表什么生肖| 宫颈糜烂是什么原因引起的| 湿疹是什么症状图片| 人乳头瘤病毒39型阳性是什么意思| 化验血挂什么科| 梦到亲人死了是什么征兆| 前列腺回声欠均匀什么意思| 大便很黄是什么原因| 女孩什么时辰出生最好| 512是什么星座| ph是什么意思| 气虚吃什么| 12月26是什么星座| 9年是什么婚| 92年属什么的生肖| 梦见戴孝是什么意思| 13数字代表什么意思| 梦见买黄金是什么兆头| 高血压吃什么好降压快| 脚底有黑痣有什么说法| 下岗是什么意思| 撒西不理是什么意思| 茹毛饮血什么意思| 电脑关机快捷键是什么| 麟字五行属什么| 心脾两虚吃什么食物补最快| 脚脖子抽筋是什么原因| 灌肤是什么意思| 什么是脑梗| 嗓子哑是什么病的前兆| 假牙什么材质的最好| 为什么来月经会头疼| 孕妇不能吃什么| 2007属什么生肖| 肚子冰凉是什么原因| 青岛是什么省| 牛瓦沟是什么部位| 制氧机什么牌子好| 嗡阿吽是什么意思| 预防高原反应吃什么药| 耳鸣用什么滴耳液| 笔记本电脑什么牌子好| 水土不服是什么意思| 舂米是什么意思| 北边是什么生肖| 烧伤病人吃什么恢复快| 高密度脂蛋白低是什么原因| 痹是什么意思| 血小板过低有什么危害| 头疼想吐吃什么药| 上火咳嗽吃什么药| roger是什么意思| 眉毛尾部有痣代表什么| 沙土地适合种什么农作物| 心率快吃什么中成药| 三鹿奶粉现在叫什么| 冷鲜肉和新鲜肉有什么区别| 肝风内动吃什么中成药| 静脉曲张属于什么科| 白球比偏低吃什么补| 手心经常出汗是什么原因| 黄连治什么病最好| 长痘痘去医院挂什么科| 说什么情深似海我却不敢当| 彩金是什么金| 什么鬼什么神| 乘风破浪是什么生肖| 秉着是什么意思| 膝关节痛挂什么科| slogan是什么意思| 鼻孔里面痒是什么原因| 牛油果什么时候吃最好| 撕裂是什么意思| 口是心非是什么动物| 什么是三公经费| 女性尿臭味重是什么病| 狗咬人后狗为什么会死| 鼻塞打喷嚏是什么原因| 一九八三年属什么生肖| 手足口病用什么药| 八月五号是什么星座| 高血糖吃什么菜好| 萎缩性阴道炎用什么药| 什么药治牙疼最快| 新生婴儿吃什么奶粉| 巳是什么意思| 什么水果含铁量最高| 算五行缺什么免费测试| 红花跟藏红花有什么区别| 碱中毒是什么引起的| 室上性心动过速是什么原因引起的| 什么样的长城| 什么的铅笔| 什么西瓜最好吃| 急性肠胃炎吃什么食物| 不敢造次是什么意思| 预防医学是什么| 胃胀是什么症状| 白洞是什么| 白细胞低是什么原因造成的| 梦到自己孩子死了是什么征兆| 尿检是检查什么的| 内脂豆腐是什么| 嗓子疼发烧吃什么药| 男人左眼跳是什么预兆| 为什么叫211大学| 隐翅虫是什么| 二哥是什么意思| 海鲜都有什么| 八面玲珑代表什么生肖| 2.22什么星座| 大利月小利月什么意思| 姨妈不正常是什么原因| 家里有壁虎是什么原因| 客厅沙发后面墙上挂什么画好| 流水席是什么意思| 脑血管堵塞吃什么药好| 孕妇痔疮犯了能用什么药膏| 野人是什么意思| 什么车性价比最高| gd是什么牌子| 头晕可以吃什么药| 武警支队长是什么级别| 试管进周期是什么意思| 膀胱癌有什么症状| 阳历7月份是什么星座| 后半夜咳嗽是什么原因| 鹿查什么部首| 霸王别姬是什么生肖| 地球什么时候毁灭| 什么水果最老实| 居住证签注是什么意思| 男人交生育保险有什么用| 淋巴结回声是什么意思| 全麦粉是什么面粉| 搬家 送什么| 枸杞泡茶有什么功效| 胸部胀痛是什么原因| 什么汗滴| 什么什么斜斜| 中东是什么意思| 早上4点是什么时辰| 吃西瓜有什么坏处| 血糖高不能吃什么食物| 心功能iv级是什么意思| 红红的太阳像什么| 两毛四是什么军衔| 手机root后有什么好处和坏处| 12月13号什么星座| 陌上花是什么意思| 煤气罐在什么情况下会爆炸| 外阴白斑是什么样子| 尿发绿是什么原因| 1月15日什么星座| 骨膜炎用什么药| 彩金是什么金| 冒犯是什么意思| 耐药菌感染什么意思| 割包皮有什么用| 一阵一阵的胃疼是什么原因| 吃完榴莲后不能吃什么| 喉咙痛是什么原因| ipadair2什么时候上市的| 金陵十三钗是什么意思| 嘴巴经常长溃疡是什么原因| 冻豆腐炖什么好吃| 甲沟炎用什么药| 梦见下牙掉了是什么征兆| 副脾对身体有什么影响| 巨蟹跟什么星座最配| 猫咪弓背是什么原因| 产复欣颗粒什么时候吃| 胃痛吃什么药效果好| 肺肿瘤不能吃什么| 五行缺水戴什么| 什么是电商平台| 高铁与动车的区别是什么| nrc是什么意思| 老是吐口水是什么原因| 粘膜充血水肿什么意思| 精液带血是什么原因| 一喝牛奶就拉肚子是什么原因| 山洪是什么意思| 脚踝扭伤挂什么科| 生物指的是什么| 猪肝有什么功效与作用| 教师节给老师送什么礼物| 起付线是什么意思| 低压偏高是什么原因| 一什么城市| hpv42阳性是什么意思| 发烧能吃什么食物| 合成立方氧化锆是什么| 达泊西汀有什么副作用| 高脂血症吃什么药| 儿童咳嗽吃什么消炎药| 除异味用什么效果最好| 打封闭针是什么意思| 什么是捞女| 吃完饭就想睡觉是什么原因| 肤色暗黄适合穿什么颜色的衣服| 升字是什么生肖| 痰是棕色的是什么原因| 痔疮是什么症状| 不典型增生是什么意思| 前兆是什么意思| 猫三联什么时候打| nk是什么| 麝香对孕妇有什么危害性| hpv31阳性是什么意思| 胆红素升高是什么原因| 什么叫胰岛素抵抗| 手镯断了有什么预兆| 91年是什么命| 贫血吃什么食物最好| 孤单的反义词是什么| 懿怎么读 什么意思| 九月三号是什么星座| cco是什么职位| 什么时间艾灸最好| 染发膏用什么能洗掉| 禾字加一笔是什么字| 贻笑大方什么意思| 柠檬泡水喝有什么好处| 随时随地是什么意思| 山葵是什么| 雪梨百合炖冰糖有什么功效| 鼻咽炎吃什么药| 鱼和熊掌不可兼得什么意思| 迅速的反义词是什么| 琼瑶剧是什么意思| 嘴唇发白什么原因| 第二次世界大战是什么时候| 什么是制片人| 科目一和科目四有什么区别| 白芷有什么作用与功效| 蜜月是什么意思| bp在医学上是什么意思| 西药是用什么材料做的| 骨折吃什么好的快| 频繁打哈欠是什么原因| 腿容易麻是什么原因| 为什么广西女孩子好娶| 血糖高初期有什么症状| 脐带血能治疗什么病| pm什么意思| 紫微星是什么意思| 百度Jump to content

4月20至21日 天下三丰派弟子 汇聚福泉寻三丰仙踪

Permanently protected module
From Wikimania
Module documentation
百度 杭州西湖的美景不仅春天独有,夏日里接天莲碧的荷花,秋夜中浸透月光的三潭,冬雪后疏影横斜的红梅,无论何时来,都会领略到她不同的风采。

Lua error: expandTemplate: template loop detected.

-- This is a meta-module for producing message box templates, including
-- {{mbox}}, {{ambox}}, {{imbox}}, {{tmbox}}, {{ombox}}, {{cmbox}} and {{fmbox}}.

-- Load necessary modules.
require('strict')
local getArgs
local yesno = require('Module:Yesno')

-- Get a language object for formatDate and ucfirst.
local lang = mw.language.getContentLanguage()

-- Define constants
local CONFIG_MODULE = 'Module:Message box/configuration'
local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'}
local TEMPLATE_STYLES = 'Module:Message box/%s.css'

--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------

local function getTitleObject(...)
	-- Get the title object, passing the function through pcall
	-- in case we are over the expensive function count limit.
	local success, title = pcall(mw.title.new, ...)
	if success then
		return title
	end
end

local function union(t1, t2)
	-- Returns the union of two arrays.
	local vals = {}
	for i, v in ipairs(t1) do
		vals[v] = true
	end
	for i, v in ipairs(t2) do
		vals[v] = true
	end
	local ret = {}
	for k in pairs(vals) do
		table.insert(ret, k)
	end
	table.sort(ret)
	return ret
end

local function getArgNums(args, prefix)
	local nums = {}
	for k, v in pairs(args) do
		local num = mw.ustring.match(tostring(k), '^' .. prefix .. '([1-9]%d*)$')
		if num then
			table.insert(nums, tonumber(num))
		end
	end
	table.sort(nums)
	return nums
end

--------------------------------------------------------------------------------
-- Box class definition
--------------------------------------------------------------------------------

local MessageBox = {}
MessageBox.__index = MessageBox

function MessageBox.new(boxType, args, cfg)
	args = args or {}
	local obj = {}

	obj.boxType = boxType

	-- Set the title object and the namespace.
	obj.title = getTitleObject(args.page) or mw.title.getCurrentTitle()

	-- Set the config for our box type.
	obj.cfg = cfg[boxType]
	if not obj.cfg then
		local ns = obj.title.namespace
		-- boxType is "mbox" or invalid input
		if args.demospace and args.demospace ~= '' then
			-- implement demospace parameter of mbox
			local demospace = string.lower(args.demospace)
			if DEMOSPACES[demospace] then
				-- use template from DEMOSPACES
				obj.cfg = cfg[DEMOSPACES[demospace]]
				obj.boxType = DEMOSPACES[demospace]
			elseif string.find( demospace, 'talk' ) then
				-- demo as a talk page
				obj.cfg = cfg.tmbox
				obj.boxType = 'tmbox'
			else
				-- default to ombox
				obj.cfg = cfg.ombox
				obj.boxType = 'ombox'
			end
		elseif ns == 0 then
			obj.cfg = cfg.ambox -- main namespace
			obj.boxType = 'ambox'
		elseif ns == 6 then
			obj.cfg = cfg.imbox -- file namespace
			obj.boxType = 'imbox'
		elseif ns == 14 then
			obj.cfg = cfg.cmbox -- category namespace
			obj.boxType = 'cmbox'
		else
			local nsTable = mw.site.namespaces[ns]
			if nsTable and nsTable.isTalk then
				obj.cfg = cfg.tmbox -- any talk namespace
				obj.boxType = 'tmbox'
			else
				obj.cfg = cfg.ombox -- other namespaces or invalid input
				obj.boxType = 'ombox'
			end
		end
	end

	-- Set the arguments, and remove all blank arguments except for the ones
	-- listed in cfg.allowBlankParams.
	do
		local newArgs = {}
		for k, v in pairs(args) do
			if v ~= '' then
				newArgs[k] = v
			end
		end
		for i, param in ipairs(obj.cfg.allowBlankParams or {}) do
			newArgs[param] = args[param]
		end
		obj.args = newArgs
	end

	-- Define internal data structure.
	obj.categories = {}
	obj.classes = {}
	-- For lazy loading of [[Module:Category handler]].
	obj.hasCategories = false

	return setmetatable(obj, MessageBox)
end

function MessageBox:addCat(ns, cat, sort)
	if not cat then
		return nil
	end
	if sort then
		cat = string.format('[[Category:%s|%s]]', cat, sort)
	else
		cat = string.format('[[Category:%s]]', cat)
	end
	self.hasCategories = true
	self.categories[ns] = self.categories[ns] or {}
	table.insert(self.categories[ns], cat)
end

function MessageBox:addClass(class)
	if not class then
		return nil
	end
	self.classes[class] = 1
end

function MessageBox:removeClass(class)
	if not class then
		return nil
	end
	self.classes[class] = nil
end

function MessageBox:setParameters()
	local args = self.args
	local cfg = self.cfg

	-- Get type data.
	self.type = args.type
	local typeData = cfg.types[self.type]
	self.invalidTypeError = cfg.showInvalidTypeError
		and self.type
		and not typeData
	typeData = typeData or cfg.types[cfg.default]
	self.typeClass = typeData.class
	self.typeImage = typeData.image

	-- Find if the box has been wrongly substituted.
	self.isSubstituted = cfg.substCheck and args.subst == 'SUBST'

	-- Find whether we are using a small message box.
	self.isSmall = cfg.allowSmall and (
		cfg.smallParam and args.small == cfg.smallParam
		or not cfg.smallParam and yesno(args.small)
	)

	-- Add attributes, classes and styles.
	self.id = args.id
	self.name = args.name
	for _, class in ipairs(cfg.classes or {}) do
		self:addClass(class)
	end
	if self.name then
		self:addClass('box-' .. string.gsub(self.name,' ','_'))
	end
	local plainlinks = yesno(args.plainlinks)
	if plainlinks == true then
		self:addClass('plainlinks')
	elseif plainlinks == false then
		self:removeClass('plainlinks')
	end
	if self.isSmall then
		self:addClass(cfg.smallClass or 'mbox-small')
	end
	self:addClass(self.typeClass)
	self:addClass(args.class)
	self.style = args.style
	self.attrs = args.attrs

	-- Set text style.
	self.textstyle = args.textstyle

	-- Find if we are on the template page or not. This functionality is only
	-- used if useCollapsibleTextFields is set, or if both cfg.templateCategory
	-- and cfg.templateCategoryRequireName are set.
	self.useCollapsibleTextFields = cfg.useCollapsibleTextFields
	if self.useCollapsibleTextFields
		or cfg.templateCategory
		and cfg.templateCategoryRequireName
	then
		if self.name then
			local templateName = mw.ustring.match(
				self.name,
				'^[tT][eE][mM][pP][lL][aA][tT][eE][%s_]*:[%s_]*(.*)$'
			) or self.name
			templateName = 'Template:' .. templateName
			self.templateTitle = getTitleObject(templateName)
		end
		self.isTemplatePage = self.templateTitle
			and mw.title.equals(self.title, self.templateTitle)
	end
	
	-- Process data for collapsible text fields. At the moment these are only
	-- used in {{ambox}}.
	if self.useCollapsibleTextFields then
		-- Get the self.issue value.
		if self.isSmall and args.smalltext then
			self.issue = args.smalltext
		else
			local sect
			if args.sect == '' then
				sect = 'This ' .. (cfg.sectionDefault or 'page')
			elseif type(args.sect) == 'string' then
				sect = 'This ' .. args.sect
			end
			local issue = args.issue
			issue = type(issue) == 'string' and issue ~= '' and issue or nil
			local text = args.text
			text = type(text) == 'string' and text or nil
			local issues = {}
			table.insert(issues, sect)
			table.insert(issues, issue)
			table.insert(issues, text)
			self.issue = table.concat(issues, ' ')
		end

		-- Get the self.talk value.
		local talk = args.talk
		-- Show talk links on the template page or template subpages if the talk
		-- parameter is blank.
		if talk == ''
			and self.templateTitle
			and (
				mw.title.equals(self.templateTitle, self.title)
				or self.title:isSubpageOf(self.templateTitle)
			)
		then
			talk = '#'
		elseif talk == '' then
			talk = nil
		end
		if talk then
			-- If the talk value is a talk page, make a link to that page. Else
			-- assume that it's a section heading, and make a link to the talk
			-- page of the current page with that section heading.
			local talkTitle = getTitleObject(talk)
			local talkArgIsTalkPage = true
			if not talkTitle or not talkTitle.isTalkPage then
				talkArgIsTalkPage = false
				talkTitle = getTitleObject(
					self.title.text,
					mw.site.namespaces[self.title.namespace].talk.id
				)
			end
			if talkTitle and talkTitle.exists then
				local talkText = 'Relevant discussion may be found on'
				if talkArgIsTalkPage then
					talkText = string.format(
						'%s [[%s|%s]].',
						talkText,
						talk,
						talkTitle.prefixedText
					)
				else
					talkText = string.format(
						'%s the [[%s#%s|talk page]].',
						talkText,
						talkTitle.prefixedText,
						talk
					)
				end
				self.talk = talkText
			end
		end

		-- Get other values.
		self.fix = args.fix ~= '' and args.fix or nil
		local date
		if args.date and args.date ~= '' then
			date = args.date
		elseif args.date == '' and self.isTemplatePage then
			date = lang:formatDate('F Y')
		end
		if date then
			self.date = string.format(" <small class='date-container'>''(<span class='date'>%s</span>)''</small>", date)
		end
		self.info = args.info
		if yesno(args.removalnotice) then
			self.removalNotice = cfg.removalNotice
		end
	end

	-- Set the non-collapsible text field. At the moment this is used by all box
	-- types other than ambox, and also by ambox when small=yes.
	if self.isSmall then
		self.text = args.smalltext or args.text
	else
		self.text = args.text
	end

	-- Set the below row.
	self.below = cfg.below and args.below

	-- General image settings.
	self.imageCellDiv = not self.isSmall and cfg.imageCellDiv
	self.imageEmptyCell = cfg.imageEmptyCell
	if cfg.imageEmptyCellStyle then
		self.imageEmptyCellStyle = 'border:none;padding:0px;width:1px'
	end

	-- Left image settings.
	local imageLeft = self.isSmall and args.smallimage or args.image
	if cfg.imageCheckBlank and imageLeft ~= 'blank' and imageLeft ~= 'none'
		or not cfg.imageCheckBlank and imageLeft ~= 'none'
	then
		self.imageLeft = imageLeft
		if not imageLeft then
			local imageSize = self.isSmall
				and (cfg.imageSmallSize or '30x30px')
				or '40x40px'
			self.imageLeft = string.format('[[File:%s|%s|link=|alt=]]', self.typeImage
				or 'Information icon4.svg', imageSize)
		end
	end

	-- Right image settings.
	local imageRight = self.isSmall and args.smallimageright or args.imageright
	if not (cfg.imageRightNone and imageRight == 'none') then
		self.imageRight = imageRight
	end
end

function MessageBox:setMainspaceCategories()
	local args = self.args
	local cfg = self.cfg

	if not cfg.allowMainspaceCategories then
		return nil
	end

	local nums = {}
	for _, prefix in ipairs{'cat', 'category', 'all'} do
		args[prefix .. '1'] = args[prefix]
		nums = union(nums, getArgNums(args, prefix))
	end

	-- The following is roughly equivalent to the old {{Ambox/category}}.
	local date = args.date
	date = type(date) == 'string' and date
	local preposition = 'from'
	for _, num in ipairs(nums) do
		local mainCat = args['cat' .. tostring(num)]
			or args['category' .. tostring(num)]
		local allCat = args['all' .. tostring(num)]
		mainCat = type(mainCat) == 'string' and mainCat
		allCat = type(allCat) == 'string' and allCat
		if mainCat and date and date ~= '' then
			local catTitle = string.format('%s %s %s', mainCat, preposition, date)
			self:addCat(0, catTitle)
			catTitle = getTitleObject('Category:' .. catTitle)
			if not catTitle or not catTitle.exists then
				self:addCat(0, 'Articles with invalid date parameter in template')
			end
		elseif mainCat and (not date or date == '') then
			self:addCat(0, mainCat)
		end
		if allCat then
			self:addCat(0, allCat)
		end
	end
end

function MessageBox:setTemplateCategories()
	local args = self.args
	local cfg = self.cfg

	-- Add template categories.
	if cfg.templateCategory then
		if cfg.templateCategoryRequireName then
			if self.isTemplatePage then
				self:addCat(10, cfg.templateCategory)
			end
		elseif not self.title.isSubpage then
			self:addCat(10, cfg.templateCategory)
		end
	end

	-- Add template error categories.
	if cfg.templateErrorCategory then
		local templateErrorCategory = cfg.templateErrorCategory
		local templateCat, templateSort
		if not self.name and not self.title.isSubpage then
			templateCat = templateErrorCategory
		elseif self.isTemplatePage then
			local paramsToCheck = cfg.templateErrorParamsToCheck or {}
			local count = 0
			for i, param in ipairs(paramsToCheck) do
				if not args[param] then
					count = count + 1
				end
			end
			if count > 0 then
				templateCat = templateErrorCategory
				templateSort = tostring(count)
			end
			if self.categoryNums and #self.categoryNums > 0 then
				templateCat = templateErrorCategory
				templateSort = 'C'
			end
		end
		self:addCat(10, templateCat, templateSort)
	end
end

function MessageBox:setAllNamespaceCategories()
	-- Set categories for all namespaces.
	if self.isSubstituted then
		self:addCat('all', 'Pages with incorrectly substituted templates')
	end
end

function MessageBox:setCategories()
	if self.title.namespace == 0 then
		self:setMainspaceCategories()
	elseif self.title.namespace == 10 then
		self:setTemplateCategories()
	end
	self:setAllNamespaceCategories()
end

function MessageBox:renderCategories()
	if not self.hasCategories then
		-- No categories added, no need to pass them to Category handler so,
		-- if it was invoked, it would return the empty string.
		-- So we shortcut and return the empty string.
		return ""
	end
	-- Convert category tables to strings and pass them through
	-- [[Module:Category handler]].
	return require('Module:Category handler')._main{
		main = table.concat(self.categories[0] or {}),
		template = table.concat(self.categories[10] or {}),
		all = table.concat(self.categories.all or {}),
		nocat = self.args.nocat,
		page = self.args.page
	}
end

function MessageBox:export()
	local root = mw.html.create()

	-- Add the subst check error.
	if self.isSubstituted and self.name then
		root:tag('b')
			:addClass('error')
			:wikitext(string.format(
				'Template <code>%s[[Template:%s|%s]]%s</code> has been incorrectly substituted.',
				mw.text.nowiki('{{'), self.name, self.name, mw.text.nowiki('}}')
			))
	end

	-- Add TemplateStyles
	root:wikitext(mw.getCurrentFrame():extensionTag{
		name = 'templatestyles',
		args = { src = TEMPLATE_STYLES:format(self.boxType) },
	})

	-- Create the box table.
	local boxTable
	-- Check for fmbox because not all interface messages have mw-parser-output
	-- which is necessary for TemplateStyles. Add the wrapper class if it is and
	-- then start the actual mbox, else start the mbox.
	if self.boxType == 'fmbox' then
		boxTable = root:tag('div')
			:addClass('mw-parser-output')
			:tag('table')
	else
		boxTable = root:tag('table')
	end

	boxTable:attr('id', self.id or nil)
	for class, _ in pairs(self.classes or {}) do
		boxTable:addClass(class or nil)
	end
	boxTable
		:cssText(self.style or nil)
		:attr('role', 'presentation')

	if self.attrs then
		boxTable:attr(self.attrs)
	end

	-- Add the left-hand image.
	local row = boxTable:tag('tr')
	if self.imageLeft then
		local imageLeftCell = row:tag('td'):addClass('mbox-image')
		if self.imageCellDiv then
			-- If we are using a div, redefine imageLeftCell so that the image
			-- is inside it. Divs use style="width: 52px;", which limits the
			-- image width to 52px. If any images in a div are wider than that,
			-- they may overlap with the text or cause other display problems.
			imageLeftCell = imageLeftCell:tag('div'):css('width', '52px')
		end
		imageLeftCell:wikitext(self.imageLeft or nil)
	elseif self.imageEmptyCell then
		-- Some message boxes define an empty cell if no image is specified, and
		-- some don't. The old template code in templates where empty cells are
		-- specified gives the following hint: "No image. Cell with some width
		-- or padding necessary for text cell to have 100% width."
		row:tag('td')
			:addClass('mbox-empty-cell')
			:cssText(self.imageEmptyCellStyle or nil)
	end

	-- Add the text.
	local textCell = row:tag('td'):addClass('mbox-text')
	if self.useCollapsibleTextFields then
		-- The message box uses advanced text parameters that allow things to be
		-- collapsible. At the moment, only ambox uses this.
		textCell:cssText(self.textstyle or nil)
		local textCellDiv = textCell:tag('div')
		textCellDiv
			:addClass('mbox-text-span')
			:wikitext(self.issue or nil)
		if (self.talk or self.fix) and not self.isSmall then
			textCellDiv:tag('span')
				:addClass('hide-when-compact')
				:wikitext(self.talk and (' ' .. self.talk) or nil)
				:wikitext(self.fix and (' ' .. self.fix) or nil)
		end
		textCellDiv:wikitext(self.date and (' ' .. self.date) or nil)
		if self.info and not self.isSmall then
			textCellDiv
				:tag('span')
				:addClass('hide-when-compact')
				:wikitext(self.info and (' ' .. self.info) or nil)
		end
		if self.removalNotice then
			textCellDiv:tag('small')
				:addClass('hide-when-compact')
				:tag('i')
					:wikitext(string.format(" (%s)", self.removalNotice))
		end
	else
		-- Default text formatting - anything goes.
		textCell
			:cssText(self.textstyle or nil)
			:wikitext(self.text or nil)
	end

	-- Add the right-hand image.
	if self.imageRight then
		local imageRightCell = row:tag('td'):addClass('mbox-imageright')
		if self.imageCellDiv then
			-- If we are using a div, redefine imageRightCell so that the image
			-- is inside it.
			imageRightCell = imageRightCell:tag('div'):css('width', '52px')
		end
		imageRightCell
			:wikitext(self.imageRight or nil)
	end

	-- Add the below row.
	if self.below then
		boxTable:tag('tr')
			:tag('td')
				:attr('colspan', self.imageRight and '3' or '2')
				:addClass('mbox-text')
				:cssText(self.textstyle or nil)
				:wikitext(self.below or nil)
	end

	-- Add error message for invalid type parameters.
	if self.invalidTypeError then
		root:tag('div')
			:css('text-align', 'center')
			:wikitext(string.format(
				'This message box is using an invalid "type=%s" parameter and needs fixing.',
				self.type or ''
			))
	end

	-- Add categories.
	root:wikitext(self:renderCategories() or nil)

	return tostring(root)
end

--------------------------------------------------------------------------------
-- Exports
--------------------------------------------------------------------------------

local p, mt = {}, {}

function p._exportClasses()
	-- For testing.
	return {
		MessageBox = MessageBox
	}
end

function p.main(boxType, args, cfgTables)
	local box = MessageBox.new(boxType, args, cfgTables or mw.loadData(CONFIG_MODULE))
	box:setParameters()
	box:setCategories()
	return box:export()
end

function mt.__index(t, k)
	return function (frame)
		if not getArgs then
			getArgs = require('Module:Arguments').getArgs
		end
		return t.main(k, getArgs(frame, {trim = false, removeBlanks = false}))
	end
end

return setmetatable(p, mt)
补肺养肺吃什么食物最好 打狗是什么意思 逆向思维是什么意思 彩虹为什么有七种颜色 什么的后羿
苦口婆心是什么生肖 早上跑步有什么好处 尿频尿急用什么药 01年是什么年 小学生的学籍号是什么
秦朝灭亡后是什么朝代 豆蔻是什么 龟公是什么意思 为什么北方人比南方人高 牙疼喝什么药
血管瘤是什么东西 治疗勃起困难有什么药 上火便秘吃什么最快排便 6月16是什么星座 感冒了喝什么汤好
慢性盆腔炎吃什么药hcv8jop6ns8r.cn 保底工资是什么意思hcv8jop7ns8r.cn 养肺补肺吃什么药最好hcv8jop1ns4r.cn 维生素B1有什么副作用hcv8jop0ns3r.cn 汉高祖叫什么名字hcv7jop9ns1r.cn
海参为什么越小越贵hcv9jop7ns1r.cn 211属于什么大学hcv7jop4ns7r.cn 早孕反应最早什么时候出现hcv8jop4ns7r.cn 胰腺检查挂什么科ff14chat.com 牛跟什么生肖相合hcv8jop0ns1r.cn
夜里睡觉手麻是什么原因hcv9jop2ns0r.cn 手电筒的金属外壳相当于电路中的什么hcv9jop5ns6r.cn 水煮肉片用什么肉jasonfriends.com 什么零食好吃bfb118.com 邓紫棋属什么生肖kuyehao.com
小孩子上火吃什么能降火hcv8jop0ns8r.cn 登革热吃什么药hcv9jop0ns1r.cn 拉肚子吃什么药最好hcv9jop0ns8r.cn 吃什么东西对肝脏好hcv9jop8ns0r.cn 猕猴桃对身体有什么好处hcv8jop3ns9r.cn
百度