西安有什么特色美食| 一览无余什么意思| 虫草泡水喝有什么功效| 头上爱出汗是什么原因| 石钟乳是什么意思| 龟头炎用什么软膏最好| 脱线是什么意思| 皮肤溃烂用什么药治愈最快| 什么冰淇淋最贵| 诺如病毒是什么症状| 兰花什么时候开花| 气促是什么意思| 截石位是什么意思| 吃知柏地黄丸有什么副作用| 急性肠胃炎是什么原因引起的| exo是什么意思啊| 移动迷宫到底讲的什么| 早上起来口苦吃什么药| 硬核是什么意思| 广东有什么特产| 做梦梦到牛是什么意思| 士官是什么| 舒服是什么意思| 灵长类动物是指什么| 超声是什么检查| 12月22日什么星座| 三刀六洞什么意思| 女人喝什么茶最好| 脱发严重应该去医院挂什么科| 伊维菌素是什么药| 针眼用什么药| 什么时候跑步最好| 膀胱过度活动症是什么原因引起的| 小孩病毒感染吃什么药| 绿茶不能和什么一起吃| 舌苔黑是什么病| 卤门什么时候闭合| 鲨鱼怕什么| 决定的近义词是什么| 网络拒绝接入什么意思| 干冰是什么| 梦到发大水是什么意思| 马走日是什么意思| 气血亏虚吃什么中成药| 梦见女儿哭意味着什么| 3月7号是什么星座| 这是什么车| 心经是什么意思| 宠物螃蟹吃什么| 前列腺炎吃什么药| 一笑泯恩仇什么意思| 正月初九是什么星座| 什么的帽子| 勿误是什么意思| 上升星座是什么意思| 被螨虫咬了非常痒用什么药膏好| 病退需要什么条件| 痔疮和肛周脓肿有什么区别| 黄体功能不全是什么意思| 炭疽病用什么农药最好| 五心烦热吃什么药| 放河灯是什么节日| 口苦口臭挂什么科| 眼皮老跳是什么原因| 39是什么意思| 羊水穿刺是查什么的| 小孩口臭是什么原因| oioi是什么牌子| 什么是病毒| 文昌星是什么意思| 心率低吃什么药| 龟头责是什么意思| 孤单的我还是没有改变是什么歌| 7月13日是什么星座| 尿道口为什么叫马眼| 什么是基数| 宝宝低烧吃什么药| 碘伏什么颜色| nerdy是什么牌子| 疱疹吃什么药好得快| 公园里有什么有什么还有什么| 蚱蜢吃什么食物| 蛐蛐吃什么| 柴鱼是什么鱼| 肩周炎用什么药好| 03年是什么年| 紫苏叶是什么| 突然尿频是什么原因| 什么是腔梗| nasa是什么牌子| 便秘喝什么茶润肠通便| 成吉思汗叫什么名字| 马住什么意思| 静谧是什么意思| 湫是什么意思| 血尿是什么颜色的| 上海有什么好玩的地方适合小孩子| 眼睛一直跳是什么原因| 孙悟空的真名叫什么| 11号来月经什么时候是排卵期| 怀孕一个月出血是什么情况| 金族念什么| 查凝血酶能查出什么病| adidas是什么牌子| 追求是什么意思| 美国为什么不敢打朝鲜| 生命是什么意思| 女生为什么喊你男神| c蛋白反应高是什么原因| 阿托伐他汀钙片有什么副作用| 抵押什么意思| 眩晕是什么意思| 精神病是什么意思| 湉是什么意思| 办银行卡需要什么证件| 鹰嘴桃什么时候成熟| 2月27是什么星座| 色拉油是什么油| 15年是什么婚| 北海特产有什么值得带| 平痛新又叫什么| 咽喉炎吃什么水果好| 人流后吃什么最补子宫| 什么的高山| 抽血抽不出来是什么原因| 梦见吃樱桃是什么意思| 王一博是什么星座| hpv有什么症状| o型血为什么叫贵族血| 芒果跟什么不能一起吃| 面瘫看什么科室好| 女予念什么| 吃什么减肥效果最好最快| 今年25岁属什么生肖的| 正部级是什么级别| 荸荠读音是什么| 过氧化氢是什么意思| 是什么原因| 眼冒金星是什么原因| 处女座的幸运数字是什么| 细菌性结膜炎用什么药| 维生素b族什么时候吃最好| 碳酸氢钠是什么| 眉心长痘是什么原因| 起薪是什么意思| 尿囊素是什么| 黄辣丁吃什么| 什么样的鼻子| it代表什么| 做梦梦到很多蛇是什么意思| 陶字五行属什么| 神经外科是看什么病的| 小孩子头发黄是什么原因| fed是什么意思| 唯女子与小人难养也什么意思| 开眼镜店需要什么条件| 肠胃属于什么科| 心脏不好吃什么药最好| hh是什么牌子| 二狗子是什么意思| 色觉异常是什么意思| 黄豆煲汤搭配什么最好| 91是什么东西| 5月29日是什么星座| 什么情况下需要做肠镜| 青皮是什么皮| 左肺结节是什么意思| gtp是什么| 吃什么水果最好| opple是什么牌子| 梦见很多小蛇是什么意思| acca是什么专业| 山楂片泡水喝有什么好处| 最近老做噩梦是什么原因| 吃什么保肝护肝| 欺凌是什么意思| 口腔溃疡牙龈肿痛吃什么药| 吃什么生发效果最好| 阴道恶臭是什么原因| 什么是自闭症| 壁虎为什么是五毒之一| 玫瑰糠疹用什么药| 四川人为什么喜欢吃辣| 鼻子干痒是什么原因| sop是什么意思| 脚趾头疼是什么原因| 黄皮果什么味道| 宝宝肋骨外翻是什么原因| 为什么有的女人欲太强| 蜻蜓是什么目| 寻常疣是什么原因造成的| 孩子反复发烧是什么原因| 大作是什么意思| 婴儿不睡觉是什么原因| 弓山文念什么| 舌苔厚黄是什么原因| 凌字五行属什么| 身份证最后一位x是什么意思| 什么东西不能托运| 什么血型好| 小孩几天不大便是什么原因怎么办| 油性头发用什么洗发水| 养狗人容易得什么病| 一个月一个屯念什么| 生殖细胞是什么| 母仪天下什么意思| macd是什么意思| 晚上7点到9点是什么时辰| 天津为什么叫天津卫| 痔疮的初期症状是什么| 乳腺结节应该挂什么科| 李晨的爷爷叫什么| 肥皂剧是什么意思| 为什么老虎头上有王字| 脑梗的前兆是什么| 桥本甲状腺炎吃什么药| 不爽是什么意思| 红烧排骨用什么排骨比较好| 胆囊息肉不能吃什么| 瘦马什么意思| 吃什么可以缓解焦虑| 女人抖腿代表什么意思| 吃什么长骨头最快| 水瓶座什么性格| 如如不动是什么意思| 什么是商业保险| 长期失眠应该吃什么药| 为什么会有荨麻疹| hpv感染有什么表现| 边界感是什么意思| 满天星的花语是什么| 吃什么东西可以除湿气| 急性肠胃炎吃什么| 包皮属于什么科| 负面影响是什么意思| 凤凰男是什么意思| soeasy是什么意思| 11月16号是什么星座| picc是什么| 痛风挂什么科室| o.o什么意思| 什么叫佛系| 昕字取名什么寓意| 女人脚抽筋是什么原因| 吃中药不能吃什么东西| 阎王叫什么名字| c14阳性是什么意思| 什么是黑茶| 女人肾虚吃什么补回来| 梦见鼻子出血是什么意思| 六月十六是什么星座| 鳞状上皮化生什么意思| 一穷二白什么意思| 八哥鸟吃什么| 好好活着比什么都重要| 豕是什么动物| 休学什么意思| 孩子咳嗽吃什么饭菜好| 什么是卡路里| 什么叫脘腹胀痛| 鬼子来了为什么被禁| roa是什么意思| 为什么不能天天喝豆浆| 头晕呕吐挂什么科| 百度Jump to content

Angebote für chinesische Alumni in China

From Wikidata
Lua
CodeDiscussionLinksLink count SubpagesDocumentationTestsResultsSandboxLive code All modules
百度 1

This is a meta-module that implements the message box templates {{Mbox}}, {{Ambox}}, {{Cmbox}}, {{Fmbox}}, {{Ombox}}, and {{Tmbox}}. It is intended to be used from Lua modules, and should not be used directly from wiki pages. If you want to use this module's functionality from a wiki page, please use the individual message box templates instead.

Usage

To use this module from another Lua module, first you need to load it.

local messageBox = require('Module:Message box')

To create a message box, use the main function. It takes two parameters: the first is the box type (as a string), and the second is a table containing the message box parameters.

local box = messageBox.main( boxType, {
    param1 = param1,
    param2 = param2,
    -- More parameters...
})

There are seven available box types:

Box type Template Purpose
mbox {{Mbox}} For message boxes to be used in multiple namespaces
ambox {{Ambox}} For article message boxes
cmbox {{Cmbox}} For category message boxes
fmbox {{Fmbox}} For interface message boxes
tmbox {{Tmbox}} For talk page message boxes
ombox {{Ombox}} For message boxes in other namespaces

See the template page of each box type for the available parameters.

Usage from #invoke

As well as the main function, this module has separate functions for each box type. They are accessed using the code {{#invoke:Message box|mbox|...}}, {{#invoke:Message box|ambox|...}}, etc. These will work when called from other modules, but they access code used to process arguments passed from #invoke, and so calling them will be less efficient than calling main.

Technical details

The module uses the same basic code for each of the templates listed above; the differences between each of them are configured using the data at Module:Message box/configuration. Here are the various configuration options and what they mean:

  • types - a table containing data used by the type parameter of the message box. The table keys are the values that can be passed to the type parameter, and the table values are tables containing the class and the image used by that type.
  • default - the type to use if no value was passed to the type parameter, or if an invalid value was specified.
  • showInvalidTypeError - whether to show an error if the value passed to the type parameter was invalid.
  • allowBlankParams - usually blank values are stripped from parameters passed to the module. However, whitespace is preserved for the parameters included in the allowBlankParams table.
  • allowId - whether it is possible to set an "id" attribute to the html table tag.
  • allowSmall - whether a small version of the message box can be produced with "small=yes".
  • smallParam - a custom name for the small parameter. For example, if set to "left" you can produce a small message box using "small=left".
  • smallClass - the class to use for small message boxes.
  • substCheck - whether to perform a subst check or not.
  • classes - an array of classes to use with the message box.
  • usePlainlinksParam - whether to allow "plainlinks=no" to turn off the plainlinks class.
  • imageEmptyCell - whether to use an empty <td>…</td> cell if there is no image set. This is used to preserve spacing for message boxes with a width of less than 100% of the screen.
  • imageEmptyCellStyle - whether empty image cells should be styled.
  • imageCheckBlank - whether "image=blank" results in no image being displayed.
  • imageSmallSize - usually, images used in small message boxes are set to 30x30px. This sets a custom size.
  • imageCellDiv - whether to enclose the image in a div enforcing a maximum image size.
  • useCollapsibleTextFields - whether to use text fields that can be collapsed, i.e. "issue", "fix", "talk", etc. Currently only used in ambox.
  • imageRightNone - whether imageright=none results in no image being displayed on the right-hand side of the message box.
  • sectionDefault - the default name for the "section" parameter. Depends on useCollapsibleTextFields.
  • allowMainspaceCategories - allow categorisation in the main namespace.
  • templateCategory - the name of a category to be placed on the template page.
  • templateCategoryRequireName - whether the name parameter is required to display the template category.
  • templateErrorCategory - the name of the error category to be used on the template page.
  • templateErrorParamsToCheck - an array of parameter names to check. If any are absent, the templateErrorCategory is applied to the template page.

Code

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)
什么河没有水 老人说胡话是什么征兆 什么中药能降血压 鹿沼土是什么土 发票抬头是什么
念叨是什么意思 夹不住尿是什么原因 什么花适合送老师 老婆的妈妈叫什么 高血脂吃什么
禅茶一味什么意思 成也萧何败也萧何什么意思 精神内科一般检查什么 缺钾什么症状 什么叫六亲
为什么不建议切除脂肪瘤 想吐是什么原因 小孩老咳嗽是什么原因 解酒吃什么药 把子肉是什么肉
秋葵长什么样hcv8jop9ns7r.cn 头皮痒是什么原因hcv8jop6ns6r.cn 发烧了吃什么药hcv7jop4ns5r.cn hiv弱阳性是什么意思ff14chat.com 水泥烧伤皮肤用什么药helloaicloud.com
中国国菜是什么菜hcv8jop4ns6r.cn 谷草转氨酶偏高是什么意思hcv8jop1ns0r.cn 骨裂吃什么药hcv9jop5ns2r.cn 血压低是什么症状hcv9jop6ns7r.cn 花苞裤不适合什么人穿hcv8jop2ns9r.cn
肾尿盐结晶是什么意思hcv8jop5ns5r.cn 口苦吃什么好wzqsfys.com 如来佛祖和释迦牟尼是什么关系hcv7jop6ns2r.cn 臆想症是什么youbangsi.com 世界上最难的字是什么hcv9jop1ns0r.cn
叶酸什么时间段吃最好hcv9jop2ns0r.cn 高血压吃什么hcv8jop9ns2r.cn 为什么会子宫内膜增厚hcv7jop9ns0r.cn 弱阳性和阳性有什么区别hcv9jop4ns9r.cn 树木什么wmyky.com
百度