در حال ویرایش پودمان:Protection banner
این ویرایش را میتوان خنثی کرد. لطفاً تفاوت زیر را بررسی کنید تا تأیید کنید که این چیزی است که میخواهید انجام دهید، سپس تغییرات زیر را ذخیره کنید تا خنثیسازی ویرایش را به پایان ببرید.
نسخهٔ فعلی | متن شما | ||
خط ۵: | خط ۵: | ||
-- Initialise necessary modules. | -- Initialise necessary modules. | ||
require('Module:No globals') | require('Module:No globals') | ||
local | local convertString = require("Module:Numeral_converter").convert | ||
local | local newFileLink = require('Module:File link').new | ||
local effectiveProtectionLevel = require('Module:Effective protection level')._main | local effectiveProtectionLevel = require('Module:Effective protection level')._main | ||
local yesno = require('Module:Yesno') | local yesno = require('Module:Yesno') | ||
خط ۱۷: | خط ۱۶: | ||
local CONFIG_MODULE = 'Module:Protection banner/config' | local CONFIG_MODULE = 'Module:Protection banner/config' | ||
-- | -- خط زیر از پایین صفحه به بالا آورده شدهاست بخاطر تابع p.replacePersianGreMonthName() | ||
local p = {} | |||
-- چون ممکنه نام ماه میلادی رو به فارسی کاربران بنویسند من این تابع رو تعریف کردم که به انگلیسی برگرداند تا خطای تاریخ نامعتبر ندهد. | -- چون ممکنه نام ماه میلادی رو به فارسی کاربران بنویسند من این تابع رو تعریف کردم که به انگلیسی برگرداند تا خطای تاریخ نامعتبر ندهد. | ||
function p.replacePersianGreMonthName(frame) | |||
getArgs = require('Module:Arguments').getArgs | getArgs = require('Module:Arguments').getArgs | ||
local args = getArgs(frame) | local args = getArgs(frame) | ||
خط ۳۰: | خط ۲۸: | ||
args[1] = mw.ustring.gsub(args[1], v, greMonth[k]) | args[1] = mw.ustring.gsub(args[1], v, greMonth[k]) | ||
end | end | ||
return | return convertString("en", args[1]) | ||
end | end | ||
-------------------------------------------------------------------------------- | |||
-- Helper functions | |||
-------------------------------------------------------------------------------- | |||
-- از آنجا که تاریخها به صورت انگلیسی به پودمان داده میشوند، از mw.getLanguage('en') استفاده شدهاست | -- از آنجا که تاریخها به صورت انگلیسی به پودمان داده میشوند، از mw.getLanguage('en') استفاده شدهاست | ||
خط ۴۶: | خط ۴۸: | ||
local function makeCategoryLink(cat, sort) | local function makeCategoryLink(cat, sort) | ||
if cat then | local nsText = mw.site.namespaces[14].name | ||
return | if cat and sort then | ||
return string.format( | |||
'[[%s:%s|%s]]', | '[[%s:%s|%s]]', | ||
nsText, | |||
cat, | cat, | ||
sort | sort | ||
) | ) | ||
elseif cat then | |||
return string.format( | |||
'[[%s:%s]]', | |||
nsText, | |||
cat | |||
) | |||
else | |||
return '' | |||
end | end | ||
end | end | ||
خط ۵۸: | خط ۶۹: | ||
-- Validation function for the expiry and the protection date | -- Validation function for the expiry and the protection date | ||
local function validateDate(dateString, dateType) | local function validateDate(dateString, dateType) | ||
-- در خط زیر جای mw.language.getContentLanguage() از mw.getLanguage('en') استفاده کردم. | |||
lang = lang or mw.getLanguage('en') | |||
local success, result = pcall(lang.formatDate, lang, 'U', p.replacePersianGreMonthName{convertString('en', dateString)}) | |||
local success, result = pcall(lang.formatDate, lang, 'U', | |||
if success then | if success then | ||
result = tonumber(result) | result = tonumber(result) | ||
خط ۶۹: | خط ۷۸: | ||
end | end | ||
end | end | ||
error( | error(string.format( | ||
'%s | '%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)), | ||
خط ۸۴: | خط ۹۳: | ||
end | 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. | |||
local function | return table.insert(t, table.remove(t, pos)) | ||
end | |||
local function walkHierarchy(hierarchy, start) | |||
local toWalk, retval = {[start] = true}, {} | local toWalk, retval = {[start] = true}, {} | ||
while true do | while true do | ||
-- Can't use pairs() since we're adding and removing things as we're iterating | -- Can't use pairs() since we're adding and removing things as we're iterating | ||
local k = next(toWalk) | local k = next(toWalk) | ||
if k == nil then | if k == nil then break end | ||
toWalk[k] = nil | toWalk[k] = nil | ||
retval[k] = true | retval[k] = true | ||
for _,v in ipairs( | for _,v in ipairs(hierarchy[k]) do | ||
if not retval[v] then | if not retval[v] then | ||
toWalk[v] = true | toWalk[v] = true | ||
خط ۱۰۳: | خط ۱۱۳: | ||
end | end | ||
end | end | ||
return retval | |||
end | end | ||
خط ۱۱۵: | خط ۱۲۶: | ||
edit = true, | edit = true, | ||
move = true, | move = true, | ||
autoreview | autoreview = true | ||
} | } | ||
خط ۱۳۹: | خط ۱۴۹: | ||
obj.action = args.action | obj.action = args.action | ||
else | else | ||
error( | error(string.format( | ||
' | 'عمل ("%s") نامعتبر است', | ||
tostring(args.action) | tostring(args.action) | ||
), 3) | ), 3) | ||
خط ۱۴۷: | خط ۱۵۷: | ||
-- Set level | -- Set level | ||
obj.level = args.demolevel or effectiveProtectionLevel(obj.action, obj.title) | obj.level = args.demolevel or effectiveProtectionLevel(obj.action, obj.title) | ||
if not obj.level or (obj.action == 'move' and obj.level == 'autoconfirmed') then | if obj.level == 'accountcreator' then | ||
-- Lump titleblacklisted pages in with template-protected pages, | |||
-- since templateeditors can do both. | |||
obj.level = 'templateeditor' | |||
elseif not obj.level or (obj.action == 'move' and obj.level == 'autoconfirmed') then | |||
-- Users need to be autoconfirmed to move pages anyway, so treat | -- Users need to be autoconfirmed to move pages anyway, so treat | ||
-- semi-move-protected pages as unprotected. | -- semi-move-protected pages as unprotected. | ||
خط ۱۵۴: | خط ۱۶۸: | ||
-- Set expiry | -- Set expiry | ||
if args.expiry then | |||
if cfg.indefStrings[args.expiry] then | |||
obj.expiry = 'indef' | |||
elseif type(args.expiry) == 'number' then | |||
obj.expiry = validateDate( | obj.expiry = args.expiry | ||
else | |||
obj.expiry = validateDate(args.expiry, 'expiry date') | |||
end | |||
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('دلایل نمیتواند شامل نویسه خط عمودی ("|") شود', 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 | ||
خط ۲۲۴: | خط ۲۴۱: | ||
-- Get the namespace key fragment. | -- Get the namespace key fragment. | ||
local namespaceFragment = cfg.categoryNamespaceKeys[title.namespace] | local namespaceFragment | ||
do | |||
namespaceFragment = cfg.categoryNamespaceKeys[title.namespace] | |||
if not namespaceFragment and title.namespace % 2 == 1 then | |||
namespaceFragment = 'talk' | |||
end | |||
end | end | ||
خط ۲۵۱: | خط ۲۷۱: | ||
-- instead. | -- instead. | ||
--]] | --]] | ||
table.insert(order, table.remove(order, | 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 | |||
--[[ | --[[ | ||
خط ۳۳۲: | خط ۳۵۷: | ||
end | end | ||
return '' | 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 | end | ||
خط ۳۵۲: | خط ۳۸۹: | ||
local msg = self._cfg.msg | local msg = self._cfg.msg | ||
local ret = { self:makeProtectionCategory() } | local ret = { self:makeProtectionCategory() } | ||
if self:needsExpiry() then | |||
ret[#ret + 1] = makeCategoryLink( | |||
msg['tracking-category-expiry'], | |||
self.title.text | |||
) | |||
end | |||
if self:isIncorrect() then | if self:isIncorrect() then | ||
ret[#ret + 1] = makeCategoryLink( | ret[#ret + 1] = makeCategoryLink( | ||
خط ۴۰۰: | خط ۴۴۳: | ||
lang, | lang, | ||
self._cfg.msg['expiry-date-format'] or 'xij xiF xiY', -- The 'xi' prefix is the prefix for displaying Iranian time | self._cfg.msg['expiry-date-format'] or 'xij xiF xiY', -- The 'xi' prefix is the prefix for displaying Iranian time | ||
'@' .. replacePersianGreMonthName{ | '@' .. p.replacePersianGreMonthName{convertString('en', tostring(num))} | ||
) | ) | ||
if success then | if success then | ||
خط ۴۸۰: | خط ۵۲۳: | ||
if level == 'autoconfirmed' then | if level == 'autoconfirmed' then | ||
requestType = 'semi' | requestType = 'semi' | ||
elseif level == 'templateeditor' then | elseif level == 'templateeditor' then | ||
requestType = 'template' | requestType = 'template' | ||
خط ۵۲۸: | خط ۵۶۹: | ||
msg = explanations[action].default.default | msg = explanations[action].default.default | ||
else | else | ||
error( | error(string.format( | ||
'نمیتوان explanation blurb را برای عمل | 'نمیتوان explanation blurb را برای عمل "%s"، سطح "%s" و کلید بحث "%s" پیدا کرد', | ||
action, | action, | ||
level, | level, | ||
خط ۵۵۵: | خط ۵۹۶: | ||
function Blurb:_makeIntroBlurbParameter() | function Blurb:_makeIntroBlurbParameter() | ||
if self._protectionObj:isTemporary() then | if self._protectionObj:isTemporary() then | ||
return | return convertString('fa', replacePersianMonthName(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 convertString('fa', replacePersianMonthName(self:_getExpandedMessage('intro-fragment-expiry'))) | ||
else | else | ||
return self:_getExpandedMessage('intro-fragment-noexpiry') | return self:_getExpandedMessage('intro-fragment-noexpiry') | ||
خط ۶۳۹: | خط ۶۸۰: | ||
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 convertString('fa', replacePersianMonthName(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 convertString('fa', replacePersianMonthName(self:_getExpandedMessage('tooltip-fragment-expiry'))) | ||
else | else | ||
return self:_getExpandedMessage('tooltip-fragment-noexpiry') | return self:_getExpandedMessage('tooltip-fragment-noexpiry') | ||
خط ۶۷۵: | خط ۷۱۶: | ||
-- 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" زمینه پیکربندی بنر معتبری نیست', | ||
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( | ||
'خروجی نامناسب از تابع پیکربندی بنر همراه کلید "%s"' | 'خروجی نامناسب از تابع پیکربندی بنر همراه کلید "%s"' | ||
.. ' (رشته انتظار میرود، %s داده شدهاست)', | .. ' (رشته انتظار میرود، %s داده شدهاست)', | ||
خط ۷۴۸: | خط ۷۸۹: | ||
end | end | ||
return setmetatable(obj, BannerTemplate) | return setmetatable(obj, BannerTemplate) | ||
end | |||
function BannerTemplate:setImageWidth(width) | |||
self._imageWidth = width | |||
end | |||
function BannerTemplate:setImageTooltip(tooltip) | |||
self._imageCaption = tooltip | |||
end | end | ||
خط ۷۵۴: | خط ۸۰۳: | ||
or self._cfg.msg['image-filename-default'] | or self._cfg.msg['image-filename-default'] | ||
or 'Transparent.gif' | or 'Transparent.gif' | ||
return | return newFileLink(filename) | ||
:width(self._imageWidth or 20) | |||
:alt(self._imageAlt) | |||
alt | :link(self._imageLink) | ||
link | :caption(self._imageCaption) | ||
caption | :render() | ||
end | end | ||
خط ۷۷۲: | خط ۸۲۰: | ||
function Banner.new(protectionObj, blurbObj, cfg) | function Banner.new(protectionObj, blurbObj, cfg) | ||
local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn't need the blurb. | local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn't need the blurb. | ||
obj | obj:setImageWidth(40) | ||
obj | obj:setImageTooltip(blurbObj:makeBannerText('alt')) -- Large banners use the alt text for the tooltip. | ||
obj._reasonText = blurbObj:makeBannerText('text') | obj._reasonText = blurbObj:makeBannerText('text') | ||
obj._explanationText = blurbObj:makeBannerText('explanation') | obj._explanationText = blurbObj:makeBannerText('explanation') | ||
خط ۷۸۹: | خط ۸۳۷: | ||
type = 'protection', | type = 'protection', | ||
image = self:renderImage(), | image = self:renderImage(), | ||
text = | text = string.format( | ||
"'''%s'''%s", | "'''%s'''%s", | ||
reasonText, | reasonText, | ||
خط ۸۰۷: | خط ۸۵۵: | ||
function Padlock.new(protectionObj, blurbObj, cfg) | function Padlock.new(protectionObj, blurbObj, cfg) | ||
local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn't need the blurb. | local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn't need the blurb. | ||
obj | obj:setImageWidth(20) | ||
obj | obj:setImageTooltip(blurbObj:makeBannerText('tooltip')) | ||
obj._imageAlt = blurbObj:makeBannerText('alt') | obj._imageAlt = blurbObj:makeBannerText('alt') | ||
obj._imageLink = blurbObj:makeBannerText('link') | obj._imageLink = blurbObj:makeBannerText('link') | ||
obj. | obj._left = cfg.padlockPositions[protectionObj.action] | ||
or cfg. | or cfg.padlockPositions.default | ||
or ' | or '55px' | ||
return setmetatable(obj, Padlock) | return setmetatable(obj, Padlock) | ||
end | end | ||
function Padlock:__tostring() | function Padlock:__tostring() | ||
local | local root = mw.html.create('div') | ||
root | |||
:addClass('metadata topicon nopopups') | |||
:attr('id', 'protected-icon') | |||
:css{display = 'none', left = self._left} | |||
:wikitext(self:renderImage()) | |||
return tostring(root) | |||
end | end | ||
خط ۸۳۰: | خط ۸۷۸: | ||
-- Exports | -- Exports | ||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
function p._exportClasses() | function p._exportClasses() | ||
خط ۸۴۶: | خط ۸۹۲: | ||
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) | ||
خط ۸۶۲: | خط ۸۹۸: | ||
local ret = {} | local ret = {} | ||
-- If a page's edit protection is equally or more restrictive than its | -- 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 | |||
if protectionObj.action == 'edit' or | |||
-- Initialise the blurb object | -- Initialise the blurb object | ||
local blurbObj = Blurb.new(protectionObj, args, cfg) | local blurbObj = Blurb.new(protectionObj, args, cfg) |