精油是什么| 附件炎吃什么药| 梦想成真是什么意思| 荷花的别称是什么| 白兰地是什么| 郭五行属什么| 四个鱼念什么| 意欲何为是什么意思| 粗钢是什么| 男人喝红糖水有什么好处| 返祖现象什么意思| 太累吃什么缓解疲劳| 孩子流鼻血是什么原因| 氧饱和度是什么意思| 十二指肠溃疡吃什么药| 怀孕胸部会有什么反应| 金银花有什么功效| 什么是植物神经功能紊乱| 润什么意思| 21三体综合征是指什么| 梦见别人开车翻车是什么预兆| 图例是什么| kako是什么牌子| bpd是胎儿的什么| 共度良宵是什么意思| 手指起倒刺是什么原因| 专业术语是什么意思| 高丽参是什么参| 平肝潜阳是什么意思| robinhood是什么牌子| 什么叫类风湿| 李思思为什么离开央视| 诈尸是什么意思| 寿眉属于什么茶| 藤茶有什么功效| 狗狗吐是什么原因| 1953年属什么生肖| 调经吃什么药效果最好| 牛标志的车是什么牌子| 脊柱炎吃什么药| 女人小便疼是什么原因| 妈妈是什么| 女性经常手淫有什么危害| 凝血酶原时间是什么意思| 馒头是什么做的| 为什么会早产| 他乡遇故知什么意思| 冷感冒吃什么药好得快| 肝部出现腹水是什么原因| 1951属什么生肖| 鼠目寸光是什么意思| 昌字五行属什么| 头皮发紧是什么病的前兆| 苦荞茶和什么搭配最好| 白细胞少了会得什么病| 小猫踩奶是什么意思| 抗风疹病毒抗体igg高是什么意思| 绝代双骄是什么意思| 无印良品是什么意思| 黄体破裂是什么原因造成的| 太阳病是什么意思| 语感是什么意思| 急性肠胃炎什么症状| 肝硬化前期有什么症状| 虚荣心是什么意思| chilli是什么意思| 达泊西汀是什么药| 什么食物利尿效果最好| 做梦梦见蜘蛛是什么意思| 什么克水| 脑梗需要注意什么| 讲师是什么级别| 身份证号码代表什么| 雌二醇是什么意思| 6月份生日是什么星座| 什么食物降血压| 白子画什么时候爱上花千骨的| 跌打损伤挂什么科| 蜂蜜有什么好处| 拉屎有血是什么原因| 肌酐高不能吃什么| 国师是什么意思| 前列腺肥大有什么症状| 晕车是什么原因引起的| mcm牌子属于什么档次| 什么是命中注定| 篮子房是什么意思| 重度肠上皮化生是什么意思| 什么牌子的保温杯好| 知柏地黄丸治疗什么病| 羧甲基纤维素钠是什么| 女性分泌物少是什么原因| 蝴蝶什么意思| 渣男之首是什么星座| 香港说什么语言| 阅读是什么意思| 蛇为什么会咬人| ro什么意思| 卿卿是什么意思| 什么叫辟谷| 小月子同房有什么危害| 淋巴炎吃什么药| 什么是好人| 长水痘可以吃什么菜| 央企董事长什么级别| 白酒兑什么饮料最好喝| 大咖什么意思| 什么专业好找工作| 葡萄糖氯化钠注射作用是什么| 金字旁成是什么字| 皿是什么意思| 航五行属什么| 吃什么盐最好| 不打破伤风针会有什么后果| 妈宝女是什么意思| 多尿什么原因| 亥是什么意思| 传染病八项挂什么科| 有什么症状是肯定没怀孕| ivory是什么意思| 艾附暖宫丸什么时候吃| 宜宾燃面为什么叫燃面| 鼻涕由清变黄说明什么| 膝盖疼是什么原因| 金牛座女和什么星座最配| 被蜈蚣咬了有什么症状| 吃什么能让肠道蠕动快| 男人左手有痣代表什么| 九九重阳节是什么意思| 范仲淹号什么| 6月5号什么星座| 宫内膜回声欠均匀是什么意思| 新疆人为什么不吃猪肉| 此地无银三百两什么意思| 荣辱与共是什么意思| 破釜沉舟的釜是什么意思| 送枕头代表什么意思| 8个月宝宝吃什么辅食好| 中校是什么级别| 西瓜有什么营养| 短发适合什么脸型| 福禄寿什么意思| 维生素d低是什么原因| 勾股定理是什么意思| 兰蔻属于什么档次| 胃低分化腺癌是什么意思| 大腿为什么会长妊娠纹| 霜降穿什么衣服| 什么是尾货| 月经淋漓不尽什么原因| 棉麻是什么面料| 老鼠最怕什么气味驱赶| 业力什么意思| 治霉菌性阴炎用什么药好得快| 刚怀孕吃什么对胎儿好| 负距离接触是什么意思| 口水臭什么原因| 生活防水是什么意思| 绝倒是什么意思| 系带是什么| 窦卵泡是什么意思| 92年的属什么| 宫颈cin1级是什么意思| 什么情况打破伤风| 什么是坚果| 意气用事是什么意思| 温度计代表什么生肖| ipi是什么意思| 欧诗漫是个什么档次| 11.24是什么星座| 尿中泡沫多是什么原因| 梦见新坟墓是什么预兆| 六月二号是什么星座| 为什么狱警离婚率高| 十八罗汉是什么意思| 托帕石是什么| 娃娃鱼属于什么类动物| 天麻长什么样子图片| 女上位什么意思| 本性难移是什么生肖| 成都市市长是什么级别| 秋刀鱼在中国叫什么鱼| 协警是干什么的| 直言不讳是什么意思| 根管治疗后要注意什么| 检查胆囊挂什么科| 鱼最喜欢吃什么| 偶发房性早搏是什么意思| 佰草集属于什么档次| 高锰酸钾什么颜色| 水潴留是什么意思| 奚字五行属什么| 验孕棒什么时候测最准确| 肿气肿用什么药比较好| 天顶星座是什么意思| 为什么下雨会打雷| 喝什么牛奶好| 背动态心电图要注意什么| 小心眼什么意思| xo酱是什么酱| 拉磨是什么意思| 什么是闭合性跌打损伤| 蚊子怕什么颜色| 地雷是什么意思| 胆结石挂什么科室| 长痣是什么原因| 脸上长痣是什么原因造成的| 为什么睡觉总是做梦| 牛肉和什么包饺子好吃| 埋线是什么意思| 牛牛是什么意思| 幽门螺杆菌是什么病| 1985年牛五行属什么| 红细胞偏低有什么危害| 夏天肚子疼是什么原因| 炒作是什么意思| 二氧化硅是什么| 梓树为什么叫梧桐树| 吝啬的意思是什么| 丁香是什么| 奥运会五环颜色分别代表什么| 辰砂和朱砂有什么区别| 2021年属什么| 西瓜虫喜欢吃什么| 晚上脚抽筋是什么原因| petct是什么| 咳嗽发烧是什么原因| 直肠炎是什么原因引起| 谷草转氨酶是什么意思| 水对什么| 四月二十六是什么星座| 什么原因导致胎停| 记忆力下降是什么原因引起的| 男人为什么喜欢大胸| 聪明绝顶是什么意思| 曹操是什么生肖| 夏季吃什么菜最好菜谱| 吃柠檬是什么意思| 烫伤用什么| 什么食物降火| 免疫力是什么意思| 女生为什么会喷水| 中国属于什么半球| 吃什么食品减肥| 7.1是什么日子| 什么人容易得淋巴癌| 肛周脓肿吃什么药| 麻药叫什么名字| c反应蛋白偏高是什么原因| 咨询什么意思| 脑筋急转弯什么东西越洗越脏| 牛仔裤配什么上衣好看| ao是什么意思| 爱被蚊子咬是什么体质| 泡脚什么时候泡最好| 美人盂是什么意思| 一日无书下一句是什么| fdi是什么意思| 玉米淀粉能做什么美食| 头发掉要用什么洗发水| 尖斌卡引是什么意思| 姨妈来了吃什么水果好| 葡萄糖输液有什么作用| 叶公好龙告诉我们什么道理| 百度

学习全国“两会”精神

require('strict')
local getArgs
local yesno = require('Module:Yesno')
local lang = mw.language.getContentLanguage()

local CONFIG_MODULE = 'Module:Message box/configuration'
local DEMOSPACES = {talk = 'tmbox', image = 'imbox', file = 'imbox', category = 'cmbox', article = 'ambox', main = 'ambox'}

--------------------------------------------------------------------------------
-- 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 = {}

	-- 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]]
			elseif string.find( demospace, 'talk' ) then
				-- demo as a talk page
				obj.cfg = cfg.tmbox
			else
				-- default to ombox
				obj.cfg = cfg.ombox
			end
		elseif ns == 0 then
			obj.cfg = cfg.ambox -- main namespace
		elseif ns == 6 then
			obj.cfg = cfg.imbox -- file namespace
		elseif ns == 14 then
			obj.cfg = cfg.cmbox -- category namespace
		else
			local nsTable = mw.site.namespaces[ns]
			if nsTable and nsTable.isTalk then
				obj.cfg = cfg.tmbox -- any talk namespace
			else
				obj.cfg = cfg.ombox -- other namespaces or invalid input
			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
	table.insert(self.classes, class)
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
	self.typeImageNeedsLink = typeData.imageNeedsLink

	-- 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
	if self.name then
		self:addClass('box-' .. string.gsub(self.name,' ','_'))
	end
	if yesno(args.plainlinks) ~= false then
		self:addClass('plainlinks')
	end
	for _, class in ipairs(cfg.classes or {}) do
		self:addClass(class)
	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
	
	-- Set image classes.
	self.imageRightClass = args.imagerightclass or args.imageclass
	self.imageLeftClass = args.imageleftclass or args.imageclass

	-- 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
                if self.isSmall then
                    local talkLink = talkArgIsTalkPage and talk or (talkTitle.prefixedText .. (talk == '#' and '' or '#') .. talk)
                    talkText = string.format('([[%s|talk]])', talkLink)
                else
                    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' .. (talk == '#' and '' or '#') .. '%s|talk page]].',
                            talkText,
                            talkTitle.prefixedText,
                            talk
                        )
                    end
                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(" <span class='date-container'><i>(<span class='date'>%s</span>)</i></span>", 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

	-- 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%s|alt=]]', self.typeImage
				or 'Information icon4.svg', imageSize, self.typeImageNeedsLink and "" or "|link=" )
		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
	
	-- set templatestyles
	self.base_templatestyles = cfg.templatestyles
	self.templatestyles = args.templatestyles
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.invalidTypeError then
		local allSort = (self.title.namespace == 0 and 'Main:' or '') .. self.title.prefixedText
		self:addCat('all', 'Wikipedia message box parameter needs fixing', allSort)
	end
	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

	local frame = mw.getCurrentFrame()
	root:wikitext(frame:extensionTag{
		name = 'templatestyles',
		args = { src = self.base_templatestyles },
	})
	-- Add support for a single custom templatestyles sheet. Undocumented as
	-- need should be limited and many templates using mbox are substed; we
	-- don't want to spread templatestyles sheets around to arbitrary places
	if self.templatestyles then
		root:wikitext(frame:extensionTag{
			name = 'templatestyles',
			args = { src = self.templatestyles },
		})
	end

	-- Create the box table.
	local boxTable = root:tag('table')
	boxTable:attr('id', self.id or nil)
	for i, class in ipairs(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'):addClass('mbox-image-div')
		end
		imageLeftCell
			:addClass(self.imageLeftClass)
			: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')
	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) 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('span')
				: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'):addClass('mbox-image-div')
		end
		imageRightCell
			:addClass(self.imageRightClass)
			: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')
			:addClass('mbox-invalid-type')
			: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)
五行代表什么意思 足内翻是什么样子的 信必可为什么轻微哮喘不能用 阴茎勃起不硬吃什么 大学记过处分有什么影响
敬谢不敏是什么意思 百字五行属什么 硫脲是什么 多汗症是什么原因 est.是什么意思
尿蛋白弱阳性是什么意思 台启是什么意思 穿刺是什么手术 丝瓜炒什么 ori是什么意思
红细胞偏低是什么原因 8月10号是什么星座 一什么水井 中学为体西学为用是什么意思 小孩缺锌吃什么补的快
七一年属什么clwhiglsz.com 吃什么补肾壮阳最快速dajiketang.com 肉鸽是什么意思hcv8jop0ns8r.cn 女性检查甲功是什么病hcv8jop1ns9r.cn 孕酮低吃什么药hcv9jop6ns6r.cn
艾灸脚心有什么好处hcv8jop0ns1r.cn qeelin是什么牌子hcv7jop7ns4r.cn 独行侠是什么意思hcv9jop6ns1r.cn 埋汰是什么意思jasonfriends.com 什么是出柜aiwuzhiyu.com
什么是性瘾hcv8jop4ns8r.cn 青钱柳有什么功效与作用hcv8jop9ns1r.cn 佛手柑是什么hcv8jop8ns5r.cn 90岁属什么生肖hcv9jop7ns3r.cn 三叉神经痛吃什么药hcv7jop6ns3r.cn
草莓是什么季节的hcv9jop1ns8r.cn 女人内心强大说明什么hcv8jop5ns9r.cn 1945年是什么年96micro.com 湿疹和荨麻疹有什么区别hcv9jop7ns5r.cn 洗衣机什么牌子最好hcv7jop5ns1r.cn
百度