편집을 취소할 수 있습니다. 이 편집을 되돌리려면 아래의 바뀐 내용을 확인한 후 게시해주세요.
최신판 | 당신의 편집 | ||
4번째 줄: | 4번째 줄: | ||
-- Initialise necessary modules. | -- Initialise necessary modules. | ||
require('Module:No globals') | require('Module:No globals') | ||
local | local class = require('Module:Middleclass').class | ||
local | local mArguments = require('Module:Arguments') | ||
local | local mFileLink = require('Module:File link') | ||
local mProtectionLevel = require('Module:Effective protection level') | |||
local yesno = require('Module:Yesno') | local yesno = require('Module:Yesno') | ||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
-- | -- ProtectionStatus class | ||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
local function | local ProtectionStatus = class('ProtectionStatus') | ||
function ProtectionStatus:initialize(args, titleObj) | |||
-- Set action | |||
do | |||
local actions = { | |||
create = true, | |||
edit = true, | |||
move = true, | |||
autoreview = true | |||
} | |||
if args.action and actions[args.action] then | |||
self._action = args.action | |||
else | |||
self._action = 'edit' | |||
end | |||
end | end | ||
-- | -- Set level | ||
do | |||
local level = mProtectionLevel._main(self._action, titleObj) | |||
if level == 'accountcreator' then | |||
-- Lump titleblacklisted pages in with template-protected pages, | |||
-- since templateeditors can do both. | |||
level = 'templateeditor' | |||
end | end | ||
self._level = level or '*' | |||
end | end | ||
-- Set other params | |||
self._reason = args.reason | |||
self._expiry = args.expiry or 'indef' | |||
self._section = args.section | |||
self._protectionDate = args.date | |||
self._username = args.user | |||
end | end | ||
function ProtectionStatus:getAction() | |||
return | return self._action | ||
end | end | ||
function ProtectionStatus:getLevel() | |||
return self._level | |||
end | end | ||
function ProtectionStatus:getReason() | |||
return self._reason | |||
end | |||
function ProtectionStatus:getExpiry() | |||
return self._expiry | |||
end | |||
function | |||
function ProtectionStatus:getSection() | |||
return self._section | |||
end | end | ||
function | function ProtectionStatus:getProtectionDate() | ||
return self._protectionDate | |||
end | end | ||
function | function ProtectionStatus:getUsername() | ||
return self. | return self._username | ||
end | end | ||
-------------------------------------------------------------------------------- | |||
-- Config class | |||
-------------------------------------------------------------------------------- | |||
local Config = class('Config') | |||
function | function Config:initialize() | ||
self._cfg = mw.loadData('Module:Protection banner/config') | |||
end | end | ||
function | function Config:getBannerConfig(protectionStatusObj) | ||
local cfg = self._cfg | local cfg = self._cfg | ||
local | local action = protectionStatusObj:getAction() | ||
local reason = protectionStatusObj:getReason() | |||
if cfg.banners[action][reason] then | |||
local | return cfg.banners[action][reason] | ||
if | else | ||
return cfg.defaultBanners[action] | |||
end | end | ||
end | |||
function Config:getConfigTable(key) | |||
local blacklist = { | |||
banners = true, | |||
local | defaultBanners = true | ||
} | } | ||
if not blacklist[key] then | |||
return self._cfg[key] | |||
else | |||
return nil | |||
end | end | ||
end | end | ||
function | function Config:getMessage(key) | ||
return self._cfg.msg[key] | |||
return | |||
end | end | ||
359번째 줄: | 120번째 줄: | ||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
local Blurb = | local Blurb = class('Blurb') | ||
Blurb | |||
function Blurb | function Blurb:initialize(configObj, protectionStatusObj, titleObj) | ||
self._configObj = configObj | |||
self._protectionStatusObj = protectionStatusObj | |||
self._bannerConfig = configObj:getBannerConfig(protectionStatusObj) | |||
self._titleObj = titleObj | |||
end | end | ||
function Blurb.makeFullUrl(page, query, display) | |||
local url = mw.uri.fullUrl(page, query) | |||
function Blurb | url = tostring(url) | ||
return string.format('[%s %s]', url, display) | |||
end | end | ||
function Blurb:_substituteParameters(msg) | function Blurb:_substituteParameters(msg) | ||
if not self._params then | if not self._params then | ||
local parameterFuncs = {} | local params, parameterFuncs = {}, {} | ||
setmetatable(params, { | |||
__index = function (t, k) | __index = function (t, k) | ||
local param | local param | ||
if parameterFuncs[k] then | if parameterFuncs[k] then | ||
param = parameterFuncs[k]( | param = parameterFuncs[k]() | ||
end | end | ||
param = param or '' | param = param or '' | ||
params[k] = param | |||
return param | return param | ||
end | end | ||
}) | }) | ||
parameterFuncs[1] = function () | |||
return self:_makeIntroParameter() | |||
end | end | ||
parameterFuncs[2] = function () | |||
return self:_makeUntilParameter() | |||
end | |||
parameterFuncs[3] = function () | |||
return self:_makeDisputesParameter() | |||
end | |||
parameterFuncs[4] = function () | |||
return self:_makePagetypeParameter() | |||
end | |||
parameterFuncs[5] = function () | |||
return self:_makeProtectionDateParameter() | |||
end | |||
parameterFuncs[6] = function () | |||
return self:_makeVandalTemplateParameter() | |||
end | |||
parameterFuncs[7] = function () | |||
return self:_makeProtectionLevelParameter() | |||
end | |||
parameterFuncs[8] = function () | |||
return self:_makeExpiryParameter() | |||
end | |||
parameterFuncs[9] = function () | |||
-- A link to the page history or the move log | |||
return self:_makeDisputeLinkParameter() | |||
end | |||
function | parameterFuncs[10] = function () | ||
return self:_makeProtectionLogParameter() | |||
end | |||
end | |||
function | parameterFuncs[11] = function () | ||
return self:_makeTalkLinkParameter() | |||
end | end | ||
parameterFuncs[12] = function () | |||
end | return self:_makeEditRequestParameter() | ||
end | |||
function | parameterFuncs[13] = function () | ||
return self:_makeRequestUnprotectionParameter() | |||
end | |||
end | |||
function | parameterFuncs[14] = function () | ||
-- Adds links to edit requests and the talk page if we are on a | |||
-- subject page | |||
return self:_makeSubjectPageLinksParameter() | |||
end | |||
parameterFuncs[15] = function () | |||
return self:_makeDeletionDiscussionParameter() | |||
end | |||
parameterFuncs[16] = function () | |||
return self:_makeDeletionLogParameter() | |||
end | |||
self._params = params | |||
end | end | ||
return self: | return mw.message.newRawMessage(msg):params(self._params):plain() | ||
end | end | ||
function Blurb: | function Blurb:_makeIntroParameter() | ||
local | -- parameter $1 | ||
local action = self. | local key | ||
local level = self. | local action = self._protectionStatusObj:getAction() | ||
local level = self._protectionStatusObj:getLevel() | |||
if | if action == 'edit' and level == 'autoconfirmed' then | ||
key = 'reason-text-semi' | |||
elseif | elseif action == 'move' then | ||
key = 'reason-text-move' | |||
elseif action == 'create' then | |||
key = 'reason-text-create' | |||
else | else | ||
key = 'reason-text-default' | |||
end | end | ||
local msg = self._configObj:getMessage(key) | |||
return self:_substituteParameters(msg) | return self:_substituteParameters(msg) | ||
end | end | ||
function Blurb: | function Blurb:_makeUntilParameter() | ||
-- parameter $2 | |||
return | -- "until" or "or until" depending on the expiry | ||
local expiry = self._protectionStatusObj:getExpiry() | |||
if expiry then | |||
return 'or until' | |||
else | else | ||
return | return 'until' | ||
end | end | ||
end | end | ||
function Blurb: | function Blurb:_makeDisputesParameter() | ||
-- parameter $3 | |||
-- "disputes", with or without a section link | |||
local section = self._protectionStatusObj:getSection() | |||
local disputes = self.configObj:getMessage('dispute-section-link-display') | |||
if section then | |||
return string.format( | |||
'[[%s:%s#%s|%s]]', | |||
mw.site.namespaces[self._titleObj.namespace].talk.name, | |||
self._titleObj.text, | |||
section, | |||
disputes | |||
) | |||
else | else | ||
return | return disputes | ||
end | end | ||
end | end | ||
function Blurb:_makePagetypeParameter() | function Blurb:_makePagetypeParameter() | ||
local pagetypes = self. | -- parameter $4 | ||
return pagetypes[ | local pagetypes = self._configObj:getConfigTable('pagetypeNamespaces') | ||
local namespace = self._titleObj:getNamespace() | |||
return pagetypes[namespace] or pagetypes.default or 'page' | |||
end | end | ||
function Blurb: | function Blurb:_makeProtectionDateParameter() | ||
local | -- parameter $5 | ||
local | local protectionDate = self._protectionStatusObj:getProtectionDate() | ||
local level = self. | if protectionDate then | ||
local | local lang = mw.language.getContentLanguage() | ||
if | local success, date = pcall( | ||
lang.formatDate, | |||
elseif | lang, | ||
'j F Y', | |||
elseif | protectionDate | ||
) | |||
if success and date then | |||
return date | |||
end | |||
end | |||
end | |||
function Blurb:_makeVandalTemplateParameter() | |||
-- parameter $6 | |||
local mVandalM = require('Module:Vandal-m') | |||
local username = self._protectionStatusObj:getUsername() | |||
username = username or self._titleObj.baseText | |||
return mVandalM.luaMain{username} | |||
end | |||
function Blurb:_makeProtectionLevelParameter() | |||
-- parameter $7 | |||
local action = self._protectionStatusObj:getAction() | |||
local level = self._protectionStatusObj:getLevel() | |||
local key | |||
if action == 'edit' then | |||
if level == 'sysop' then | |||
key = 'protection-level-full' | |||
elseif level == 'templateeditor' then | |||
key = 'protection-level-template' | |||
elseif level == 'autoconfirmed' then | |||
key = 'protection-level-semi' | |||
end | |||
elseif action == 'move' then | |||
key = 'protection-level-move' | |||
elseif action == 'create' then | |||
key = 'protection-level-create' | |||
else | else | ||
key = 'protection-level-default' | |||
end | end | ||
return self: | return self._configObj:getMessage(key) | ||
end | end | ||
function Blurb: | function Blurb:_makeExpiryParameter() | ||
local | -- parameter $8 | ||
if | -- @TODO: Check to see if the expiry is valid. | ||
return | local expiry = self._protectionStatusObj:getExpiry() | ||
if expiry then | |||
return ' until ' .. expiry | |||
else | else | ||
return | return '' | ||
end | end | ||
end | end | ||
function Blurb: | function Blurb:_makeDisputeLinkParameter() | ||
-- parameter $9 | |||
local action = self. | -- A link to the page history or the move log, depending on the kind of | ||
local | -- protection. | ||
local action = self._protectionStatusObj:getAction() | |||
if | local pagename = self._titleObj.prefixedText | ||
if action == 'move' then | |||
-- We need the move log link. | |||
return self.makeFullUrl( | |||
'Special:Log', | |||
{type = 'move', page = pagename}, | |||
self._configObj:getMessage('dispute-move-link-display') | |||
) | |||
else | else | ||
-- We need the history link. | |||
return self.makeFullUrl( | |||
pagename, | |||
{action = 'history'}, | |||
self._configObj:getMessage('dispute-edit-link-display') | |||
) | |||
end | end | ||
end | end | ||
function Blurb:_makeProtectionLogParameter() | function Blurb:_makeProtectionLogParameter() | ||
local | -- parameter $10 | ||
if | local action = self._protectionStatusObj:getAction() | ||
if action == 'autoreview' then | |||
-- We need the pending changes log. | -- We need the pending changes log. | ||
return makeFullUrl( | return self.makeFullUrl( | ||
'Special:Log', | 'Special:Log', | ||
{type = 'stable', page = pagename}, | {type = 'stable', page = pagename}, | ||
self: | self._configObj:getMessage('more-details-pc-log-display') | ||
) | ) | ||
else | else | ||
-- We need the protection log. | -- We need the protection log. | ||
return makeFullUrl( | return self.makeFullUrl( | ||
'Special:Log', | 'Special:Log', | ||
{type = 'protect', page = pagename}, | {type = 'protect', page = pagename}, | ||
self: | self._configObj:getMessage('more-details-protection-log-display') | ||
) | ) | ||
end | end | ||
end | end | ||
function Blurb: | function Blurb:_makeTalkLinkParameter() | ||
return string.format( | -- parameter $11 | ||
local section = self._protectionStatusObj:getSection() | |||
local display = self._configObj:getMessage('talk-page-link-display') | |||
return string.format( | |||
'[[%s:%s#%s|%s]]', | '[[%s:%s#%s|%s]]', | ||
mw.site.namespaces[self. | mw.site.namespaces[self._titleObj.namespace].talk.name, | ||
self. | self._titleObj.text, | ||
section or 'top', | |||
display | |||
) | ) | ||
end | end | ||
function Blurb: | function Blurb:_makeEditRequestParameter() | ||
-- parameter $12 | |||
local mEditRequest = require('Module:Submit an edit request') | |||
local action = self._protectionStatusObj:getAction() | |||
local level = self._protectionStatusObj:getLevel() | |||
-- Get the display message key. | |||
local key | |||
if action == 'edit' and level == 'autoconfirmed' then | |||
key = 'edit-request-semi-display' | |||
else | else | ||
key = 'edit-request-full-display' | |||
end | end | ||
local display = self._configObj:getMessage(key) | |||
-- Get the edit request type. | |||
if | local requestType | ||
if action == 'edit' then | |||
if level == 'autoconfirmed' then | |||
requestType = 'semi' | |||
elseif level == 'templateeditor' then | |||
requestType = 'template' | |||
end | |||
end | end | ||
requestType = requestType or 'full' | |||
return mEditRequest.exportLinkToLua{type = requestType, display = display} | |||
end | end | ||
function Blurb: | function Blurb:_makeRequestUnprotectionParameter() | ||
-- parameter $13 | |||
if self._titleObj.namespace ~= 8 then | |||
-- MediaWiki pages can't be unprotected. | |||
return self._configObj:getMessage('request-unprotection-blurb') | |||
return self: | |||
end | end | ||
end | end | ||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
-- | -- Image class | ||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
local | local Image = class('Image') | ||
function | function Image:initialize(configObj, protectionStatusObj, titleObj) | ||
self._configObj = configObj | |||
self._protectionStatusObj = protectionStatusObj | |||
self._titleObj = titleObj | |||
end | |||
function Image:setFilename(filename) | |||
if filename then | |||
if | self._filename = filename | ||
else | else | ||
local images, action, level, reason, namespace | |||
do | |||
local configObj = self._configObj | |||
local protectionStatusObj = self._protectionStatusObj | |||
local titleObj = self._titleObj | |||
local reason = | images = configObj:getConfigTable('images') | ||
action = protectionStatusObj:getAction() | |||
level = protectionStatusObj:getLevel() | |||
reason = protectionStatusObj:getReason() | |||
namespace = titleObj:getNamespace() | |||
end | |||
or | |||
local image | |||
if reason == 'office' or reason == 'reset' then | |||
image = images.office | |||
elseif namespace == 10 or namespace == 828 then | |||
-- We are in the template or module namespaces. | |||
if level == 'templateeditor' then | |||
image = images.template | |||
elseif level == 'sysop' then | |||
image = images.indef | |||
end | |||
elseif action == 'create' then | |||
image = images.create | |||
elseif action == 'move' | |||
and ( | |||
level == 'templateeditor' | |||
or level == 'sysop' | |||
) | ) | ||
then | then | ||
image = images.move | |||
elseif action == 'edit' then | |||
if level == 'sysop' then | |||
image = images.full | |||
elseif level == 'autoconfirmed' then | |||
image = images.semi | |||
end | |||
elseif action == 'autoreview' then | |||
if level == 'autoconfirmed' then | |||
image = images.pc1 | |||
elseif level == 'reviewer' then | |||
image = images.pc2 | |||
end | end | ||
end | end | ||
self._filename = image | |||
end | end | ||
end | end | ||
function | function Image:setWidth(width) | ||
self._width = width | |||
end | |||
function Image:setAlt(alt) | |||
self._alt = alt | |||
end | |||
alt | |||
link | function Image:setLink(link) | ||
caption | self._link = link | ||
end | |||
function Image:setCaption(caption) | |||
self._caption = caption | |||
end | |||
function Image:export() | |||
return mFileLink.new(self._filename or 'Transparent.gif') | |||
:width(self._width or 20) | |||
:alt(self._alt) | |||
:link(self._link) | |||
:caption(self._caption) | |||
:render() | |||
end | end | ||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
-- | -- BannerTemplate class | ||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
local | local BannerTemplate = class('BannerTemplate') | ||
function | function BannerTemplate:initialize() | ||
end | end | ||
function | function BannerTemplate:render() | ||
end | end | ||
-------------------------------------------------------------------------------- | |||
-- Banner class | |||
-------------------------------------------------------------------------------- | |||
local Banner = BannerTemplate:subclass('Banner') | |||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
790번째 줄: | 539번째 줄: | ||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
local Padlock = | local Padlock = BannerTemplate:subclass('Padlock') | ||
-------------------------------------------------------------------------------- | |||
-- Category class | |||
-------------------------------------------------------------------------------- | |||
local Category = class('Category') | |||
function Category:initialize() | |||
end | |||
function | function Category:setName(name) | ||
self._name = name | |||
end | end | ||
function | function Category:export() | ||
local | if self._categoryName then | ||
-- | return string.format( | ||
'[[%s:%s]]', | |||
mw.site.namespaces[14].name, | |||
self._categoryName | |||
) | |||
else | |||
return '' | |||
end | |||
end | |||
-------------------------------------------------------------------------------- | |||
-- ProtectionCategory class | |||
-------------------------------------------------------------------------------- | |||
local ProtectionCategory = Category:subclass('ProtectionCategory') | |||
function ProtectionCategory:setName( | |||
name, | |||
configObj, | |||
protectionStatusObj, | |||
namespace | |||
) | |||
--[[ | |||
-- Sets the protection category. If a category name is not provided, this | |||
-- method gets a category name from the module config, given a combination | |||
-- of the protection type, the protection level, the namespace number, the | |||
-- reason for protection, and the expiry date. | |||
--]] | |||
-- If a name was provided, use that. | |||
if name then | |||
Category.setName(self, name) | |||
end | |||
-- Get the namespace category key from the namespace number. | |||
local nskey | |||
do | |||
local categoryNamespaces = configObj:getConfigTable('categoryNamespaces') | |||
if not namespace or type(namespace) ~= 'number' then | |||
nskey = nil | |||
else | |||
nskey = categoryNamespaces[ns] | |||
if not nskey and ns % 2 == 1 then | |||
nskey = 'talk' | |||
end | |||
end | |||
end | |||
--[[ | |||
-- Define the properties table. Each property is a table containing the | |||
-- canonical order that the property is tested in, the position the | |||
-- property has in the category key strings, and the property value itself. | |||
--]] | |||
local properties = { | |||
expiry = {order = 1, keypos = 5, val = protectionStatusObj:getExpiry()}, | |||
namespace = {order = 2, keypos = 3, val = nskey}, | |||
reason = {order = 3, keypos = 4, val = protectionStatusObj:getReason()}, | |||
level = {order = 4, keypos = 2, val = protectionStatusObj:getLevel()}, | |||
action = {order = 5, keypos = 1, val = protectionStatusObj:getAction()} | |||
} | } | ||
--[[ | |||
-- Apply the category order configuration, if any. The configuration value | |||
-- will be a property string, e.g. 'reason', 'namespace', etc. The property | |||
-- corresponding to that string is tested last (i.e. it is the most | |||
-- important, because it keeps its specified value the longest) and the | |||
-- other properties are tested in the canonical order. If no configuration | |||
-- value is specified then the canonical order is used. | |||
--]] | |||
local configOrder = {} | |||
do | |||
local bannerConfig = configObj:getBannerConfig(protectionStatusObj) | |||
local categoryOrder = bannerConfig.categoryOrder | |||
for propertiesKey, t in pairs(properties) do | |||
configOrder[t.order] = t | |||
end | |||
if categoryOrder then | |||
local property = properties[categoryOrder] | |||
if not property then | |||
local msg = '"' | |||
.. categoryOrder | |||
.. '" is not a valid value of cfg.reasons.' | |||
.. reason | |||
.. '.categoryOrder' | |||
error(msg) | |||
end | |||
table.insert(configOrder, table.remove(configOrder, property.order)) | |||
end | |||
end | |||
--[[ | |||
-- Define the attempt order. Properties with no value defined are moved | |||
-- to the end, where they will later be given the value "all". This is | |||
-- to cut down on the number of table lookups in the cats table, which | |||
-- grows exponentially with the number of properties with valid values. | |||
-- We keep track of the number of active properties with the noActive | |||
-- parameter. | |||
--]] | |||
local noActive, attemptOrder | |||
do | |||
local active, inactive = {}, {} | |||
for i, t in ipairs(configOrder) do | |||
if t.val then | |||
active[#active + 1] = t | |||
else | |||
inactive[#inactive + 1] = t | |||
end | |||
end | |||
noActive = #active | |||
attemptOrder = active | |||
for i, t in ipairs(inactive) do | |||
attemptOrder[#attemptOrder + 1] = t | |||
end | |||
end | |||
--[[ | |||
-- Check increasingly generic key combinations until we find a match. | |||
-- If a specific category exists for the combination of properties | |||
-- we are given, that match will be found first. If not, we keep | |||
-- trying different key combinations until we match using the key | |||
-- "all-all-all-all-all". | |||
-- | |||
-- To generate the keys, we index the property subtables using a | |||
-- binary matrix with indexes i and j. j is only calculated up to | |||
-- the number of active properties. For example, if there were three | |||
-- active properties, the matrix would look like this, with 0 | |||
-- corresponding to the string "all", and 1 corresponding to the | |||
-- val field in the property table: | |||
-- | |||
-- j 1 2 3 | |||
-- i | |||
-- 1 1 1 1 | |||
-- 2 0 1 1 | |||
-- 3 1 0 1 | |||
-- 4 0 0 1 | |||
-- 5 1 1 0 | |||
-- 6 0 1 0 | |||
-- 7 1 0 0 | |||
-- 8 0 0 0 | |||
-- | |||
-- Values of j higher than the number of active properties are set | |||
-- to the string "all". | |||
-- | |||
-- A key for the category table is constructed for each value of i. | |||
-- The correct position of the value in the key is determined by the | |||
-- pos field in the property table. | |||
--]] | |||
local cats = configObj:getConfigTable('categories') | |||
local cat | |||
for i = 1, 2^noActive do | |||
local key = {} | |||
for j, t in ipairs(attemptOrder) do | |||
if j > noActive then | |||
key[t.keypos] = 'all' | |||
else | |||
local quotient = i / 2 ^ (j - 1) | |||
quotient = math.ceil(quotient) | |||
if quotient % 2 == 1 then | |||
key[t.keypos] = t.val | |||
else | |||
key[t.keypos] = 'all' | |||
end | |||
end | |||
end | |||
key = table.concat(key, '-') | |||
local attempt = cats[key] | |||
if attempt then | |||
cat = attempt | |||
break | |||
end | |||
end | |||
if cat then | |||
Category.setName(self, cat) | |||
else | |||
error( | |||
'No category match found;' | |||
.. ' please define the category for key "all-all-all-all-all"' | |||
) | |||
end | |||
end | end | ||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
-- | -- ExpiryCategory class | ||
-------------------------------------------------------------------------------- | -------------------------------------------------------------------------------- | ||
local | local ExpiryCategory = Category:subclass('ExpiryCategory') | ||
-------------------------------------------------------------------------------- | |||
-- ErrorCategory class | |||
-------------------------------------------------------------------------------- | |||
local ErrorCategory = Category:subclass('ErrorCategory') | |||
-------------------------------------------------------------------------------- | |||
-- ProtectionBanner class | |||
-------------------------------------------------------------------------------- | |||
local ProtectionBanner = {} | |||
function ProtectionBanner.exportToWiki(frame, title) | |||
local args = mArguments.getArgs(frame) | |||
return ProtectionBanner.exportToLua(args, title) | |||
end | end | ||
function | function ProtectionBanner.exportToLua(args, title) | ||
title = title or mw.title.getCurrentTitle() | |||
local | -- Get data objects | ||
local theProtectionStatus = ProtectionStatus:new(args, title) | |||
local theConfig = Config:new() | |||
local ret = {} | local ret = {} | ||
-- | -- Render the banner | ||
-- Render the categories | |||
return table.concat(ret) | return table.concat(ret) | ||
end | end | ||
function | function ProtectionBanner._exportClasses() | ||
-- This is used to export the classes for testing purposes. | |||
return { | |||
-- | ProtectionStatus = ProtectionStatus, | ||
Config = Config, | |||
Image = Image, | |||
Blurb = Blurb, | |||
BannerTemplate = BannerTemplate, | |||
Banner = Banner, | |||
Padlock = Padlock, | |||
Category = Category, | |||
ProtectionCategory = ProtectionCategory, | |||
ErrorCategory = ErrorCategory, | |||
ExpiryCategory = ExpiryCategory, | |||
} | |||
end | end | ||
return | return ProtectionBanner |