Jump to content

Module:Contentious topics talk banner

Permanently protected module
From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by HouseBlaster (talk | contribs) at 00:49, 28 May 2025 (test). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

local p = {}
local TableTools = require('Module:TableTools')
local yesno = require('Module:Yesno')

local function collectTopics(args)
    local seen = {}
    local topics = {}

    local function add(value)
        if value then
            value = mw.text.trim(value)
            if value ~= '' and not seen[value] then
                seen[value] = true
                table.insert(topics, value)
            end
        end
    end

    -- Primary topic params
    add(args.topic)
    add(args.t)
    add(args[1])

    -- Additional topics via numbered forms
    -- Asking people to choose the top ten CTOP designations is reasonable
    for i = 2, 10 do
        add(args[i])
        add(args['t' .. i])
        add(args['topic' .. i])
    end

    return topics
end

local function makeBulletPoint(code, frame)
	-- given a CTOP code, outputs a bullet point explaining the scope of the contentious topic designation
	return '* <b>' .. frame:expandTemplate{ title = "Contentious topics/list", args = { scope=code } } .. '</b>\n'
end


function p.main(frame)
    local args = require('Module:Arguments').getArgs(frame)
    local topics = collectTopics(args)
	local multipleTopics = TableTools.length(topics) == 1
	local restrictionsDatabase = mw.loadJsonData("Template:Contentious topics/Additional restrictions.json")
	local restrictions = {}
	local currentTitleObject = mw.title.getCurrentTitle()
	local subjectTitleObject = currentTitleObject.subjectPageTitle
	local messageBody
	
	--== Generate the active restrictions==--
	-- helper function which add restrictions if active
	local function addRestriction(restriction)
		if yesno(args[restriction]) then
			table.insert(restrictions, restriction)
		end
	end
	
	-- add the always available restrictions, if applicable
	addRestriction("0RR")
	addRestriction("1RR")
	addRestriction("BRD")
	addRestriction("consensus-required")
	
	-- then check each topic...
    for _, topic in ipairs(topics) do
    	local currentTopicWideRestrictions = restrictionsDatabase["topic-wide"][topic]
    	--... add anything applicable to the entire topic...
        if currentTopicWideRestrictions then
        	TableTools.merge(currentTopicWideRestrictions, restrictions)
        end
        --...and add anything available to that topic in particular
        local availableTopicRestrictions = restrictionsDatabase["additional-available"][topic]
        if availableTopicRestrictions then
    		for __, availableRestriction in ipairs(availableTopicRestrictions) do
        		addRestriction(availableRestriction)
        	end
	    end
    end
    
    -- Finally, we automatically detect the protection level of the subject page
    local protectionLevel = subjectTitleObject["protectionLevels"]["edit"]
    if protectionLevel then
    	table.insert(restrictions, protectionLevel)
    end
	--== End generation of active restrictions ==--
	
	-- is this page under any restrictions?
	local underRestrictions = #restrictions == 0
	
	-- gets either "article" or "page", as the case may be
	local articleOrPage = frame:exapndTemplate{ template = 'Talkspace detect' , args = { main="article", default="page", other="page" } }

	messageBody = '<p>The [[Wikipedia:Contentious topics|contentious topics]] procedure applies to this '
		.. articleOrPage
		.. '.' 
		.. (yesno(args.section) and (' Parts of this ' .. articleOrPage .. ' relate ') or (' This ' .. articleOrPage .. ' relates '))
	
	if multipleTopics then
		messageBody = messageBody  .. 'to the following contentious topics:</p>\n'
		for _, topic in ipairs(topics) do
			messageBody = messageBody .. makeBulletPoint(topic, frame)
		end
	else
		messageBody = messageBody .. 'to <b>' 
		.. frame:expandTemplate{ title = "Contentious topics/list", args = { scope=topics[1] } }
		.. '</b>, a contentious topic.</p>'
	end
	
	if underRestrictions then
		-- we have some active restrictions
		-- so first prepend the warning in big bold text
		messageBody = '<strong style="text-transform: uppercase;">Warning: active arbitration remedies</strong>' .. messageBody
		-- and then append each restriction
		-- TODO ACTUALLY APPEND EACH RESTRICTION
	end
	
	messageBody = messageBody .. '><p>Editors who repeatedly or seriously fail to adhere to the [[WP:Five pillars|purpose of Wikipedia]], any expected [[WP:Etiquette|standards of behaviour]],' 
		.. 'or any [[WP:List of policies|normal editorial process]] may be blocked or restricted by an administrator.'
		.. 'Editors are advised to familiarise themselves with the [[Wikipedia:Contentious topics|contentious topics procedures]] before editing this page.</p>'
		.. yesno(section) and '<p>If it is unclear which parts of the page are related to this contentious topic, the content in question should be marked within the wiki text by an invisible comment.'
		.. 'If no comment is present, please ask an administrator for assistance. If in doubt it is better to assume that the content is covered.</p>' or ''

	local messageBox = require('Module:Message box').main( tmbox , 
		{
			["type"] = underRestrictions and "delete" or "content",
			["small"] = yesno(args.small),
			["image"] = "[[File:Commons-emblem-" 
				.. underRestrictions and "hand" or "issue" 
				.. ".svg|" .. 
				yesno(args.small) and "30" or "40"
				.. "px]]",
			["text"] = messageBody
		}
	)
	
	return messageBox
	
end

return p