张国立老婆叫什么名字| 丝瓜为什么会变黑| 孕妇肠胃炎能吃什么药| 装修都包括什么| 珀莱雅属于什么档次| 卡地亚蓝气球什么档次| 虾青素有什么功效| 男士阴囊湿疹用什么药膏| 梦见拔牙是什么预兆| 口唇发绀是什么意思| 嘴角上方有痣代表什么| 吃维生素a有什么好处| 南京是什么省| 什么地找| 水果的英文是什么| 房性早搏什么意思| 循证是什么意思| 眼睛胀是什么原因| 牙龈疼痛吃什么药| 什么是德行| 女人被插入是什么感觉| 尿渗透压低是什么原因| 大名鼎鼎的鼎是什么意思| 什么叫混合斑块| yp是什么| 条件兵是什么意思| 拔牙后能吃什么| 辽宁古代叫什么| 身份证后面有个x是什么意思| 哮喘是什么原因引起的| 30岁以上适合用什么牌子的护肤品| 凌寒独自开的凌是什么意思| 01什么意思| 晚上8点是什么时辰| 周瑜属什么生肖| 梅毒查血查什么项目| 感冒干咳无痰吃什么药| 欧巴桑什么意思| 心率过快吃什么药| 宫颈醋酸白色上皮是什么病变| 女性感染梅毒有什么症状| 死水是什么| 静脉曲张有什么表现| 然五行属什么| 小乌龟死了有什么预兆| 小月子可以吃什么水果| 一年四季穿棉衣是什么生肖| 正负得什么| 吃什么可以控制血糖| 00年是什么命| 顺产和剖腹产有什么区别| 封心锁爱什么意思| 过敏看什么科| 梦见煮饭是什么意思| touch是什么牌子| 水泡型脚气用什么药| 书五行属什么| 甲状腺4级是什么意思| 想做肠镜挂什么科| 梦见已故的老人是什么意思| kailas是什么牌子| 怀孕第一个月有什么特征| 可怜巴巴的意思是什么| 血粘度查什么项目| 苁蓉有什么功效| 琬字五行属什么| 防代表什么生肖| 解酒喝什么好| 什么是乐高| eason是什么意思| 七四年属什么生肖| 胶体金法是什么意思| 气泡音是什么意思| 准生证什么时候办| 窦性心动过速是什么原因| 七月二十九是什么星座| 浓绿的什么| 慧外秀中什么意思| 什么是蓝颜知己| 带状疱疹挂什么科| 买车选什么品牌| 皮肤黄吃什么可以改善| 宫腔积液吃什么药效果最好| 医是什么结构| 肺纤维化是什么病| 钡餐造影能查出什么| 美人盂是什么意思| 巨蟹座幸运花是什么| 日本人为什么长寿| 肠胃炎拉肚子吃什么药| 高压高是什么原因| 为什么嗓子总有痰| 大地色眼影是什么颜色| 水彩笔用什么能洗掉| 哇哦什么意思| 牙齿遇热就疼什么原因| 一模一样的意思是什么| salomon是什么牌子| 少字五行属什么| 鲁迅的真名叫什么| 什么是| 众星捧月是什么意思| 空调一级能效什么意思| 七星鱼吃什么食物| 工会主席是什么级别| 白鳍豚用什么呼吸| 弘字五行属什么| 拉郎配是什么意思| 七月三十是什么星座| 大师是什么意思| 喝蒲公英根有什么好处| 氯雷他定片治什么病| 六月十七是什么星座| 高脂血症吃什么药| 清理鱼缸粪便用什么鱼| 吃什么去肝火效果最好| 无期徒刑是什么意思| 惊蛰是什么季节| 小动脉瘤是什么意思| 脂肪肝吃什么中药| 九地是什么中药| 狮子座和什么座最配| 开光的手串有什么禁忌| 省管干部是什么级别| 梦见打井是什么意思| 肝阳性是什么意思| 什么时候种玉米| 梅雨季节是什么意思| 公丁香和母丁香有什么区别| ysl属于什么档次| 龙蛇混杂是什么生肖| 半夜十二点是什么时辰| 觊觎什么意思| honor是什么牌子的手机| ikbc是什么牌子| 吃什么愈合伤口恢复最快| 白案是什么意思| 疣长什么样子| 肝脓肿是什么病严重吗| 下旬是什么意思| 磨破皮了涂什么药| 什么人不适合喝咖啡| 经常吃土豆有什么好处| 淀粉是什么粉| 荔枝和什么吃会中毒| 脾肾阳虚吃什么药| 阴道发痒是什么原因| 什么是造口| 姬松茸和什么煲汤最佳| 什么数码相机好| 阳痿吃什么中成药| 狗狗体内驱虫用什么药最好| 月经期吃什么水果好| 单纯疱疹病毒吃什么药| dove什么意思| 庚金是什么意思| 脂蛋白磷脂酶a2高说明什么| 阴茎皮开裂是什么原因| 转氨酶高吃什么药最好| 虎父无犬女是什么意思| emba是什么意思| 食神生财是什么意思| 排骨炖什么菜好吃| 贪小失大什么意思| 氨基酸什么牌子好| 有毒是什么意思| 伏特加兑什么饮料好喝| 理工科是什么意思| 水宝宝是什么| 身份证x代表什么意思| 吃青提有什么好处| 血压低吃什么| 棉纱是什么面料| 特种兵是干什么的| 大校相当于地方什么级别| 不长毛的猫叫什么名字| 什么叫埋下伏笔| 喝什么茶减肥效果最好| 木行念什么| 脂蛋白a高吃什么能降下来| 心率过快是什么原因| 减脂是什么意思| 治霉菌性阴炎用什么药好得快| lb是什么| 调剂生是什么意思| 北芪煲汤加什么药材好| 痰有腥臭味是什么原因| 小猫喜欢什么颜色| 严肃的什么| 真正的朋友是什么| 幽闭是什么意思| 南瓜为什么叫南瓜| 下午5点半是什么时辰| 什么叫关税| 出汗吃什么药| 人乳头瘤病毒感染是什么意思| 尿液发绿是什么原因| 五花八门什么意思| 为什么喉咙总感觉有东西堵着| 吃海鲜忌什么| 血糖为什么会高| 宝宝吐奶是什么原因| 什么是精神出轨| 里字五行属什么| mac是什么牌子口红| 1979是什么年| 白细胞少了会得什么病| 唇亡齿寒什么意思| 甲状腺应该挂什么科| 6月12日是什么星座| 尿毒症能吃什么水果| 地壳是什么| 每天早上起床头晕是什么原因| 什么是打飞机| 眼睛发胀是什么原因| 膝盖积液用什么药最好| 千金是什么生肖| 偶发室上性早搏是什么意思| 不二人选是什么意思| 诺氟沙星胶囊治什么| 李子什么季节成熟| 彩礼什么时候给女方| 早谢是什么症状| 指甲小月牙代表什么| 汗多尿少是什么原因| 花中之王是什么花| 12356是什么电话| 宇字属于五行属什么| 荨麻疹打什么针好得快| 什么是格言| 送同学什么生日礼物好| 降压药什么药好| 复仇者用什么武器| 梦到掉头发是什么意思| 儿童乘坐高铁需要什么证件| 羡字五行属什么| 水为什么是蓝色的| 女性排卵期出血是什么原因| 奇花异草的异是什么意思| 马头岩肉桂是什么茶| 老婆生日送什么鲜花| 栀子花叶子发黄是什么原因| 看十全十美是什么生肖| 眼睛干涩模糊用什么眼药水| 转氨酶高吃什么食物降得快| 普外科是什么科| 五行什么生水| 灰指甲用什么药最好| 尿液阳性是什么意思| 屈原是什么朝代| 狮子座是什么星座| 四物汤什么时候喝| mds是什么意思| 感冒应该挂什么科| 政绩是什么意思| 东南属什么五行| 董事总经理是什么职位| 什么是血管瘤| 碱水是什么| 出汗发粘是什么原因| 减肥期间可以喝什么茶| 心烦意乱是什么意思| 胸膜炎是什么症状| 梦见穿新裤子是什么意思| 百度Jump to content

[新闻直播间]法国 举行大规模罢工示威游行 民众抗议政府系列改革措施

Permanently protected module
From Wikipedia, the free encyclopedia
This is the current revision of this page, as edited by Pppery (talk | contribs) at 21:53, 29 January 2025 (Copy from sandbox per request). The present address (URL) is a permanent link to this version.
(diff) ← Previous revision | Latest revision (diff) | Newer revision → (diff)

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)
椰子煲鸡汤放什么材料 医学检验技术是什么 认贼作父是什么意思 螃蟹不能和什么食物一起吃 词牌名是什么意思
教师节贺卡上写什么 故作矜持的意思是什么 服装属于五行什么行业 太是什么意思 厚颜无耻是什么生肖
天麻与什么煲汤最好 929是什么星座 泌乳素什么时候查最准确 血糖高对身体有什么危害 阴茎硬不起吃什么药
321是什么意思 干性皮肤适合什么牌子的护肤品 鸡腿炖什么好吃 肚脐左侧按压疼是什么原因 呃逆是什么意思
小肠炖什么好吃又营养hcv9jop5ns7r.cn 违反禁令标志指示什么意思aiwuzhiyu.com 尺码m是什么意思bfb118.com 黑便是什么原因hcv8jop1ns6r.cn 去医院测血糖挂什么科hcv7jop9ns6r.cn
嗜酸性粒细胞偏低是什么意思hcv9jop0ns8r.cn 左肺上叶纤维灶是什么意思hcv9jop2ns1r.cn 身在其位必谋其职是什么意思hcv7jop7ns2r.cn 什么属相不能养龙鱼hcv8jop6ns7r.cn 牙齿发酸是什么原因helloaicloud.com
为的笔顺是什么hcv7jop9ns6r.cn 今年为什么闰六月hcv8jop8ns7r.cn 口是心非是什么生肖zhiyanzhang.com 牛郎织女是什么意思hcv8jop9ns4r.cn 一个月不来月经是什么原因hcv8jop7ns2r.cn
剥皮实草是什么意思hcv8jop8ns4r.cn sakose是什么牌子hcv9jop4ns0r.cn 2014属什么生肖hcv8jop3ns6r.cn 4月8号是什么星座hcv8jop6ns7r.cn 右边脑袋疼是什么原因hcv7jop6ns9r.cn
百度