در حال ویرایش پودمان:Protection banner
این ویرایش را میتوان خنثی کرد. لطفاً تفاوت زیر را بررسی کنید تا تأیید کنید که این چیزی است که میخواهید انجام دهید، سپس تغییرات زیر را ذخیره کنید تا خنثیسازی ویرایش را به پایان ببرید.
نسخهٔ فعلی | متن شما | ||
خط ۱: | خط ۱: | ||
-- This module implements {{pp-meta}} and its daughter templates such as | -- This module implements {{pp-meta}} and its daughter templates such as | ||
-- {{pp-dispute}}, {{pp-vandalism}} and {{pp-sock}}. | -- {{pp-dispute}}, {{pp-vandalism}} and {{pp-sock}}. | ||
-- Initialise necessary modules. | -- Initialise necessary modules. | ||
require('Module:No globals') | require('Module:No globals') | ||
local makeFileLink = require('Module:File link')._main | local makeFileLink = require('Module:File link')._main | ||
local effectiveProtectionLevel = require('Module:Effective protection level')._main | local effectiveProtectionLevel = require('Module:Effective protection level')._main | ||
خط ۲۰: | خط ۱۸: | ||
-- Helper functions | -- Helper functions | ||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
local function makeCategoryLink(cat, sort) | local function makeCategoryLink(cat, sort) | ||
if cat then | if cat then | ||
return | return string.format( | ||
'[[%s:%s|%s]]', | '[[%s:%s|%s]]', | ||
mw.site.namespaces[14].name, | mw.site.namespaces[14].name, | ||
خط ۵۹: | خط ۳۳: | ||
local function validateDate(dateString, dateType) | local function validateDate(dateString, dateType) | ||
if not lang then | if not lang then | ||
lang = mw.language.getContentLanguage() | |||
end | end | ||
local success, result = pcall(lang.formatDate, lang, 'U | local success, result = pcall(lang.formatDate, lang, 'U', dateString) | ||
if success then | if success then | ||
result = tonumber(result) | result = tonumber(result) | ||
خط ۶۹: | خط ۴۲: | ||
end | end | ||
end | end | ||
error( | error(string.format( | ||
'%s | 'invalid %s: %s', | ||
dateType, | dateType, | ||
tostring(dateString) | tostring(dateString) | ||
خط ۷۷: | خط ۵۰: | ||
local function makeFullUrl(page, query, display) | local function makeFullUrl(page, query, display) | ||
return | return string.format( | ||
'[%s %s]', | '[%s %s]', | ||
tostring(mw.uri.fullUrl(page, query)), | tostring(mw.uri.fullUrl(page, query)), | ||
خط ۱۳۹: | خط ۱۱۲: | ||
obj.action = args.action | obj.action = args.action | ||
else | else | ||
error( | error(string.format( | ||
' | 'invalid action: %s', | ||
tostring(args.action) | tostring(args.action) | ||
), 3) | ), 3) | ||
خط ۱۵۸: | خط ۱۳۱: | ||
obj.expiry = 'indef' | obj.expiry = 'indef' | ||
elseif effectiveExpiry ~= 'unknown' then | elseif effectiveExpiry ~= 'unknown' then | ||
obj.expiry = validateDate(effectiveExpiry, ' | obj.expiry = validateDate(effectiveExpiry, 'expiry date') | ||
end | end | ||
خط ۱۶۵: | خط ۱۳۸: | ||
obj.reason = mw.ustring.lower(args[1]) | obj.reason = mw.ustring.lower(args[1]) | ||
if obj.reason:find('|') then | if obj.reason:find('|') then | ||
error(' | error('reasons cannot contain the pipe character ("|")', 3) | ||
end | end | ||
end | end | ||
خط ۱۷۱: | خط ۱۴۴: | ||
-- Set protection date | -- Set protection date | ||
if args.date then | if args.date then | ||
obj.protectionDate = validateDate(args.date, ' | obj.protectionDate = validateDate(args.date, 'protection date') | ||
end | end | ||
خط ۱۹۶: | خط ۱۶۹: | ||
end | end | ||
return setmetatable(obj, Protection) | return setmetatable(obj, Protection) | ||
end | |||
function Protection:isUserScript() | |||
-- Whether the page is a user JavaScript or CSS page. | |||
local title = self.title | |||
return title.namespace == 2 and ( | |||
title.contentModel == 'javascript' or title.contentModel == 'css' | |||
) | |||
end | end | ||
خط ۲۰۱: | خط ۱۸۲: | ||
return self.level ~= '*' | return self.level ~= '*' | ||
end | end | ||
function Protection:shouldShowLock() | |||
-- Whether we should output a banner/padlock | |||
return self:isProtected() and not self:isUserScript() | |||
end | |||
-- Whether this page needs a protection category. | |||
Protection.shouldHaveProtectionCategory = Protection.shouldShowLock | |||
function Protection:isTemporary() | function Protection:isTemporary() | ||
خط ۲۰۷: | خط ۱۹۶: | ||
function Protection:makeProtectionCategory() | function Protection:makeProtectionCategory() | ||
if not self:shouldHaveProtectionCategory() then | |||
return '' | |||
end | |||
local cfg = self._cfg | local cfg = self._cfg | ||
local title = self.title | local title = self.title | ||
-- Get the expiry key fragment. | -- Get the expiry key fragment. | ||
خط ۲۲۸: | خط ۲۱۶: | ||
namespaceFragment = 'talk' | namespaceFragment = 'talk' | ||
end | end | ||
-- Define the order that key fragments are tested in. This is done with an | -- 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 | -- array of tables containing the value to be tested, along with its | ||
خط ۳۳۶: | خط ۳۲۴: | ||
function Protection:isIncorrect() | function Protection:isIncorrect() | ||
local expiry = self.expiry | local expiry = self.expiry | ||
return not self: | return not self:shouldHaveProtectionCategory() | ||
or type(expiry) == 'number' and expiry < os.time() | or type(expiry) == 'number' and expiry < os.time() | ||
end | end | ||
خط ۳۵۱: | خط ۳۳۹: | ||
function Protection:makeCategoryLinks() | function Protection:makeCategoryLinks() | ||
local msg = self._cfg.msg | local msg = self._cfg.msg | ||
local ret = { self:makeProtectionCategory() } | local ret = {self:makeProtectionCategory()} | ||
if self:isIncorrect() then | if self:isIncorrect() then | ||
ret[#ret + 1] = makeCategoryLink( | ret[#ret + 1] = makeCategoryLink( | ||
خط ۳۹۴: | خط ۳۸۲: | ||
function Blurb:_formatDate(num) | function Blurb:_formatDate(num) | ||
-- Formats a Unix timestamp into dd Month, YYYY format. | -- Formats a Unix timestamp into dd Month, YYYY format. | ||
lang = lang or mw.language.getContentLanguage() | |||
lang = lang or mw. | |||
local success, date = pcall( | local success, date = pcall( | ||
lang.formatDate, | lang.formatDate, | ||
lang, | lang, | ||
self._cfg.msg['expiry-date-format'] or ' | self._cfg.msg['expiry-date-format'] or 'j F Y', | ||
'@' .. | '@' .. tostring(num) | ||
) | ) | ||
if success then | if success then | ||
خط ۴۵۶: | خط ۴۴۳: | ||
-- We need the move log link. | -- We need the move log link. | ||
return makeFullUrl( | return makeFullUrl( | ||
' | 'Special:Log', | ||
{type = 'move', page = pagename}, | {type = 'move', page = pagename}, | ||
self:_getExpandedMessage('current-version-move-display') | self:_getExpandedMessage('current-version-move-display') | ||
خط ۵۲۸: | خط ۵۱۵: | ||
msg = explanations[action].default.default | msg = explanations[action].default.default | ||
else | else | ||
error( | error(string.format( | ||
' | 'could not find explanation blurb for action "%s", level "%s" and talk key "%s"', | ||
action, | action, | ||
level, | level, | ||
خط ۵۵۵: | خط ۵۴۲: | ||
function Blurb:_makeIntroBlurbParameter() | function Blurb:_makeIntroBlurbParameter() | ||
if self._protectionObj:isTemporary() then | if self._protectionObj:isTemporary() then | ||
return | return self:_getExpandedMessage('intro-blurb-expiry') | ||
else | else | ||
return self:_getExpandedMessage('intro-blurb-noexpiry') | return self:_getExpandedMessage('intro-blurb-noexpiry') | ||
خط ۵۶۳: | خط ۵۵۰: | ||
function Blurb:_makeIntroFragmentParameter() | function Blurb:_makeIntroFragmentParameter() | ||
if self._protectionObj:isTemporary() then | if self._protectionObj:isTemporary() then | ||
return | return self:_getExpandedMessage('intro-fragment-expiry') | ||
else | else | ||
return self:_getExpandedMessage('intro-fragment-noexpiry') | return self:_getExpandedMessage('intro-fragment-noexpiry') | ||
خط ۵۷۳: | خط ۵۶۰: | ||
return pagetypes[self._protectionObj.title.namespace] | return pagetypes[self._protectionObj.title.namespace] | ||
or pagetypes.default | or pagetypes.default | ||
or error(' | or error('no default pagetype defined', 8) | ||
end | end | ||
خط ۵۸۸: | خط ۵۷۵: | ||
msg = protectionBlurbs.edit.default | msg = protectionBlurbs.edit.default | ||
else | else | ||
error(' | error('no protection blurb defined for protectionBlurbs.edit.default', 8) | ||
end | end | ||
return self:_substituteParameters(msg) | return self:_substituteParameters(msg) | ||
خط ۶۱۴: | خط ۶۰۱: | ||
msg = protectionLevels.edit.default | msg = protectionLevels.edit.default | ||
else | else | ||
error(' | error('no protection level defined for protectionLevels.edit.default', 8) | ||
end | end | ||
return self:_substituteParameters(msg) | return self:_substituteParameters(msg) | ||
خط ۶۲۴: | خط ۶۱۱: | ||
-- We need the pending changes log. | -- We need the pending changes log. | ||
return makeFullUrl( | return makeFullUrl( | ||
' | 'Special:Log', | ||
{type = 'stable', page = pagename}, | {type = 'stable', page = pagename}, | ||
self:_getExpandedMessage('pc-log-display') | self:_getExpandedMessage('pc-log-display') | ||
خط ۶۳۱: | خط ۶۱۸: | ||
-- We need the protection log. | -- We need the protection log. | ||
return makeFullUrl( | return makeFullUrl( | ||
' | 'Special:Log', | ||
{type = 'protect', page = pagename}, | {type = 'protect', page = pagename}, | ||
self:_getExpandedMessage('protection-log-display') | self:_getExpandedMessage('protection-log-display') | ||
خط ۶۳۹: | خط ۶۲۶: | ||
function Blurb:_makeTalkPageParameter() | function Blurb:_makeTalkPageParameter() | ||
return | return string.format( | ||
'[[%s:%s#%s|%s]]', | '[[%s:%s#%s|%s]]', | ||
mw.site.namespaces[self._protectionObj.title.namespace].talk.name, | mw.site.namespaces[self._protectionObj.title.namespace].talk.name, | ||
خط ۶۵۰: | خط ۶۳۷: | ||
function Blurb:_makeTooltipBlurbParameter() | function Blurb:_makeTooltipBlurbParameter() | ||
if self._protectionObj:isTemporary() then | if self._protectionObj:isTemporary() then | ||
return | return self:_getExpandedMessage('tooltip-blurb-expiry') | ||
else | else | ||
return self:_getExpandedMessage('tooltip-blurb-noexpiry') | return self:_getExpandedMessage('tooltip-blurb-noexpiry') | ||
خط ۶۵۸: | خط ۶۴۵: | ||
function Blurb:_makeTooltipFragmentParameter() | function Blurb:_makeTooltipFragmentParameter() | ||
if self._protectionObj:isTemporary() then | if self._protectionObj:isTemporary() then | ||
return | return self:_getExpandedMessage('tooltip-fragment-expiry') | ||
else | else | ||
return self:_getExpandedMessage('tooltip-fragment-noexpiry') | return self:_getExpandedMessage('tooltip-fragment-noexpiry') | ||
خط ۶۶۵: | خط ۶۵۲: | ||
function Blurb:_makeVandalTemplateParameter() | function Blurb:_makeVandalTemplateParameter() | ||
return | return mw.getCurrentFrame():expandTemplate{ | ||
self._args.user or self._protectionObj.title.baseText | title="vandal-m", | ||
args={self._args.user or self._protectionObj.title.baseText} | |||
} | } | ||
end | end | ||
خط ۶۷۵: | خط ۶۶۳: | ||
-- Validate input. | -- Validate input. | ||
if not key or not Blurb.bannerTextFields[key] then | if not key or not Blurb.bannerTextFields[key] then | ||
error( | error(string.format( | ||
' | '"%s" is not a valid banner config field', | ||
tostring(key) | tostring(key) | ||
), 2) | ), 2) | ||
خط ۶۸۸: | خط ۶۷۶: | ||
msg = msg(self._protectionObj, self._args) | msg = msg(self._protectionObj, self._args) | ||
if type(msg) ~= 'string' then | if type(msg) ~= 'string' then | ||
error( | error(string.format( | ||
' | 'bad output from banner config function with key "%s"' | ||
.. ' ( | .. ' (expected string, got %s)', | ||
tostring(key), | tostring(key), | ||
type(msg) | type(msg) | ||
خط ۷۸۳: | خط ۷۷۱: | ||
-- Renders the banner. | -- Renders the banner. | ||
makeMessageBox = makeMessageBox or require('Module:Message box').main | makeMessageBox = makeMessageBox or require('Module:Message box').main | ||
local reasonText = self._reasonText or error(' | local reasonText = self._reasonText or error('no reason text set', 2) | ||
local explanationText = self._explanationText | local explanationText = self._explanationText | ||
local mbargs = { | local mbargs = { | ||
خط ۷۸۹: | خط ۷۷۷: | ||
type = 'protection', | type = 'protection', | ||
image = self:renderImage(), | image = self:renderImage(), | ||
text = | text = string.format( | ||
"'''%s'''%s", | "'''%s'''%s", | ||
reasonText, | reasonText, | ||
خط ۸۴۶: | خط ۸۳۴: | ||
function p._main(args, cfg, title) | function p._main(args, cfg, title) | ||
args = args or {} | args = args or {} | ||
cfg = cfg or require(CONFIG_MODULE) | cfg = cfg or require(CONFIG_MODULE) | ||
خط ۸۶۵: | خط ۸۴۳: | ||
-- protection from some other action, then don't bother displaying anything | -- protection from some other action, then don't bother displaying anything | ||
-- for the other action (except categories). | -- for the other action (except categories). | ||
if protectionObj.action == 'edit' or | if not yesno(args.catonly) and (protectionObj.action == 'edit' or | ||
args.demolevel or | args.demolevel or | ||
not getReachableNodes( | not getReachableNodes( | ||
cfg.hierarchy, | cfg.hierarchy, | ||
protectionObj.level | protectionObj.level | ||
)[effectiveProtectionLevel('edit', protectionObj.title)] | )[effectiveProtectionLevel('edit', protectionObj.title)]) | ||
then | then | ||
-- Initialise the blurb object | -- Initialise the blurb object | ||
خط ۸۷۶: | خط ۸۵۴: | ||
-- Render the banner | -- Render the banner | ||
if protectionObj: | if protectionObj:shouldShowLock() then | ||
ret[#ret + 1] = tostring( | ret[#ret + 1] = tostring( | ||
(yesno(args.small) and Padlock or Banner) | (yesno(args.small) and Padlock or Banner) | ||
خط ۸۹۷: | خط ۸۷۵: | ||
-- Find default args, if any. | -- Find default args, if any. | ||
local parent = frame.getParent and frame:getParent() | local parent = frame.getParent and frame:getParent() | ||
local defaultArgs = parent and cfg.wrappers[ | 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 | -- Find user args, and use the parent frame if we are being called from a |