吃洋葱对身体有什么好处| 孔子是什么学派的创始人| 低压是什么意思| 河豚为什么有毒| 蛋糕用什么奶油好| 身份证穿什么颜色的衣服| 阴虚吃什么中成药| 什么都不放的冬瓜清汤| 流产会出现什么症状| 女人高潮是什么感觉| 带id是什么意思| 压床是什么意思| 玄女是什么意思| 不还信用卡有什么后果| 什么减肥药好使| 下作是什么意思| 前降支中段心肌桥什么意思| 颞颌关节紊乱挂什么科| 女人小腹坠痛是什么原因| 戴菊是什么| 虱子用什么药可以根除| 皮肤黑穿什么颜色的衣服显白| 讲解是什么意思| 孜然是什么| 渣男之首是什么星座| 智齿长什么样子| 一热就咳嗽是什么原因| 豆腐干炒什么好吃| 月牙是什么意思| evisu是什么牌子中文| 城市的夜晚霓虹灯璀璨是什么歌| 沈阳是什么省| 灰指甲是什么样子| 种植牙有什么危害| 淋巴细胞计数偏高是什么原因| zoey是什么意思| 胸腔积液叩诊什么音| 多囊肾是什么意思| 胎停有什么症状或征兆吗| 热锅凉油是什么意思| 羽字属于五行属什么| 君子什么意思| 土固念什么| 杜甫号什么| 飧泄是什么意思| 盆腔ct能检查出什么病| 湘字五行属什么的| 什么是英语自然拼读| 胰腺炎是什么病| 青衣是什么意思| 膈是什么器官| 姚晨为什么不红了| 浅褐色是什么颜色| ost是什么意思| 潮热盗汗是什么意思| 女性为什么会得疱疹| 东吴是现在的什么地方| 胃反流有什么症状| journey是什么意思| 拔智齿挂什么科| 朝鲜人一日三餐吃什么| 田七煲汤配什么材料| 高锰酸钾有什么作用| 肾积水是什么原因造成的怎么治疗| 睡眠不好是什么原因引起的| 1994属什么| 月经安全期是什么时候| 做什么检查需要空腹| 乌龟吃什么食物| 白色裤子配什么上衣好看| 什么不息| 刘海是什么意思| 沙眼是什么| 爱长闭口用什么护肤品| 耳朵听不清楚是什么原因| 脸上长闭口是什么原因导致的| 蜱虫的天敌是什么| 尿比重1.030是什么意思| 象牙带身上有什么好处| 荡漾是什么意思| 忌廉是什么东西| 杯酒释兵权是什么意思| 三个代表代表了什么| 拉肚子吃什么药最有效果| tony是什么意思| mpd是什么意思| 什么牛什么毛| 右冠优势型是什么意思| 股票套牢是什么意思| 什么情况| 白醋泡脚有什么效果| 许三多最后是什么军衔| blanc什么意思| 流变是什么意思| 白油是什么| 直肠肿瘤不能吃什么| 做什么来钱快| 看食道挂什么科室| 头部MRI检查是什么意思| 夏威夷果吃了有什么好处| 4月20号是什么星座| hope是什么意思啊| 老想睡觉是什么原因| 菁是什么意思| 什么是冤亲债主| 耳鸣是什么原因| 急性肠胃炎是什么引起的| 搪塞什么意思| 指甲软是什么原因| 什么是卤水| 肚子疼用什么药好| 警告处分有什么影响| 高凝状态是什么意思| 秀五行属什么| 急性牙髓炎吃什么药| 尿失禁用什么药好| 预科班什么意思| 梦见梳头发是什么意思| 为什么低烧比高烧可怕| 马眼棒是什么| 什么是结扎| 生物酶是什么东西| 蛋白粉什么时候吃最好| 什么鸟好养又与人亲近| 蛇吐信子是什么意思| 鼻炎是什么引起的| 烟青色是什么颜色| 中午吃什么| 四面弹是什么面料| 小暑是什么季节| 脸上不出汗是什么原因| 布洛芬缓释胶囊有什么副作用| 购物狂是什么心理疾病| 黄山四绝是什么| 宫颈癌是什么引起的| 什么是碳水化合物食物| 瞳距是什么| 当伴郎有什么讲究| 月经不调是什么原因| 指甲发黄是什么原因| 什么是生源地| 产检建档需要什么资料| 梦见车丢了是什么征兆| 什么芦荟可以直接擦脸| 毒龙钻是什么意思| 条件反射是什么意思| 暮光是什么意思| 照字五行属什么| gst什么意思| 斯什么意思| 月经期间同房有什么危害| 自白是什么意思| 喉咙咳出血是什么原因| 为什么会细菌感染| 便便是绿色的是什么原因| 恶心想吐是什么原因| 9点是什么时辰| 霸王花煲汤放什么材料| 宫口开了有什么症状| 一月十二号是什么星座| 眼睛双重影什么原因| 什么是想象力| bossini是什么牌子| 去迪拜打工需要什么条件| 有且仅有什么意思| 什么是开悟| 果丹皮是用什么做的| 什么是乳胶床垫| 美的e3是什么故障| ar技术是什么意思| 甲低有什么症状表现| 606是什么意思| aa是什么| 420是什么意思| 边界是什么意思| 苦荞茶有什么功效| 血压低头晕是什么原因导致的| 舌头发黄是什么病| 一血是什么意思| 无极调光是什么意思| 12月2日什么星座| 胎心停了会有什么症状| 水鸭是什么鸭| 贵人命是什么意思| c1和c2有什么区别| cpf是什么意思| 一五行属性是什么| 老公不交工资意味什么| 6月9号什么星座| 皮肤病吃什么药最好| 哈吉斯牌子是什么档次| 嘴上有痣代表什么| 巨细胞病毒igm阳性是什么意思| m是什么意思| 天然气主要成分是什么| 女性白带有血丝是什么原因| 圈层是什么意思| 什么叫青光眼| 泌尿感染是什么症状| 氯化钠是什么| 大姨妈吃什么水果最好| 2.16是什么星座| 火是什么| 不止是什么意思| hcg是什么激素| 嗓子干疼吃什么药| 胃间质瘤为什么不建议切除| 什么人容易得骨髓瘤| cba什么时候开始比赛| 为什么会经常流鼻血| 新疆人是什么民族| 释然是什么意思| 掉以轻心是什么意思| 男人地盘是什么生肖| 7一9点是什么时辰| 出入是什么意思| 木瓜吃了有什么好处| 疲劳是什么意思| 7月3日是什么日子| 绀是什么意思| 什么是全麦面粉| 喝啤酒尿多是什么原因| 卫生纸是什么垃圾| 野什么意思| 葳蕤是什么意思| 敕是什么意思| 布洛芬属于什么类药物| psa是什么| 脑干诱发电位检查是检查什么| 肝不好有些什么症状| camel是什么意思| 急性肠胃炎是什么引起的| 尿道口灼热感吃什么药最快| 注意身体是什么意思| 雌激素分泌过多是什么原因引起的| 玲珑是什么意思| 什么兽| 手足口病忌口什么食物| 腹主动脉壁钙化是什么意思| 头顶痛吃什么药效果好| butter是什么意思| 什么叫小三阳| 官星是什么意思| 转注是什么意思| 冠心病做什么检查| 镜检白细胞是什么意思| 鱼腥草是什么| 记忆力不好吃什么| 今日什么冲什么生肖| 什么食物降血压| 晟是什么字| 糖尿病适合喝什么饮料| 六味地黄丸有什么副作用| 口臭吃什么药效果最好| 胃热口干口苦口臭吃什么药好| 余数是什么| 吃什么升白细胞比较快| 梦见朋友离婚了是什么意思| 息肉病变什么意思| 送老师送什么礼物好| 宫颈糜烂是什么原因引起的| 鸟衣念什么| 心火大吃什么能清火| 澳门区花是什么花| 百度Gaan na inhoud

“客户首选、员工为荣” 中国工商银行丰泽支

in Wikipedia, die vrye ensiklopedie
百度 在宣布限制中国产品的关税措施后,美方特意又说了几句“这不是贸易战”“中国是朋友”等安抚北京的话,希望中方在受到惊吓后,接受这个台阶,顺着美方的意志只保留一个面子,丢下中国商业利益的里子。

Dokumentasie vir hierdie module kan geskep word by: Module:Protection banner/doc

-- This module implements {{pp-meta}} and its daughter templates such as
-- {{pp-dispute}}, {{pp-vandalism}} and {{pp-sock}}.

-- Initialise necessary modules.
require('strict')
local makeFileLink = require('Module:File link')._main
local effectiveProtectionLevel = require('Module:Effective protection level')._main
local effectiveProtectionExpiry = require('Module:Effective protection expiry')._main
local yesno = require('Module:Yesno')

-- Lazily initialise modules and objects we don't always need.
local getArgs, makeMessageBox, lang

-- Set constants.
local CONFIG_MODULE = 'Module:Protection banner/config'

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

local function makeCategoryLink(cat, sort)
	local nsText = mw.site.namespaces[14].name
	if cat and sort then
		return string.format(
			'[[%s:%s|%s]]',
			nsText,
			cat,
			sort
		)
	elseif cat then
		return string.format(
			'[[%s:%s]]',
			nsText,
			cat
		)
	else
		return ''
	end
end

-- Validation function for the expiry and the protection date
local function validateDate(dateString, dateType)
	lang = lang or mw.language.getContentLanguage()
	local success, result = pcall(lang.formatDate, lang, 'U', dateString)
	if success then
		result = tonumber(result)
		if result then
			return result
		end
	end
	error(string.format(
		'invalid %s ("%s")',
		dateType,
		tostring(dateString)
	), 4)
end

local function makeFullUrl(page, query, display)
	return string.format(
		'[%s %s]',
		tostring(mw.uri.fullUrl(page, query)),
		display
	)
end

local function toTableEnd(t, pos)
	-- Sends the value at position pos to the end of array t, and shifts the
	-- other items down accordingly.
	return table.insert(t, table.remove(t, pos))
end

local function walkHierarchy(hierarchy, start)
	local toWalk, retval = {[start] = true}, {}
	while true do
		-- Can't use pairs() since we're adding and removing things as we're iterating
		local k = next(toWalk) -- This always gets the "first" key
		if k == nil then break end
		toWalk[k] = nil
		retval[k] = true
		for _,v in ipairs(hierarchy[k]) do
			if not retval[v] then
				toWalk[v] = true
			end
		end
	end
	return retval
end

--------------------------------------------------------------------------------
-- Protection class
--------------------------------------------------------------------------------

local Protection = {}
Protection.__index = Protection

Protection.supportedActions = {
	edit = true,
	move = true,
	autoreview = true,
	upload = true
}

Protection.bannerConfigFields = {
	'text',
	'explanation',
	'tooltip',
	'alt',
	'link',
	'image'
}

function Protection.new(args, cfg, title)
	local obj = {}
	obj._cfg = cfg
	obj.title = title or mw.title.getCurrentTitle()

	-- Set action
	if not args.action then
		obj.action = 'edit'
	elseif Protection.supportedActions[args.action] then
		obj.action = args.action
	else
		error(string.format(
			'invalid action ("%s")',
			tostring(args.action)
		), 3)
	end

	-- Set level
	obj.level = args.demolevel or effectiveProtectionLevel(obj.action, obj.title)
	if not obj.level or (obj.action == 'move' and obj.level == 'autoconfirmed') then
		-- Users need to be autoconfirmed to move pages anyway, so treat
		-- semi-move-protected pages as unprotected.
		obj.level = '*'
	end

	-- Set expiry
	local effectiveExpiry = effectiveProtectionExpiry(obj.action, obj.title)
	if effectiveExpiry == 'infinity' then
		obj.expiry = 'indef'
	elseif effectiveExpiry ~= 'unknown' then
		obj.expiry = validateDate(effectiveExpiry, 'expiry date')
	elseif args.expiry then
		if cfg.indefStrings[args.expiry] then
			obj.expiry = 'indef'
		elseif type(args.expiry) == 'number' then
			obj.expiry = args.expiry
		else
			obj.expiry = validateDate(args.expiry, 'expiry date')
		end
	end

	-- Set reason
	if args[1] then
		obj.reason = mw.ustring.lower(args[1])
		if obj.reason:find('|') then
			error('reasons cannot contain the pipe character ("|")', 3)
		end
	end

	-- Set protection date
	if args.date then
		obj.protectionDate = validateDate(args.date, 'protection date')
	end
	
	-- Set banner config
	do
		obj.bannerConfig = {}
		local configTables = {}
		if cfg.banners[obj.action] then
			configTables[#configTables + 1] = cfg.banners[obj.action][obj.reason]
		end
		if cfg.defaultBanners[obj.action] then
			configTables[#configTables + 1] = cfg.defaultBanners[obj.action][obj.level]
			configTables[#configTables + 1] = cfg.defaultBanners[obj.action].default
		end
		configTables[#configTables + 1] = cfg.masterBanner
		for i, field in ipairs(Protection.bannerConfigFields) do
			for j, t in ipairs(configTables) do
				if t[field] then
					obj.bannerConfig[field] = t[field]
					break
				end
			end
		end
	end
	return setmetatable(obj, Protection)
end

function Protection:isProtected()
	return self.level ~= '*'
end

function Protection:isTemporary()
	return type(self.expiry) == 'number'
end

function Protection:makeProtectionCategory()
	local cfg = self._cfg
	local title = self.title
	
	-- Exit if the page is not protected.
	if not self:isProtected() then
		return ''
	end
	
	-- Get the expiry key fragment.
	local expiryFragment
	if self.expiry == 'indef' then
		expiryFragment = self.expiry
	elseif type(self.expiry) == 'number' then
		expiryFragment = 'temp'
	end

	-- Get the namespace key fragment.
	local namespaceFragment
	do
		namespaceFragment = cfg.categoryNamespaceKeys[title.namespace]
		if not namespaceFragment and title.namespace % 2 == 1 then
				namespaceFragment = 'talk'
		end
	end
 
	-- Define the order that key fragments are tested in. This is done with an
	-- array of tables containing the value to be tested, along with its
	-- position in the cfg.protectionCategories table.
	local order = {
		{val = expiryFragment,    keypos = 1},
		{val = namespaceFragment, keypos = 2},
		{val = self.reason,       keypos = 3},
		{val = self.level,        keypos = 4},
		{val = self.action,       keypos = 5}
	}

	--[[
	-- The old protection templates used an ad-hoc protection category system,
	-- with some templates prioritising namespaces in their categories, and
	-- others prioritising the protection reason. To emulate this in this module
	-- we use the config table cfg.reasonsWithNamespacePriority to set the
	-- reasons for which namespaces have priority over protection reason.
	-- If we are dealing with one of those reasons, move the namespace table to
	-- the end of the order table, i.e. give it highest priority. If not, the
	-- reason should have highest priority, so move that to the end of the table
	-- instead.
	--]]
	if self.reason and cfg.reasonsWithNamespacePriority[self.reason] then
		-- table.insert(order, 3, table.remove(order, 2))
		toTableEnd(order, 2)
	else
		toTableEnd(order, 3)
	end
 
	--[[
	-- Define the attempt order. Inactive subtables (subtables with nil "value"
	-- fields) are moved to the end, where they will later be given the key
	-- "all". This is to cut down on the number of table lookups in
	-- cfg.protectionCategories, which grows exponentially with the number of
	-- non-nil keys. We keep track of the number of active subtables with the
	-- noActive parameter.
	--]]
	local noActive, attemptOrder
	do
		local active, inactive = {}, {}
		for i, t in ipairs(order) do
			if t.val then
				active[#active + 1] = t
			else
				inactive[#inactive + 1] = t
			end
		end
		noActive = #active
		attemptOrder = active
		for i, t in ipairs(inactive) do
			attemptOrder[#attemptOrder + 1] = t
		end
	end
 
	--[[
	-- Check increasingly generic key combinations until we find a match. If a
	-- specific category exists for the combination of key fragments we are
	-- given, that match will be found first. If not, we keep trying different
	-- key fragment combinations until we match using the key
	-- "all-all-all-all-all".
	--
	-- To generate the keys, we index the key subtables using a binary matrix
	-- with indexes i and j. j is only calculated up to the number of active
	-- subtables. For example, if there were three active subtables, the matrix
	-- would look like this, with 0 corresponding to the key fragment "all", and
	-- 1 corresponding to other key fragments.
	-- 
	--   j 1  2  3
	-- i  
	-- 1   1  1  1
	-- 2   0  1  1
	-- 3   1  0  1
	-- 4   0  0  1
	-- 5   1  1  0
	-- 6   0  1  0
	-- 7   1  0  0
	-- 8   0  0  0
	-- 
	-- Values of j higher than the number of active subtables are set
	-- to the string "all".
	--
	-- A key for cfg.protectionCategories is constructed for each value of i.
	-- The position of the value in the key is determined by the keypos field in
	-- each subtable.
	--]]
	local cats = cfg.protectionCategories
	for i = 1, 2^noActive do
		local key = {}
		for j, t in ipairs(attemptOrder) do
			if j > noActive then
				key[t.keypos] = 'all'
			else
				local quotient = i / 2 ^ (j - 1)
				quotient = math.ceil(quotient)
				if quotient % 2 == 1 then
					key[t.keypos] = t.val
				else
					key[t.keypos] = 'all'
				end
			end
		end
		key = table.concat(key, '|')
		local attempt = cats[key]
		if attempt then
			return makeCategoryLink(attempt, title.text)
		end
	end
	return ''
end

function Protection:needsExpiry()
	local cfg = self._cfg
	local actionNeedsCheck = cfg.expiryCheckActions[self.action]
	return not self.expiry and (
		actionNeedsCheck or (
			actionNeedsCheck == nil
			and self.reason -- the old {{pp-protected}} didn't check for expiry
			and not cfg.reasonsWithoutExpiryCheck[self.reason]
		)
	)
end

function Protection:isIncorrect()
	local expiry = self.expiry
	return not self:isProtected()
		or type(expiry) == 'number' and expiry < os.time()
end

function Protection:isTemplateProtectedNonTemplate()
	local action, namespace = self.action, self.title.namespace
	return self.level == 'templateeditor'
		and (
			(action ~= 'edit' and action ~= 'move')
			or (namespace ~= 10 and namespace ~= 828)
		)
end

function Protection:makeCategoryLinks()
	local msg = self._cfg.msg
	local ret = { self:makeProtectionCategory() }
	if self:needsExpiry() then
		ret[#ret + 1] = makeCategoryLink(
			msg['tracking-category-expiry'],
			self.title.text
		)
	end
	if self:isIncorrect() then
		ret[#ret + 1] = makeCategoryLink(
			msg['tracking-category-incorrect'],
			self.title.text
		)
	end
	if self:isTemplateProtectedNonTemplate() then
		ret[#ret + 1] = makeCategoryLink(
			msg['tracking-category-template'],
			self.title.text
		)
	end
	return table.concat(ret)
end

--------------------------------------------------------------------------------
-- Blurb class
--------------------------------------------------------------------------------

local Blurb = {}
Blurb.__index = Blurb

Blurb.bannerTextFields = {
	text = true,
	explanation = true,
	tooltip = true,
	alt = true,
	link = true
}

function Blurb.new(protectionObj, args, cfg)
	return setmetatable({
		_cfg = cfg,
		_protectionObj = protectionObj,
		_args = args
	}, Blurb)
end

-- Private methods --

function Blurb:_formatDate(num)
	-- Formats a Unix timestamp into dd Month, YYYY format.
	lang = lang or mw.language.getContentLanguage()
	local success, date = pcall(
		lang.formatDate,
		lang,
		self._cfg.msg['expiry-date-format'] or 'j F Y',
		'@' .. tostring(num)
	)
	if success then
		return date
	end
end

function Blurb:_getExpandedMessage(msgKey)
	return self:_substituteParameters(self._cfg.msg[msgKey])
end

function Blurb:_substituteParameters(msg)
	if not self._params then
		local parameterFuncs = {}

		parameterFuncs.CURRENTVERSION     = self._makeCurrentVersionParameter
		parameterFuncs.EDITREQUEST        = self._makeEditRequestParameter
		parameterFuncs.EXPIRY             = self._makeExpiryParameter
		parameterFuncs.EXPLANATIONBLURB   = self._makeExplanationBlurbParameter
		parameterFuncs.IMAGELINK          = self._makeImageLinkParameter
		parameterFuncs.INTROBLURB         = self._makeIntroBlurbParameter
		parameterFuncs.INTROFRAGMENT      = self._makeIntroFragmentParameter
		parameterFuncs.PAGETYPE           = self._makePagetypeParameter
		parameterFuncs.PROTECTIONBLURB    = self._makeProtectionBlurbParameter
		parameterFuncs.PROTECTIONDATE     = self._makeProtectionDateParameter
		parameterFuncs.PROTECTIONLEVEL    = self._makeProtectionLevelParameter
		parameterFuncs.PROTECTIONLOG      = self._makeProtectionLogParameter
		parameterFuncs.TALKPAGE           = self._makeTalkPageParameter
		parameterFuncs.TOOLTIPBLURB       = self._makeTooltipBlurbParameter
		parameterFuncs.TOOLTIPFRAGMENT    = self._makeTooltipFragmentParameter
		parameterFuncs.VANDAL             = self._makeVandalTemplateParameter
		
		self._params = setmetatable({}, {
			__index = function (t, k)
				local param
				if parameterFuncs[k] then
					param = parameterFuncs[k](self)
				end
				param = param or ''
				t[k] = param
				return param
			end
		})
	end
	
	msg = msg:gsub('${(%u+)}', self._params)
	return msg
end

function Blurb:_makeCurrentVersionParameter()
	-- A link to the page history or the move log, depending on the kind of
	-- protection.
	local pagename = self._protectionObj.title.prefixedText
	if self._protectionObj.action == 'move' then
		-- We need the move log link.
		return makeFullUrl(
			'Special:Log',
			{type = 'move', page = pagename},
			self:_getExpandedMessage('current-version-move-display')
		)
	else
		-- We need the history link.
		return makeFullUrl(
			pagename,
			{action = 'history'},
			self:_getExpandedMessage('current-version-edit-display')
		)
	end
end

function Blurb:_makeEditRequestParameter()
	local mEditRequest = require('Module:Submit an edit request')
	local action = self._protectionObj.action
	local level = self._protectionObj.level
	
	-- Get the edit request type.
	local requestType
	if action == 'edit' then
		if level == 'autoconfirmed' then
			requestType = 'semi'
		elseif level == 'templateeditor' then
			requestType = 'template'
		end
	end
	requestType = requestType or 'full'
	
	-- Get the display value.
	local display = self:_getExpandedMessage('edit-request-display')

	return mEditRequest._link{type = requestType, display = display}
end

function Blurb:_makeExpiryParameter()
	local expiry = self._protectionObj.expiry
	if type(expiry) == 'number' then
		return self:_formatDate(expiry)
	else
		return expiry
	end
end

function Blurb:_makeExplanationBlurbParameter()
	-- Cover special cases first.
	if self._protectionObj.title.namespace == 8 then
		-- MediaWiki namespace
		return self:_getExpandedMessage('explanation-blurb-nounprotect')
	end

	-- Get explanation blurb table keys
	local action = self._protectionObj.action
	local level = self._protectionObj.level
	local talkKey = self._protectionObj.title.isTalkPage and 'talk' or 'subject'

	-- Find the message in the explanation blurb table and substitute any
	-- parameters.
	local explanations = self._cfg.explanationBlurbs
	local msg
	if explanations[action][level] and explanations[action][level][talkKey] then
		msg = explanations[action][level][talkKey]
	elseif explanations[action][level] and explanations[action][level].default then
		msg = explanations[action][level].default
	elseif explanations[action].default and explanations[action].default[talkKey] then
		msg = explanations[action].default[talkKey]
	elseif explanations[action].default and explanations[action].default.default then
		msg = explanations[action].default.default
	else
		error(string.format(
			'could not find explanation blurb for action "%s", level "%s" and talk key "%s"',
			action,
			level,
			talkKey
		), 8)
	end
	return self:_substituteParameters(msg)
end

function Blurb:_makeImageLinkParameter()
	local imageLinks = self._cfg.imageLinks
	local action = self._protectionObj.action
	local level = self._protectionObj.level
	local msg
	if imageLinks[action][level] then
		msg = imageLinks[action][level]
	elseif imageLinks[action].default then
		msg = imageLinks[action].default
	else
		msg = imageLinks.edit.default
	end
	return self:_substituteParameters(msg)
end

function Blurb:_makeIntroBlurbParameter()
	if self._protectionObj:isTemporary() then
		return self:_getExpandedMessage('intro-blurb-expiry')
	else
		return self:_getExpandedMessage('intro-blurb-noexpiry')
	end
end

function Blurb:_makeIntroFragmentParameter()
	if self._protectionObj:isTemporary() then
		return self:_getExpandedMessage('intro-fragment-expiry')
	else
		return self:_getExpandedMessage('intro-fragment-noexpiry')
	end
end

function Blurb:_makePagetypeParameter()
	local pagetypes = self._cfg.pagetypes
	return pagetypes[self._protectionObj.title.namespace]
		or pagetypes.default
		or error('no default pagetype defined', 8)
end

function Blurb:_makeProtectionBlurbParameter()
	local protectionBlurbs = self._cfg.protectionBlurbs
	local action = self._protectionObj.action
	local level = self._protectionObj.level
	local msg
	if protectionBlurbs[action][level] then
		msg = protectionBlurbs[action][level]
	elseif protectionBlurbs[action].default then
		msg = protectionBlurbs[action].default
	elseif protectionBlurbs.edit.default then
		msg = protectionBlurbs.edit.default
	else
		error('no protection blurb defined for protectionBlurbs.edit.default', 8)
	end
	return self:_substituteParameters(msg)
end

function Blurb:_makeProtectionDateParameter()
	local protectionDate = self._protectionObj.protectionDate
	if type(protectionDate) == 'number' then
		return self:_formatDate(protectionDate)
	else
		return protectionDate
	end
end

function Blurb:_makeProtectionLevelParameter()
	local protectionLevels = self._cfg.protectionLevels
	local action = self._protectionObj.action
	local level = self._protectionObj.level
	local msg
	if protectionLevels[action][level] then
		msg = protectionLevels[action][level]
	elseif protectionLevels[action].default then
		msg = protectionLevels[action].default
	elseif protectionLevels.edit.default then
		msg = protectionLevels.edit.default
	else
		error('no protection level defined for protectionLevels.edit.default', 8)
	end
	return self:_substituteParameters(msg)
end

function Blurb:_makeProtectionLogParameter()
	local pagename = self._protectionObj.title.prefixedText
	if self._protectionObj.action == 'autoreview' then
		-- We need the pending changes log.
		return makeFullUrl(
			'Special:Log',
			{type = 'stable', page = pagename},
			self:_getExpandedMessage('pc-log-display')
		)
	else
		-- We need the protection log.
		return makeFullUrl(
			'Special:Log',
			{type = 'protect', page = pagename},
			self:_getExpandedMessage('protection-log-display')
		)
	end
end

function Blurb:_makeTalkPageParameter()
	return string.format(
		'[[%s:%s#%s|%s]]',
		mw.site.namespaces[self._protectionObj.title.namespace].talk.name,
		self._protectionObj.title.text,
		self._args.section or 'top',
		self:_getExpandedMessage('talk-page-link-display')
	)
end

function Blurb:_makeTooltipBlurbParameter()
	if self._protectionObj:isTemporary() then
		return self:_getExpandedMessage('tooltip-blurb-expiry')
	else
		return self:_getExpandedMessage('tooltip-blurb-noexpiry')
	end
end

function Blurb:_makeTooltipFragmentParameter()
	if self._protectionObj:isTemporary() then
		return self:_getExpandedMessage('tooltip-fragment-expiry')
	else
		return self:_getExpandedMessage('tooltip-fragment-noexpiry')
	end
end

function Blurb:_makeVandalTemplateParameter()
	return require('Module:Vandal-m')._main{
		self._args.user or self._protectionObj.title.baseText
	}
end

-- Public methods --

function Blurb:makeBannerText(key)
	-- Validate input.
	if not key or not Blurb.bannerTextFields[key] then
		error(string.format(
			'"%s" is not a valid banner config field',
			tostring(key)
		), 2)
	end

	-- Generate the text.
	local msg = self._protectionObj.bannerConfig[key]
	if type(msg) == 'string' then
		return self:_substituteParameters(msg)
	elseif type(msg) == 'function' then
		msg = msg(self._protectionObj, self._args)
		if type(msg) ~= 'string' then
			error(string.format(
				'bad output from banner config function with key "%s"'
					.. ' (expected string, got %s)',
				tostring(key),
				type(msg)
			), 4)
		end
		return self:_substituteParameters(msg)
	end
end

--------------------------------------------------------------------------------
-- BannerTemplate class
--------------------------------------------------------------------------------

local BannerTemplate = {}
BannerTemplate.__index = BannerTemplate

function BannerTemplate.new(protectionObj, cfg)
	local obj = {}
	obj._cfg = cfg

	-- Set the image filename.
	local imageFilename = protectionObj.bannerConfig.image
	if imageFilename then
		obj._imageFilename = imageFilename
	else
		-- If an image filename isn't specified explicitly in the banner config,
		-- generate it from the protection status and the namespace.
		local action = protectionObj.action
		local level = protectionObj.level
		local namespace = protectionObj.title.namespace
		local reason = protectionObj.reason
		
		-- Deal with special cases first.
		if (
			namespace == 10
			or namespace == 828
			or reason and obj._cfg.indefImageReasons[reason]
			)
			and action == 'edit'
			and level == 'sysop'
			and not protectionObj:isTemporary()
		then
			-- Fully protected modules and templates get the special red "indef"
			-- padlock.
			obj._imageFilename = obj._cfg.msg['image-filename-indef']
		else
			-- Deal with regular protection types.
			local images = obj._cfg.images
			if images[action] then
				if images[action][level] then
					obj._imageFilename = images[action][level]
				elseif images[action].default then
					obj._imageFilename = images[action].default
				end
			end
		end
	end
	return setmetatable(obj, BannerTemplate)
end

function BannerTemplate:setImageWidth(width)
	self._imageWidth = width
end

function BannerTemplate:setImageTooltip(tooltip)
	self._imageCaption = tooltip
end

function BannerTemplate:renderImage()
	local filename = self._imageFilename
		or self._cfg.msg['image-filename-default']
		or 'Transparent.gif'
	return makeFileLink{
		file = filename,
		size = (self._imageWidth or 20) .. 'px',
		alt = self._imageAlt,
		link = self._imageLink,
		caption = self._imageCaption
	}
end

--------------------------------------------------------------------------------
-- Banner class
--------------------------------------------------------------------------------

local Banner = setmetatable({}, BannerTemplate)
Banner.__index = Banner

function Banner.new(protectionObj, blurbObj, cfg)
	local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn't need the blurb.
	obj:setImageWidth(40)
	obj:setImageTooltip(blurbObj:makeBannerText('alt')) -- Large banners use the alt text for the tooltip.
	obj._reasonText = blurbObj:makeBannerText('text')
	obj._explanationText = blurbObj:makeBannerText('explanation')
	obj._page = protectionObj.title.prefixedText -- Only makes a difference in testing.
	return setmetatable(obj, Banner)
end

function Banner:__tostring()
	-- Renders the banner.
	makeMessageBox = makeMessageBox or require('Module:Message box').main
	local reasonText = self._reasonText or error('no reason text set', 2)
	local explanationText = self._explanationText
	local mbargs = {
		page = self._page,
		type = 'protection',
		image = self:renderImage(),
		text = string.format(
			"'''%s'''%s",
			reasonText,
			explanationText and '<br />' .. explanationText or ''
		)
	}
	return makeMessageBox('mbox', mbargs)
end

--------------------------------------------------------------------------------
-- Padlock class
--------------------------------------------------------------------------------

local Padlock = setmetatable({}, BannerTemplate)
Padlock.__index = Padlock

function Padlock.new(protectionObj, blurbObj, cfg)
	local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn't need the blurb.
	obj:setImageWidth(20)
	obj:setImageTooltip(blurbObj:makeBannerText('tooltip'))
	obj._imageAlt = blurbObj:makeBannerText('alt')
	obj._imageLink = blurbObj:makeBannerText('link')
	obj._indicatorName = cfg.padlockIndicatorNames[protectionObj.action]
		or cfg.padlockIndicatorNames.default
		or 'pp-default'
	return setmetatable(obj, Padlock)
end

function Padlock:__tostring()
	local frame = mw.getCurrentFrame()
	-- The nowiki tag helps prevent whitespace at the top of articles.
	local nowiki = frame:extensionTag{name = 'nowiki'}
	local indicator = frame:extensionTag{
		name = 'indicator',
		args = {name = self._indicatorName},
		content = self:renderImage()
	}
	return nowiki .. indicator
end

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

local p = {}

function p._exportClasses()
	-- This is used for testing purposes.
	return {
		Protection = Protection,
		Blurb = Blurb,
		BannerTemplate = BannerTemplate,
		Banner = Banner,
		Padlock = Padlock,
	}
end

function p._main(args, cfg, title)
	args = args or {}
	cfg = cfg or require(CONFIG_MODULE)

	local protectionObj = Protection.new(args, cfg, title)

	local ret = {}

	-- If a page's edit protection is equally or more restrictive than its
	-- protection from some other action, then don't bother displaying anything
	-- for the other action (except categories).
	if protectionObj.action == 'edit' or
		args.demolevel or
		not walkHierarchy(
			cfg.hierarchy,
			protectionObj.level
		)[effectiveProtectionLevel('edit', protectionObj.title)]
	then
		-- Initialise the blurb object
		local blurbObj = Blurb.new(protectionObj, args, cfg)
	
		-- Render the banner
		if protectionObj:isProtected() then
			ret[#ret + 1] = tostring(
				(yesno(args.small) and Padlock or Banner)
				.new(protectionObj, blurbObj, cfg)
			)
		end
	end

	-- Render the categories
	if yesno(args.category) ~= false then
		ret[#ret + 1] = protectionObj:makeCategoryLinks()
	end
	
	return table.concat(ret)	
end

function p.main(frame, cfg)
	cfg = cfg or require(CONFIG_MODULE)

	-- Find default args, if any.
	local parent = frame.getParent and frame:getParent()
	local defaultArgs = parent and cfg.wrappers[parent:getTitle():gsub('/sandbox$', '')]

	-- Find user args, and use the parent frame if we are being called from a
	-- wrapper template.
	getArgs = getArgs or require('Module:Arguments').getArgs
	local userArgs = getArgs(frame, {
		parentOnly = defaultArgs,
		frameOnly = not defaultArgs
	})

	-- Build the args table. User-specified args overwrite default args.
	local args = {}
	for k, v in pairs(defaultArgs or {}) do
		args[k] = v
	end
	for k, v in pairs(userArgs) do
		args[k] = v
	end
	return p._main(args, cfg)
end

return p
老年人适合喝什么牛奶 射手座的幸运色是什么颜色 1.9号是什么星座 168红包代表什么意思 上环后需要注意什么
hippo什么意思 什么叫窝沟封闭 月德是什么意思 中空是什么意思 破伤风是什么意思
女性甲状腺挂什么科 铭五行属什么 难产是什么意思 陶和瓷有什么区别 什么是正骨
蛇和什么属相相冲 n是什么 低蛋白血症是什么意思 甲亢的症状是什么 睾酮低有什么影响
马眼是什么意思hcv7jop6ns9r.cn 月光族是什么意思啊hcv8jop9ns9r.cn 硼砂是什么hcv7jop7ns1r.cn 2012年属什么生肖hcv8jop9ns0r.cn 松花蛋是什么蛋做的hcv8jop8ns1r.cn
gg是什么牌子hcv8jop6ns8r.cn 三顾茅庐什么意思hcv7jop6ns5r.cn 尾骨疼是什么原因jiuxinfghf.com 什么蛋不能吃脑筋急转弯shenchushe.com 慢性肠炎吃什么药最好hcv9jop3ns5r.cn
月支是什么意思hcv8jop6ns6r.cn 灰指甲是什么症状hcv7jop7ns1r.cn 脲是什么意思hcv8jop9ns4r.cn fci是什么意思yanzhenzixun.com 头晕出虚汗是什么原因引起的hcv8jop9ns8r.cn
1月20是什么星座hcv9jop1ns7r.cn 脚软没力气是什么原因引起的hcv7jop6ns6r.cn 别墅是什么意思hcv9jop1ns8r.cn 猪和什么生肖最配hcv7jop6ns8r.cn 红斑狼疮是什么病hcv8jop9ns5r.cn
百度