Difference between revisions of "Module:Protection banner"

From Amanita Research
Jump to navigation Jump to search
(make indef blp categories work for 'all' as well as 'indef')
(try fairly ugly hack for office protection)
Line 143: Line 143:
 
{true, true, true, true, true},    -- 1
 
{true, true, true, true, true},    -- 1
 
{true, true, true, true, false},    -- 2
 
{true, true, true, true, false},    -- 2
{true, true, true, false, true},    -- 3
+
{true, true, false, true, true},    -- 3
{true, true, false, true, true},    -- 4
+
{true, true, true, false, true},    -- 4
{true, true, true, false, false},  -- 5
+
{true, true, false, true, false},  -- 5
{true, true, false, true, 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, true, false, false, false},  -- 8
Line 153: Line 153:
 
{false, false, false, false, false} -- 11
 
{false, false, false, false, false} -- 11
 
}
 
}
if reason ~= 'vandalism' then
+
attemptOrder[3], attemptOrder[4] = attemptOrder[4], attemptOrder[3]
+
local reasonFirst = {
 +
vandalism = true,
 +
office = true
 +
}
 +
 +
if reasonFirst[reason] then
 +
attemptOrder[3], attemptOrder[4] = attemptOrder[4], attemptOrder[3]  
 
attemptOrder[5], attemptOrder[6] = attemptOrder[6], attemptOrder[5]
 
attemptOrder[5], attemptOrder[6] = attemptOrder[6], attemptOrder[5]
 +
table.insert(attemptOrder, 2, {false, false, false, true, false}) -- To deal with office-protection
 
end
 
end
 
 

Revision as of 06:01, 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-semi-user-all-all'] = 'Wikipedia semi-protected user and user talk pages',
	['edit-semi-project-all-all'] = 'Semi-protected project pages',
	['edit-semi-file-all-all'] = 'Semi-protected images',
	['edit-semi-template-all-all'] = 'Wikipedia semi-protected templates',
	['edit-semi-portal-all-all'] = 'Semi-protected portals',
	['edit-semi-talk-all-all'] = 'Semi-protected talk pages',
	['edit-semi-all-vandalism-all'] = 'Wikipedia pages semi-protected against vandalism',
	['edit-full-user-all-all'] = 'Wikipedia protected user and user talk pages',
	['edit-full-file-all-all'] = 'Protected images',
	['edit-full-project-all-all'] = 'Protected project pages',
	['edit-full-template-all-all'] = 'Wikipedia protected templates',
	['edit-full-talk-all-all'] = 'Protected talk pages',
	['edit-full-all-vandalism-all'] = 'Wikipedia pages protected against vandalism',
	['edit-semi-all-dispute-all'] = 'Wikipedia pages semi-protected due to dispute',
	['edit-full-all-dispute-all'] = 'Wikipedia pages protected due to dispute',
	['move-full-all-dispute-all'] = 'Wikipedia pages move-protected due to dispute',
	['move-full-user-all-all'] = 'Wikipedia move-protected user and user talk pages',
	['move-full-project-all-all'] = 'Wikipedia move-protected project pages',
	['move-full-portal-all-all'] = 'Wikipedia move-protected portals',
	['move-full-all-vandalism-all'] = 'Wikipedia pages move-protected due to vandalism',
	['edit-semi-template-all-all'] = 'Wikipedia semi-protected templates',
	['move-full-template-all-all'] = 'Wikipedia move-protected templates',
	['edit-all-template-all-all'] = 'Wikipedia protected templates',
	['move-full-portal-all-all'] = 'Wikipedia move-protected portals',
	['edit-semi-all-sock-all'] = 'Wikipedia pages semi-protected from banned users',
	['edit-full-all-sock-all'] = 'Wikipedia pages protected from banned users',
	['edit-semi-all-blp-temp'] = 'Wikipedia temporarily semi-protected biographies of living people',
	['edit-full-all-blp-temp'] = 'Wikipedia temporarily protected biographies of living people',
	['edit-semi-all-blp-all'] = 'Wikipedia indefinitely semi-protected biographies of living people',
	['edit-full-all-blp-all'] = 'Wikipedia indefinitely protected biographies of living people',
	['edit-semi-all-all-indef'] = 'Wikipedia indefinitely semi-protected pages',
	['move-full-talk-all-all'] = 'Wikipedia move-protected talk pages',
	['move-full-all-all-indef'] = 'Wikipedia indefinitely move-protected pages',
	['edit-semi-all-all-all'] = 'Wikipedia semi-protected pages',
	['all-all-all-all-all'] = 'Wikipedia protected pages',
	['edit-semi-category-all-all'] = 'Wikipedia semi-protected categories',
	['edit-full-category-all-all'] = 'Wikipedia protected categories',
	['move-full-all-all-all'] = 'Wikipedia move-protected pages',
	['all-all-all-office-all'] = 'Wikipedia Office-protected pages',
	['pc-semi-all-all-all'] = 'Wikipedia pending changes protected pages (level 1)',
	['pc-reviewer-all-all-all'] = 'Wikipedia pending changes protected pages (level 2)',
}

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, true, false, false, false},  -- 8
		{true, false, true, false, false},  -- 9
		{true, false, false, false, false}, -- 10
		{false, false, false, false, false} -- 11
	}
	
	local reasonFirst = {
		vandalism = true,
		office = true
	}
	
	if reasonFirst[reason] then
		attemptOrder[3], attemptOrder[4] = attemptOrder[4], attemptOrder[3] 
		attemptOrder[5], attemptOrder[6] = attemptOrder[6], attemptOrder[5]
		table.insert(attemptOrder, 2, {false, false, false, true, false}) -- To deal with office-protection
	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