酒是什么味道| 紫砂壶泡什么茶最好| 五不遇时是什么意思| 一个木一个舌读什么| 葡萄糖升高说明什么| 种植什么最赚钱农村| 骆驼吃什么| 乙肝有抗体是什么意思| 草鱼又叫什么鱼| 端午节喝什么酒| 秦皇岛为什么叫秦皇岛| 焦点是什么意思| 女人左眼下有痣代表什么| 33周岁属什么生肖| cta是什么意思| 脖子痛挂什么科| 骨折用什么药恢复快| 金刚芭比什么意思| 东莞有什么好玩的地方| 4月什么星座| 心绞痛是什么原因引起的| 肝右叶占位是什么意思| 老人大便失禁是什么原因| 指示是什么意思| 梦见老人死了又活了是什么意思| 三界牌是什么| 子宫内膜厚是什么意思| 包皮是什么| 干呕是什么病的前兆| cc是什么| 监狱长是什么级别| 九知道指的是什么| 血虚吃什么中成药最好| std是什么意思| 检查视力挂什么科| 潜叶蝇打什么药效果好| 双环醇片治什么病| 鸭胗是什么器官| 荨麻疹长什么样| 事宜是什么意思| 小月子吃什么水果| 中元节是什么节日| 宰相是现在的什么官| 宝宝咳嗽吃什么药好| 甲状腺一般吃什么药| 头皮长疙瘩是什么原因| 亦字五行属什么| 中医治未病是什么意思| 早上眼屎多是什么原因| 香蕉对身体有什么好处| 微量蛋白尿高说明什么| 屋漏偏逢连夜雨是什么意思| 痛风吃什么比较好| 这个人就是娘是什么歌| 饿是什么感觉| 骨折什么症状| 儿童风寒感冒吃什么药| 女性尿路感染挂什么科| 课代表是什么意思| 吃灵芝有什么好处| 什么关系| 文爱 什么意思| 真菌感染是什么引起的| 声音的传播需要什么| 气管炎吃什么食物好| 蝎子吃什么| 阑尾粪石是什么| 肝钙化是什么意思| 吃什么减肥快| 一节黑一节白是什么蛇| 颈椎病挂什么科| 腋下长痘痘是什么原因| 摸头杀是什么意思| 逻辑性是什么意思| 乌鸡不能和什么一起吃| 菠萝和凤梨有什么区别| 拍花子是什么意思| aldo是什么牌子| 宋江是什么生肖| 北阳台适合种什么植物| 感染hpv有什么症状| 精索静脉曲张挂什么科| 银河系的中心是什么| 灰指甲医院挂什么科| 胃癌低分化是什么意思| 什么东西掉进水里不会湿| 侧睡流口水是什么原因| 长期贫血对身体有什么危害| 伤口恢复吃什么好得快| 皮肤一碰就破是什么病| 梦见掉牙是什么意思| 今天立冬吃什么| 腰间盘突出压迫神经什么症状| 双向情感障碍吃什么药| 月经三个月没来是什么原因| 痛经吃什么水果| 验光是什么意思| 什么颜色衣服显白| MR医学上是什么意思| 前门大街有什么好玩的| 白色念珠菌是什么意思| 俊俏是什么意思| 突然晕倒是什么原因造成的| 月经不调是什么症状| 痛风喝酒会有什么后果| 什么叫更年期| 梦见在河里抓鱼是什么征兆| 胆囊大是什么原因| 人什么什么事的成语| 猫代表什么象征意义| 心肌缺血是什么症状| 心脏在什么位置图片| 计算机二级什么时候查成绩| 溃疡性结肠炎有什么症状| 太阳穴胀痛是什么原因| Ecmo医学上是什么意思| 市场部是做什么的| 弧度是什么意思| 体癣是什么原因引起的| 什么神什么注| 吃什么补津液| d3什么时候吃效果最好| 晚上吃什么减肥效果最好| 健脾胃吃什么食物好| 为什么会流口水| 脚脖子粗是什么原因| 无聊干什么| 八月一号是什么星座| 武汉有什么好吃的| 5月13日什么星座| 小孩肚子疼拉肚子吃什么药| 纳氏囊肿是什么意思| 吞服是什么意思| 三月三十号是什么星座| 松香对人体有什么危害| 鞘膜积液挂什么科| 4月23日是什么星座| 杠杆是什么意思| 儿童办理护照需要什么材料| 淋巴挂什么科| 脚为什么脱皮| 释迦果吃了有什么好处| pearl是什么意思| 毕生是什么意思| 钾高是什么原因造成的| 蓝牙耳机什么品牌好| 喉咙发炎吃什么水果好| 吃什么容易长胖| 淡泊名利是什么意思| 耳塞戴久了有什么危害| 仟字五行属什么| 柠檬水有什么功效| 集训是什么| 打酱油是什么意思啊| 走麦城是什么意思| 割包皮什么意思| 二花是什么中药| 植物神经紊乱挂什么科| 豆腐不能和什么一起吃| 配制酒是什么意思| 10月13号是什么星座| 腋下臭是什么原因| 什么含钾最多| 比熊吃什么牌子狗粮好| yonex是什么品牌| 葛根粉吃了有什么作用| 男性内分泌失调有什么症状| 梦见芹菜是什么意思| 老是掉发是什么原因| 甲亢不能吃什么| 硕士研究生是什么意思| 百废待兴是什么意思| 草果长什么样| 什么是肾虚| 风湿看什么科室| 母亲节送什么花| 植树节是什么时候| 全血细胞减少是什么意思| 胎盘下缘覆盖宫颈内口是什么意思| 静脉血栓是什么症状| 男人割了皮包什么样子| 电轴左偏是什么原因| giordano是什么牌子| 好女人的标准是什么| 三斤八两什么意思| 扁桃体发炎吃什么好得快| 海水为什么是蓝色的| 胆囊壁增厚是什么意思| 百花齐放是什么生肖| 什么是无纺布| 梦见吃蜂蜜是什么预兆| 冰冻三尺非一日之寒什么意思| 顺遂是什么意思| 为什么老是放屁| 喝水呛咳是什么原因| 洗面奶什么时候用最好| 欢是什么动物| 寒食节是什么意思| 什么是狂躁症| 做活检意味着什么| 做血常规检查挂什么科| 20至30元什么烟最好抽| 办理护照需要什么资料| 纤维是什么意思| 岁月如梭是什么意思| 补办医保卡需要什么资料| 眼神迷离是什么意思| 专科有什么专业| 脱毛膏是什么原理| 装修都包括什么| 得艾滋病的人有什么症状| 喘不上气是什么原因| 非萎缩性胃炎伴糜烂吃什么药| 失眠吃什么药效果好| 吃什么长指甲最快| 88年属什么生肖| 山加乘念什么| 天宫是什么意思| 土命是什么意思| 心不在焉什么意思| 梦到鹦鹉预示着什么| 本科是什么意思| 麻酱是什么做的| 气喘是什么原因| 脱肛吃什么药最有效| 一什么花瓣| 老娘们是什么意思| 补肾吃什么药好| 楔形是什么形状| 诸多是什么意思| 免疫力低吃什么药| 双顶径和头围有什么区别| 斑鸠幼鸟吃什么| 一只什么| 小寒节气的含义是什么| 多多益善的益是什么意思| 弥漫性病变是什么意思| CA是什么激素| 肛门是什么意思| 宝宝消化不好吃什么调理| 1989年属什么生肖| 98属什么| 看膝盖挂什么科| 曹丕为什么不杀曹植| 军加皮念什么| 月经后期是什么意思| 片仔癀为什么这么贵| 汗斑是什么样的图片| 托大是什么意思| 时尚是什么意思| 软骨炎吃什么药| 看好你是什么意思| 什么可以补气血| 什么是我的| 肠穿孔有什么症状| 桑葚什么时候成熟| 有点拉肚子吃什么药| 高血压检查什么项目| 中药为什么要热着喝| 八哥吃什么| 包皮炎用什么软膏| 交织是什么意思| 胃糜烂吃什么药最好| 水痘疫苗什么时候打| 百度Jump to content

两岸光电产业厦门对接,携手合作助推转型升级

Go tswa ko Wikipedia
百度 架起中外沟通的桥梁“多年来,我一直有个梦想,让越来越多的中国标准走向世界。

Documentation for this module may be created at Module:Message box/doc

require('Module:No globals')
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

	-- 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

	-- 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)
                    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#%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|link=|alt=]]', self.typeImage
				or 'Imbox notice.png', 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
	
	-- 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 = 'go simolola ka'
	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
			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: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
			: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)
老人脚肿是什么征兆 资治通鉴讲的是什么 kp是什么意思 长期玩手机会得什么病 用什么锅炒菜对人体健康更有益
一个人自言自语的说话是什么病 门字五行属什么 火龙果和香蕉榨汁有什么功效 女人脑供血不足吃什么 皮卡丘站起来变成了什么
桑蚕丝用什么洗最好 喜欢的反义词是什么 圣字五行属什么 一拃是什么意思 怀孕吃叶酸有什么用
黑道是什么意思 紫微星是什么意思 什么药治痔疮最快 指纹不清晰是什么原因 hpmc是什么
赟怎么读 什么意思hcv9jop6ns3r.cn 屁多什么原因hcv8jop7ns8r.cn 什么样的人容易高原反应naasee.com 转氨酶高是什么情况hcv9jop0ns7r.cn 夏天哈尔滨有什么好玩的地方hcv9jop2ns5r.cn
1882年属什么生肖hcv9jop0ns8r.cn 甲沟炎用什么药hcv7jop6ns5r.cn 粉刺长什么样图片hcv9jop5ns2r.cn 肺部感染有什么症状hcv9jop0ns6r.cn 身强力壮是什么生肖hcv8jop8ns7r.cn
当归有什么功效hcv9jop3ns3r.cn 楚国是现在的什么地方gangsutong.com 查hcg挂什么科hcv9jop6ns4r.cn 早泄是什么意思hcv8jop9ns3r.cn 身上经常痒是什么原因hcv8jop7ns8r.cn
生性是什么意思hcv8jop2ns8r.cn 不饱和脂肪酸是什么意思hcv9jop1ns2r.cn 身体潮湿是什么原因hcv7jop9ns7r.cn 头晕为什么做眼震检查hcv7jop7ns3r.cn 杜甫被人们称为什么hcv8jop0ns8r.cn
百度