Module:Protection banner: Difference between revisions

From TEPwiki, Urth's Encyclopedia
Jump to navigation Jump to search
Content added Content deleted
(use the default mediawiki protection level names after all)
(try making the algorithm more general)
Line 34: Line 34:
['edit-sysop-all-blp-all'] = 'Wikipedia indefinitely protected biographies of living people',
['edit-sysop-all-blp-all'] = 'Wikipedia indefinitely protected biographies of living people',
['edit-autoconfirmed-all-all-indef'] = 'Wikipedia indefinitely semi-protected pages',
['edit-autoconfirmed-all-all-indef'] = 'Wikipedia indefinitely semi-protected pages',
['edit-autoconfirmed-category-all-all'] = 'Wikipedia semi-protected categories',
['edit-sysop-category-all-all'] = 'Wikipedia protected categories',
['move-sysop-talk-all-all'] = 'Wikipedia move-protected talk pages',
['move-sysop-talk-all-all'] = 'Wikipedia move-protected talk pages',
['move-sysop-all-all-indef'] = 'Wikipedia indefinitely move-protected pages',
['move-sysop-all-all-indef'] = 'Wikipedia indefinitely move-protected pages',
['edit-autoconfirmed-all-all-all'] = 'Wikipedia semi-protected pages',
['edit-autoconfirmed-all-all-all'] = 'Wikipedia semi-protected pages',
['all-all-all-all-all'] = 'Wikipedia protected pages',
['edit-autoconfirmed-category-all-all'] = 'Wikipedia semi-protected categories',
['edit-sysop-category-all-all'] = 'Wikipedia protected categories',
['move-sysop-all-all-all'] = 'Wikipedia move-protected pages',
['move-sysop-all-all-all'] = 'Wikipedia move-protected pages',
['all-all-all-office-all'] = 'Wikipedia Office-protected pages',
['pc-autoconfirmed-all-all-all'] = 'Wikipedia pending changes protected pages (level 1)',
['pc-autoconfirmed-all-all-all'] = 'Wikipedia pending changes protected pages (level 1)',
['pc-reviewer-all-all-all'] = 'Wikipedia pending changes protected pages (level 2)',
['pc-reviewer-all-all-all'] = 'Wikipedia pending changes protected pages (level 2)',
['all-all-all-all-all'] = 'Wikipedia protected pages',
['office'] = 'Wikipedia Office-protected pages',
}
}


Line 140: Line 140:
local keyTable = {protType, protLevel, namespace, reason, expiry}
local keyTable = {protType, protLevel, namespace, reason, expiry}
local attemptOrder = {
local attemptOrder = {
-- type, level, ns, reason, expiry
-- type, level, ns, reason, expiry
{true, true, true, true, true}, -- 1
{true, true, true, true, true}, -- 1
{true, true, true, true, false}, -- 2
{true, true, true, true, false}, -- 2
Line 148: Line 148:
{true, true, true, false, false}, -- 6
{true, true, true, false, false}, -- 6
{true, true, false, false, true}, -- 7
{true, true, false, false, true}, -- 7
{true, true, false, false, false}, -- 8
{true, false, true, true, true}, -- 8
{true, false, true, false, false}, -- 9
{true, false, true, true, false}, -- 9
{true, false, false, false, false}, -- 10
{true, false, false, true, true}, -- 10
{false, false, false, false, false} -- 11
{true, false, true, false, true}, -- 11
{true, false, false, true, false}, -- 12
{true, false, true, false, false}, -- 13
{true, false, false, false, true}, -- 14
{true, false, false, false, false}, -- 15
{false, false, false, false, false} -- 16
}
}
local reasonFirst = {
local reasonBehaviors = {
vandalism = true,
vandalism = 'namespaceFirst',
dispute = 'reasonFirst',
office = true
blp = 'reasonFirst',
sock = 'reasonFirst',
office = 'reasonOnly',
}
}

local reasonBehavior = reasonBehaviors[reason]
if reasonFirst[reason] then
if reasonBehavior == 'reasonOnly' then
local attempt = cats[reason]
if attempt then
return attempt
else
error('the category for key "' .. reason .. '" is undefined')
end
elseif reasonBehavior == 'namespaceFirst' then
-- Sort the order so that namespace keys are checked before reason matches.
attemptOrder[3], attemptOrder[4] = attemptOrder[4], attemptOrder[3]
attemptOrder[3], attemptOrder[4] = attemptOrder[4], attemptOrder[3]
attemptOrder[5], attemptOrder[6] = attemptOrder[6], attemptOrder[5]
attemptOrder[5], attemptOrder[6] = attemptOrder[6], attemptOrder[5]
elseif not reasonBeavior then
table.insert(attemptOrder, 2, {false, false, false, true, false}) -- To deal with office-protection
error(reason .. ' is not a valid reason')
end
end

Revision as of 02:07, 6 March 2014

Documentation for this module may be created at Module:Protection banner/doc

-- This module implements {{pp-meta}} and its daughter templates such as
-- {{pp-dispute}}, {{pp-vandalism}} and {{pp-sock}}.

local categories = {
	['edit-autoconfirmed-user-all-all'] = 'Wikipedia semi-protected user and user talk pages',
	['edit-autoconfirmed-project-all-all'] = 'Semi-protected project pages',
	['edit-autoconfirmed-file-all-all'] = 'Semi-protected images',
	['edit-autoconfirmed-template-all-all'] = 'Wikipedia semi-protected templates',
	['edit-autoconfirmed-portal-all-all'] = 'Semi-protected portals',
	['edit-autoconfirmed-talk-all-all'] = 'Semi-protected talk pages',
	['edit-autoconfirmed-all-vandalism-all'] = 'Wikipedia pages semi-protected against vandalism',
	['edit-sysop-user-all-all'] = 'Wikipedia protected user and user talk pages',
	['edit-sysop-file-all-all'] = 'Protected images',
	['edit-sysop-project-all-all'] = 'Protected project pages',
	['edit-sysop-template-all-all'] = 'Wikipedia protected templates',
	['edit-sysop-talk-all-all'] = 'Protected talk pages',
	['edit-sysop-all-vandalism-all'] = 'Wikipedia pages protected against vandalism',
	['edit-autoconfirmed-all-dispute-all'] = 'Wikipedia pages semi-protected due to dispute',
	['edit-sysop-all-dispute-all'] = 'Wikipedia pages protected due to dispute',
	['move-sysop-all-dispute-all'] = 'Wikipedia pages move-protected due to dispute',
	['move-sysop-user-all-all'] = 'Wikipedia move-protected user and user talk pages',
	['move-sysop-project-all-all'] = 'Wikipedia move-protected project pages',
	['move-sysop-portal-all-all'] = 'Wikipedia move-protected portals',
	['move-sysop-all-vandalism-all'] = 'Wikipedia pages move-protected due to vandalism',
	['edit-autoconfirmed-template-all-all'] = 'Wikipedia semi-protected templates',
	['move-sysop-template-all-all'] = 'Wikipedia move-protected templates',
	['edit-all-template-all-all'] = 'Wikipedia protected templates',
	['move-sysop-portal-all-all'] = 'Wikipedia move-protected portals',
	['edit-autoconfirmed-all-sock-all'] = 'Wikipedia pages semi-protected from banned users',
	['edit-sysop-all-sock-all'] = 'Wikipedia pages protected from banned users',
	['edit-autoconfirmed-all-blp-temp'] = 'Wikipedia temporarily semi-protected biographies of living people',
	['edit-sysop-all-blp-temp'] = 'Wikipedia temporarily protected biographies of living people',
	['edit-autoconfirmed-all-blp-all'] = 'Wikipedia indefinitely semi-protected biographies of living people',
	['edit-sysop-all-blp-all'] = 'Wikipedia indefinitely protected biographies of living people',
	['edit-autoconfirmed-all-all-indef'] = 'Wikipedia indefinitely semi-protected pages',
	['edit-autoconfirmed-category-all-all'] = 'Wikipedia semi-protected categories',
	['edit-sysop-category-all-all'] = 'Wikipedia protected categories',
	['move-sysop-talk-all-all'] = 'Wikipedia move-protected talk pages',
	['move-sysop-all-all-indef'] = 'Wikipedia indefinitely move-protected pages',
	['edit-autoconfirmed-all-all-all'] = 'Wikipedia semi-protected pages',
	['move-sysop-all-all-all'] = 'Wikipedia move-protected pages',
	['pc-autoconfirmed-all-all-all'] = 'Wikipedia pending changes protected pages (level 1)',
	['pc-reviewer-all-all-all'] = 'Wikipedia pending changes protected pages (level 2)',
	['all-all-all-all-all'] = 'Wikipedia protected pages',
	['office'] = 'Wikipedia Office-protected pages',
}

local nskeys = {
	[2] = 'user',
	[3] = 'user',
	[4] = 'project',
	[6] = 'file',
	[10] = 'template',
	[12] = 'project',
	[14] = 'category',
	[100] = 'portal',
}

local error_categories = {
	incorrect = 'Wikipedia pages with incorrect protection templates',
	no_expiry = 'Wikipedia protected pages without expiry',
	create = 'Wikipedia pages tagged as create-protected',
	template = 'Wikipedia template-protected pages other than templates and modules'
}

local template_types = {
	vandalism = {
		namespaces = false, -- defaults to all namespaces
		editLevels = false, -- all edit protection levels
		moveLevels = false, -- all move protection levels
		createLevels = false, -- all create protection levels
		header = false,
		reason = 'due to [[Wikipedia:Vandalism|vandalism]]',
		icon_reason = 'due to vandalism',
	}
}

--------------------------------------------------------------------------------
-- Main functions
--------------------------------------------------------------------------------

local getArgs = require('Module:Arguments').getArgs
local yesno = require('Module:Yesno')

local p = {}

function p.main(frame)
	-- Get data
	local args = getArgs(frame)
	local title = p.getTitle(args.page)
	local protType, protLevel = p.getProtectionStatus(title)
	local namespace = p.getNamespace(title)
	local expiry = p.getExpiry(args.expiry)
	local reason = p.getReason(args.reason)

	-- Sort categories and build a category link with the best match
	categories = p.sortCategories(categories, protType, protLevel, namespace, expiry, reason)
	local category = categories[1].name
	category = string.format('[[Category:%s]]', category)

	-- Find whether we are small or not and output a padlock or a banner as appropriate
	local isSmall = yesno(args.small, true)
	if isSmall then
		return p.exportPadlock()
	else
		return p.exportBanner()
	end
end

function p.parseNamespace(ns)
	-- The ns variable is the namespace number.
	if not ns or type(ns) ~= 'number' then
		return 'all'
	end
	local nskey = nskeys[ns]
	if not nskey and ns % 2 == 1 then
		nskey = 'talk'
	elseif not nskey then
		nskey = 'all'
	end
	return nskey
end

function p.getCategoryName(cats, protType, protLevel, namespace, reason, expiry)
	-- Preprocess parameters
	cats = cats or categories
	protType = protType or 'all'
	protLevel = protLevel or 'all'
	namespace = p.parseNamespace(namespace)
	reason = reason or 'all'
	if not expiry then
		expiry = 'all'
	elseif expiry ~= 'indef' then
		expiry = 'temp'
	end
	
	-- Define the key table and the order to test it in.
	-- This part is a little like playing regex golf - we have to make up a new
	-- rule for every idiosyncracy that was in the old template system.
	local keyTable = {protType, protLevel, namespace, reason, expiry}
	local attemptOrder = {
		-- type, level, ns, reason, expiry
		{true, true, true, true, true},     -- 1
		{true, true, true, true, false},    -- 2
		{true, true, false, true, true},    -- 3
		{true, true, true, false, true},    -- 4
		{true, true, false, true, false},   -- 5
		{true, true, true, false, false},   -- 6
		{true, true, false, false, true},   -- 7
		{true, false, true, true, true},    -- 8
		{true, false, true, true, false},   -- 9
		{true, false, false, true, true},   -- 10
		{true, false, true, false, true},   -- 11
		{true, false, false, true, false},  -- 12
		{true, false, true, false, false},  -- 13
		{true, false, false, false, true},  -- 14
		{true, false, false, false, false}, -- 15
		{false, false, false, false, false} -- 16
	}
	
	local reasonBehaviors = {
		vandalism = 'namespaceFirst',
		dispute = 'reasonFirst',
		blp = 'reasonFirst',
		sock = 'reasonFirst',
		office = 'reasonOnly',
	}

	local reasonBehavior = reasonBehaviors[reason]
	if reasonBehavior == 'reasonOnly' then
		local attempt = cats[reason]
		if attempt then
			return attempt
		else
			error('the category for key "' .. reason .. '" is undefined')
		end
	elseif reasonBehavior == 'namespaceFirst' then
		-- Sort the order so that namespace keys are checked before reason matches.
		attemptOrder[3], attemptOrder[4] = attemptOrder[4], attemptOrder[3] 
		attemptOrder[5], attemptOrder[6] = attemptOrder[6], attemptOrder[5]
	elseif not reasonBeavior then
		error(reason .. ' is not a valid reason')
	end
	
	-- Try successively generic matches until we run out of key combinations
	for i, t in ipairs(attemptOrder) do
		local key = {}
		for j, useKeyTable in ipairs(t) do
			if useKeyTable then
				key[j] = keyTable[j]
			else
				key[j] = 'all'
			end
		end
		key = table.concat(key, '-')
		mw.log(key) -- for debugging
		local attempt = cats[key]
		if attempt then
			return attempt
		end
	end
	error('No category match found; please define the category for key "all-all-all-all-all"')
end			

return p