پرش به محتوا

پودمان:Protection banner: تفاوت میان نسخه‌ها

۲٬۳۲۲ بایت حذف‌شده ،  ‏۱۶ ژوئیهٔ ۲۰۲۱
add catonly param which hides both the banner and padlock if set to yes. all testcases pass. tested in sandbox.
جز (۱ نسخه واردشده)
(add catonly param which hides both the banner and padlock if set to yes. all testcases pass. tested in sandbox.)
خط ۱: خط ۱:
-- 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 converter = require("Module:Numeral converter").convert
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 replacePersianGreMonthName(frame)
getArgs = require('Module:Arguments').getArgs
local args = getArgs(frame)
local greMonth = {'January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'}
local perGreMonth = {'ژانویه', 'فوریه', 'مارس', 'آوریل', 'مه', 'ژوئن', 'ژوئیه', 'اوت', 'سپتامبر', 'اکتبر', 'نوامبر', 'دسامبر'}
for k, v in ipairs(perGreMonth) do
args[1] = mw.ustring.gsub(args[1], v, greMonth[k])
end
return converter("en", args[1])
end
-- از آنجا که تاریخ‌ها به صورت انگلیسی به پودمان داده می‌شوند، از mw.getLanguage('en') استفاده شده‌است
-- و خروجی formatDate() از آبجکت زبان مربوطه با فرمت xi انگلیسی است.
-- برای تبدیل نام انگلیسی ماه‌های فارسی به نوشتهٔ فارسی از این تابع استفاده می‌شود.
local function replacePersianMonthName(str)
local engMonth = {'Farvardin', 'Ordibehesht', 'Khordad', 'Tir', 'Mordad', 'Shahrivar', 'Mehr', 'Aban', 'Azar', 'Dey', 'Bahman', 'Esfand'}
local faMonth = {'فروردین', 'اردیبهشت', 'خرداد', 'تیر', 'مرداد', 'شهریور', 'مهر', 'آبان', 'آذر', 'دی', 'بهمن', 'اسفند'}
for k, v in ipairs(engMonth) do
str = mw.ustring.gsub(str, v, faMonth[k])
end
return str
end


local function makeCategoryLink(cat, sort)
local function makeCategoryLink(cat, sort)
خط ۵۹: خط ۳۳:
local function validateDate(dateString, dateType)
local function validateDate(dateString, dateType)
if not lang then
if not lang then
-- در خط زیر جای mw.language.getContentLanguage() از mw.getLanguage('en') استفاده کردم.
lang = mw.language.getContentLanguage()
lang = mw.getLanguage('en')
end
end
local success, result = pcall(lang.formatDate, lang, 'U', converter('en', dateString))
local success, result = pcall(lang.formatDate, lang, 'U', dateString)
if success then
if success then
result = tonumber(result)
result = tonumber(result)
خط ۷۰: خط ۴۳:
end
end
error(string.format(
error(string.format(
'%s نامعتبر: %s',
'invalid %s: %s',
dateType,
dateType,
tostring(dateString)
tostring(dateString)
خط ۱۴۰: خط ۱۱۳:
else
else
error(string.format(
error(string.format(
'اقدام نامعتبر: %s',
'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('دلایل نمی‌تواند شامل نویسه خط عمودی («|») باشد', 3)
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
-- Exit if the page is not protected.
if not self:isProtected() then
return ''
end
-- 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:isProtected()
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.
-- در خط زیر جای mw.language.getContentLanguage() از mw.getLanguage('en') استفاده کردم.
lang = lang or mw.language.getContentLanguage()
lang = lang or mw.getLanguage('en')
local success, date = pcall(
local success, date = pcall(
lang.formatDate,
lang.formatDate,
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 'j F Y',
'@' .. replacePersianGreMonthName{converter('en', tostring(num))}
'@' .. 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')
خط ۵۲۹: خط ۵۱۶:
else
else
error(string.format(
error(string.format(
'نمی‌توان explanation blurb را برای عمل «%s»، سطح «%s» و کلید بحث «%s» پیدا کرد',
'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 converter('fa', replacePersianMonthName(self:_getExpandedMessage('intro-blurb-expiry')))
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 converter('fa', replacePersianMonthName(self:_getExpandedMessage('intro-fragment-expiry')))
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('هیچ نوع صفحه پیش‌فرضی تعریف نشده‌است', 8)
or error('no default pagetype defined', 8)
end
end


خط ۵۸۸: خط ۵۷۵:
msg = protectionBlurbs.edit.default
msg = protectionBlurbs.edit.default
else
else
error('هیچ blurb حفاظتی برای protectionBlurbs.edit.default تعریف نشده‌است', 8)
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('هیچ سطح حفاظتی برای protectionLevels.edit.default تعریف نشده‌است', 8)
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:_makeTooltipBlurbParameter()
function Blurb:_makeTooltipBlurbParameter()
if self._protectionObj:isTemporary() then
if self._protectionObj:isTemporary() then
return converter('fa', replacePersianMonthName(self:_getExpandedMessage('tooltip-blurb-expiry')))
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 converter('fa', replacePersianMonthName(self:_getExpandedMessage('tooltip-fragment-expiry')))
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 require('Module:Vandal-m')._main{
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
خط ۶۷۶: خط ۶۶۴:
if not key or not Blurb.bannerTextFields[key] then
if not key or not Blurb.bannerTextFields[key] then
error(string.format(
error(string.format(
'«%s» زمینه پیکربندی بنر معتبری نیست',
'"%s" is not a valid banner config field',
tostring(key)
tostring(key)
), 2)
), 2)
خط ۶۸۹: خط ۶۷۷:
if type(msg) ~= 'string' then
if type(msg) ~= 'string' then
error(string.format(
error(string.format(
'خروجی نامناسب از تابع پیکربندی بنر همراه کلید "%s"'
'bad output from banner config function with key "%s"'
.. ' (رشته انتظار می‌رود، %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('هیچ متن دلیلی تعیین نشده‌است', 2)
local reasonText = self._reasonText or error('no reason text set', 2)
local explanationText = self._explanationText
local explanationText = self._explanationText
local mbargs = {
local mbargs = {
خط ۸۵۵: خط ۸۴۳:
-- 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:isProtected() then
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[mw.ustring.gsub(parent:getTitle(), '/تمرین$', '')]
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
کاربر ناشناس