Module:Protection banner: Difference between revisions
bring changes from sandbox live
m (Changed protection level of Module:Protection banner: High-risk Lua module: request at my talk page ([Edit=Require template editor access] (indefinite) [Move=Require template editor access] (indefinite))) |
(bring changes from sandbox live) |
||
Line 20: | Line 20: | ||
local function makeCategoryLink(cat, sort) | local function makeCategoryLink(cat, sort) | ||
if cat then | |||
if cat | |||
return string.format( | return string.format( | ||
'[[%s:%s|%s]]', | '[[%s:%s|%s]]', | ||
mw.site.namespaces[14].name, | |||
cat, | cat, | ||
sort | sort | ||
) | ) | ||
end | end | ||
end | end | ||
Line 41: | Line 32: | ||
-- 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) | ||
lang = | if not lang then | ||
lang = mw.language.getContentLanguage() | |||
end | |||
local success, result = pcall(lang.formatDate, lang, 'U', dateString) | local success, result = pcall(lang.formatDate, lang, 'U', dateString) | ||
if success then | if success then | ||
Line 50: | Line 43: | ||
end | end | ||
error(string.format( | error(string.format( | ||
'invalid %s | 'invalid %s: %s', | ||
dateType, | dateType, | ||
tostring(dateString) | tostring(dateString) | ||
Line 64: | Line 57: | ||
end | end | ||
-- Given a directed graph formatted as node -> table of direct successors, | |||
-- get a table of all nodes reachable from a given node (though always | |||
-- including the given node). | |||
local function getReachableNodes(graph, start) | |||
local function | |||
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) -- This always gets the "first" key | local k = next(toWalk) -- This always gets the "first" key | ||
if k == nil then | if k == nil then | ||
return retval | |||
end | |||
toWalk[k] = nil | toWalk[k] = nil | ||
retval[k] = true | retval[k] = true | ||
for _,v in ipairs( | for _,v in ipairs(graph[k]) do | ||
if not retval[v] then | if not retval[v] then | ||
toWalk[v] = true | toWalk[v] = true | ||
Line 84: | Line 76: | ||
end | end | ||
end | end | ||
end | end | ||
Line 122: | Line 113: | ||
else | else | ||
error(string.format( | error(string.format( | ||
'invalid action | 'invalid action: %s', | ||
tostring(args.action) | tostring(args.action) | ||
), 3) | ), 3) | ||
Line 214: | Line 205: | ||
-- Get the namespace key fragment. | -- Get the namespace key fragment. | ||
local | local namespaceFragment = cfg.categoryNamespaceKeys[title.namespace] | ||
if not namespaceFragment and title.namespace % 2 == 1 then | |||
namespaceFragment = 'talk' | |||
end | end | ||
Line 244: | Line 232: | ||
-- instead. | -- instead. | ||
--]] | --]] | ||
table.insert(order, table.remove(order, self.reason and cfg.reasonsWithNamespacePriority[self.reason] and 2 or 3)) | |||
--[[ | --[[ | ||
Line 495: | Line 478: | ||
if level == 'autoconfirmed' then | if level == 'autoconfirmed' then | ||
requestType = 'semi' | requestType = 'semi' | ||
elseif level == 'extendedconfirmed' then | |||
requestType = 'extended' | |||
elseif level == 'templateeditor' then | elseif level == 'templateeditor' then | ||
requestType = 'template' | requestType = 'template' | ||
Line 761: | Line 746: | ||
end | end | ||
return setmetatable(obj, BannerTemplate) | return setmetatable(obj, BannerTemplate) | ||
end | end | ||
Line 777: | Line 754: | ||
return makeFileLink{ | return makeFileLink{ | ||
file = filename, | file = filename, | ||
size = (self. | size = (self.imageWidth or 20) .. 'px', | ||
alt = self._imageAlt, | alt = self._imageAlt, | ||
link = self._imageLink, | link = self._imageLink, | ||
caption = self. | caption = self.imageCaption | ||
} | } | ||
end | end | ||
Line 793: | Line 770: | ||
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.imageWidth = 40 | ||
obj | obj.imageCaption = 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') | ||
Line 828: | Line 805: | ||
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.imageWidth = 20 | ||
obj | obj.imageCaption = blurbObj:makeBannerText('tooltip') | ||
obj._imageAlt = blurbObj:makeBannerText('alt') | obj._imageAlt = blurbObj:makeBannerText('alt') | ||
obj._imageLink = blurbObj:makeBannerText('link') | obj._imageLink = blurbObj:makeBannerText('link') | ||
Line 841: | Line 818: | ||
local frame = mw.getCurrentFrame() | local frame = mw.getCurrentFrame() | ||
-- The nowiki tag helps prevent whitespace at the top of articles. | -- The nowiki tag helps prevent whitespace at the top of articles. | ||
return frame:extensionTag{name = 'nowiki'} .. frame:extensionTag{ | |||
name = 'indicator', | name = 'indicator', | ||
args = {name = self._indicatorName}, | args = {name = self._indicatorName}, | ||
content = self:renderImage() | content = self:renderImage() | ||
} | } | ||
end | end | ||
Line 880: | Line 855: | ||
if protectionObj.action == 'edit' or | if protectionObj.action == 'edit' or | ||
args.demolevel or | args.demolevel or | ||
not | not getReachableNodes( | ||
cfg.hierarchy, | cfg.hierarchy, | ||
protectionObj.level | protectionObj.level |