local p = {}
local TableTools = require('Module:TableTools')
local yesno = require('Module:Yesno')
local restrictionsDatabase = mw.loadJsonData("Template:Contentious topics/Additional restrictions.json")
local restrictionsDefinition = mw.loadJsonData("Template:Contentious topics/Restrictions definition.json")
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
for i = 2, 10 do
add(args[i])
add(args['t' .. i])
add(args['topic' .. i])
end
return topics
end
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame)
local topics = collectTopics(args)
local multipleTopics = #topics > 1
local restrictions = {}
local restrictionFlags = {} -- Track which restrictions are set
local currentTitleObject = mw.title.getCurrentTitle()
local subjectTitleObject = currentTitleObject.subjectPageTitle
local messageBody
-- Helpers to add a restriction if it's active and hasn't been added yet
local function addRestriction(restriction, topicWide)
if (yesno(args[restriction]) or topicWide) and not restrictionFlags[restriction] then
restrictionFlags[restriction] = true
table.insert(restrictions, restriction)
end
end
local function maybeAddRestriction(restriction) return addRestriction(restriction, false) end
local function alwaysAddRestriction(restriction) return addRestriction(restriction, true) end
-- Add the always-available restrictions
maybeAddRestriction("0RR")
maybeAddRestriction("0RR-nocat")
maybeAddRestriction("1RR")
maybeAddRestriction("1RR-nocat")
maybeAddRestriction("BRD")
maybeAddRestriction("consensus-required")
-- Topic-based restrictions
for _, topic in ipairs(topics) do
local topicWide = restrictionsDatabase["topic-wide"][topic]
if topicWide then
for _, restriction in ipairs(topicWide) do
alwaysAddRestriction(restriction)
end
end
local additional = restrictionsDatabase["additional-available"][topic]
if additional then
for _, restriction in ipairs(additional) do
maybeAddRestriction(restriction)
end
end
end
-- Page protection restriction (if it's defined)
local protectionLevels = subjectTitleObject.protectionLevels and subjectTitleObject.protectionLevels["edit"] or {}
for _, prot in ipairs(protectionLevels) do
if restrictionsDefinition[prot] then
addRestriction(prot)
end
end
-- Check whether any of the added restrictions are actually defined, and are real restrictions
local underRestrictions = #restrictions > 0
local articleOrPage = currentTitleObject:inNamespaces(1) and "article" or "page"
local function makeTopicBulletPoint(code)
topicBlurb = frame:expandTemplate{ title = "Contentious topics/list", args = { scope=code } }
if topicBlurb == '' then
return '' -- maybe throw an error?
else
return '* <b>' .. topicBlurb .. '</b>\n'
end
end
local function makeRestrictionBulletPoint(code)
local def = restrictionsDefinition[code]
return def and ('* <b>' .. def .. '</b>\n') or ''
end
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 .. makeTopicBulletPoint(topic)
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
messageBody = '<strong style="text-transform: uppercase;">Warning: active arbitration remedies</strong>'
.. messageBody
.. '<p style="text-decoration:underline;">The following restrictions apply to all editors editing in the topic area:</p>\n'
for _, restriction in ipairs(restrictions) do
messageBody = messageBody .. makeRestrictionBulletPoint(restriction)
end
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(args.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