Module:Protection banner: Difference between revisions
Jump to navigation
Jump to search
Content added Content deleted
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 and sort then |
|||
return string.format( |
return string.format( |
||
'[[%s:%s|%s]]', |
'[[%s:%s|%s]]', |
||
⚫ | |||
nsText, |
|||
cat, |
cat, |
||
sort |
sort |
||
) |
) |
||
⚫ | |||
return string.format( |
|||
'[[%s:%s]]', |
|||
nsText, |
|||
cat |
|||
) |
|||
else |
|||
⚫ | |||
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 = mw.language.getContentLanguage() |
|||
⚫ | |||
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 |
|||
-- Sends the value at position pos to the end of array t, and shifts the |
|||
-- including the given node). |
|||
-- other items down accordingly. |
|||
⚫ | |||
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) -- This always gets the "first" key |
local k = next(toWalk) -- This always gets the "first" key |
||
if k == nil then |
if k == nil then |
||
⚫ | |||
⚫ | |||
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 |
||
return retval |
|||
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 namespaceFragment |
local namespaceFragment = cfg.categoryNamespaceKeys[title.namespace] |
||
⚫ | |||
do |
|||
namespaceFragment = |
namespaceFragment = 'talk' |
||
⚫ | |||
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)) |
|||
-- table.insert(order, 3, table.remove(order, 2)) |
|||
toTableEnd(order, 2) |
|||
else |
|||
toTableEnd(order, 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 |
|||
function BannerTemplate:setImageWidth(width) |
|||
self._imageWidth = width |
|||
end |
|||
function BannerTemplate:setImageTooltip(tooltip) |
|||
self._imageCaption = tooltip |
|||
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{ |
|||
local indicator = frame:extensionTag{ |
|||
name = 'indicator', |
name = 'indicator', |
||
args = {name = self._indicatorName}, |
args = {name = self._indicatorName}, |
||
content = self:renderImage() |
content = self:renderImage() |
||
} |
} |
||
return nowiki .. indicator |
|||
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 |