Module:Protection banner/sandbox: Difference between revisions

Content deleted Content added
Undid revision 708058819 by Mr. Stradivarius (talk) wasn't actually quite done
sync to live module
 
(43 intermediate revisions by 16 users not shown)
Line 3:
 
-- Initialise necessary modules.
require('Module:No globalsstrict')
local makeFileLink = require('Module:File link')._main
local effectiveProtectionLevel = require('Module:Effective protection level')._main
Line 13:
 
-- Set constants.
local CONFIG_MODULE = 'Module:Protection banner/config/sandbox' -- SWITCH THIS BACK TO THE MAIN CONFIG PAGE BEFORE GOING LIVE!
 
--------------------------------------------------------------------------------
Line 20:
 
local function makeCategoryLink(cat, sort)
if cat then
local nsText = mw.site.namespaces[14].name
if cat and sort then
return string.format(
'[[%s:%s|%s]]',
mw.site.namespaces[14].name,
nsText,
cat,
sort
)
elseif cat then
return string.format(
'[[%s:%s]]',
nsText,
cat
)
else
return ''
end
end
Line 41 ⟶ 32:
-- Validation function for the expiry and the protection date
local function validateDate(dateString, dateType)
langif =not lang orthen
lang = mw.language.getContentLanguage()
end
local success, result = pcall(lang.formatDate, lang, 'U', dateString)
if success then
Line 50 ⟶ 43:
end
error(string.format(
'invalid %s: ("%s")',
dateType,
tostring(dateString)
Line 64 ⟶ 57:
end
 
-- Given a directed graph formatted as node -> table of direct successors,
local function toTableEnd(t, pos)
-- get a table of all nodes reachable from a given node (though always
-- Sends the value at position pos to the end of array t, and shifts the
-- including the given node).
-- other items down accordingly.
local function getReachableNodes(graph, start)
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
return retval
end
toWalk[k] = nil
retval[k] = true
for _,v in ipairs(hierarchygraph[k]) do
if not retval[v] then
toWalk[v] = true
Line 84 ⟶ 76:
end
end
return retval
end
 
Line 97 ⟶ 88:
edit = true,
move = true,
autoreview = true,
upload = true
}
 
Line 121 ⟶ 113:
else
error(string.format(
'invalid action: ("%s")',
tostring(args.action)
), 3)
Line 140 ⟶ 132:
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
 
Line 185 ⟶ 169:
end
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
 
Line 190 ⟶ 182:
return self.level ~= '*'
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()
Line 196:
 
function Protection:makeProtectionCategory()
if not self:shouldHaveProtectionCategory() then
return ''
end
 
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.
Line 213 ⟶ 212:
 
-- Get the namespace key fragment.
local namespaceFragment = cfg.categoryNamespaceKeys[title.namespace]
if not namespaceFragment and title.namespace % 2 == 1 then
do
namespaceFragment = cfg.categoryNamespaceKeys[title.namespace]'talk'
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
Line 243 ⟶ 239:
-- instead.
--]]
iftable.insert(order, table.remove(order, self.reason and cfg.reasonsWithNamespacePriority[self.reason] thenand 2 or 3))
-- table.insert(order, 3, table.remove(order, 2))
toTableEnd(order, 2)
else
toTableEnd(order, 3)
end
--[[
Line 323 ⟶ 314:
end
key = table.concat(key, '|')
mw.log(key)
local attempt = cats[key]
if attempt then
Line 330 ⟶ 320:
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:isProtectedshouldHaveProtectionCategory()
or type(expiry) == 'number' and expiry < os.time()
end
Line 361 ⟶ 339:
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(
Line 495 ⟶ 467:
if level == 'autoconfirmed' then
requestType = 'semi'
elseif level == 'extendedconfirmed' then
requestType = 'extended'
elseif level == 'templateeditor' then
requestType = 'template'
Line 678 ⟶ 652:
 
function Blurb:_makeVandalTemplateParameter()
return mw.getCurrentFrame():expandTemplate{
return require('Module:Vandal-m')._main{
title="vandal-m",
args={self._args.user or self._protectionObj.title.baseText}
}
end
Line 761 ⟶ 736:
end
return setmetatable(obj, BannerTemplate)
end
 
function BannerTemplate:setImageWidth(width)
self._imageWidth = width
end
 
function BannerTemplate:setImageTooltip(tooltip)
self._imageCaption = tooltip
end
 
Line 777 ⟶ 744:
return makeFileLink{
file = filename,
size = (self._imageWidthimageWidth or 20) .. 'px',
alt = self._imageAlt,
link = self._imageLink,
caption = self._imageCaptionimageCaption
}
end
Line 793 ⟶ 760:
function Banner.new(protectionObj, blurbObj, cfg)
local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn't need the blurb.
obj:setImageWidth(.imageWidth = 40)
obj:setImageTooltip(.imageCaption = blurbObj:makeBannerText('alt')) -- Large banners use the alt text for the tooltip.
obj._reasonText = blurbObj:makeBannerText('text')
obj._explanationText = blurbObj:makeBannerText('explanation')
Line 828 ⟶ 795:
function Padlock.new(protectionObj, blurbObj, cfg)
local obj = BannerTemplate.new(protectionObj, cfg) -- This doesn't need the blurb.
obj:setImageWidth(.imageWidth = 20)
obj:setImageTooltip(.imageCaption = blurbObj:makeBannerText('tooltip'))
obj._imageAlt = blurbObj:makeBannerText('alt')
obj._imageLink = blurbObj:makeBannerText('link')
Line 841 ⟶ 808:
local frame = mw.getCurrentFrame()
-- The nowiki tag helps prevent whitespace at the top of articles.
local nowiki =return frame:extensionTag{name = 'nowiki'} .. frame:extensionTag{
local indicator = frame:extensionTag{
name = 'indicator',
args = {name = self._indicatorName},
content = self:renderImage()
}
return nowiki .. indicator
end
 
Line 875 ⟶ 840:
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
-- then don't bother displaying anything for the other action (except categories).
if not yesno(args.catonly) and (protectionObj.action == 'edit' or
args.demolevel or
not walkHierarchygetReachableNodes(
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:isProtectedshouldShowLock() then
ret[#ret + 1] = tostring(
(yesno(args.small) and Padlock or Banner)
Line 893 ⟶ 865:
if yesno(args.category) ~= false then
ret[#ret + 1] = protectionObj:makeCategoryLinks()
end
-- For arbitration enforcement, flagging [[WP:PIA]] pages to enable [[Special:AbuseFilter/1339]] to flag edits to them
if protectionObj.level == "extendedconfirmed" then
if require("Module:TableTools").inArray(protectionObj.title.talkPageTitle.categories, "Wikipedia pages subject to the extended confirmed restriction related to the Arab-Israeli conflict") then
ret[#ret + 1] = "<p class='PIA-flag' style='display:none; visibility:hidden;' title='This page is subject to the extended confirmed restriction related to the Arab-Israeli conflict.'></p>"
end
end