Content deleted Content added
HouseBlaster (talk | contribs) category for BER (are we still using this?) |
HouseBlaster (talk | contribs) m HouseBlaster moved page Module:Contentious topics talk banner to Module:Contentious topics/talk notice: marry with TM:Contentious topics/talk notice |
||
(17 intermediate revisions by 2 users not shown) | |||
Line 1:
require('strict')
local p = {}
local TableTools = require('Module:TableTools')
local yesno = require('Module:Yesno')
local setToList = require('Module:Set to list')
local checkForUnknownParameters = require('Module:Check for unknown parameters')._check
local restrictionsDatabase = mw.loadJsonData("Template:Contentious topics/Additional restrictions.json")
local restrictionsDefinition = mw.loadJsonData("Template:Contentious topics/Restrictions definition.json")
Line 8 ⟶ 10:
local categoryDatabase = mw.loadJsonData("Template:Contentious topics/Category database.json")
local function collectTopics(args, sectionParameter)
local seen = {}
local
local partialTopics = {}
local i = 2 -- initialize index
local keepGoing = true -- whether to keep checking for more CTOPs
local function add(value)
if value then
value = mw.text.trim(value)
if value ~= '' and not seen[value] then
local applicableSection =
if applicableSection
partialTopics[value] = applicableSection
else
table.insert(completeTopics, value)
end
seen[value] = true
keepGoing = true
end
end
Line 23 ⟶ 34:
-- Primary topic params
add(args.t)
add(args
add(args.topic)
add(args.topic1)
-- Additional topics via numbered forms
keepGoing = false -- this is set back to true if any of the below are found
add(args[i])
add(args['t' .. i]) add(args['topic' .. i])
i = i + 1 -- increment the index
end
return
end
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame)
local sectionParameter = yesno(args.section, args.section) or yesno(args.relatedcontent, args.relatedcontent) -- whether we are sections all the way down
local completeTopics, partialTopics = collectTopics(args, sectionParameter) -- completeTopics is a sequence. partialTopics is a table with topics as keys and scope as values
local restrictions = {} -- A list of which restrictions are enabled for easier iteration
local restrictionFlags = {} -- Track which restrictions are enabled, as a set
Line 45 ⟶ 61:
local subjectTitleObject = currentTitleObject.subjectPageTitle
local underRestrictions -- a boolean for whether there are any active restrictions
local articleOrPage -- the string "article" (if a mainspace
local protectionLevel -- the edit protection level
local numberOfCompleteTopics = #completeTopics -- the number of complete topics
local numberOfPartialTopics = TableTools.size(partialTopics) -- the number of partial topics (not a sequence, so we have to use TableTools.size)
local numberOfTopics = numberOfCompleteTopics + numberOfPartialTopics -- total number of topics
local section = sectionParameter or numberOfPartialTopics > 0 -- whether any topics apply to parts of the article
local messageBody -- the text within the message box
local messageBox -- the message box itself
local unknownParameterCheck -- the result of [[Module:Check for unknown parameters]]
local unknownParameterTable -- the table to pass to the [[Module:Check for unknown parameters]] call
local categories = '' -- initialize categories
local manualRestrictions = false -- have we set any restrictions via |parameters?
--[[
Line 69 ⟶ 90:
local function alwaysAddRestriction(restriction)
restrictionFlags[restriction] = true
end
-- Helper to add a category
local function addCategory(cat)
if cat then
categories = categories .. '[[Category:' .. cat .. '|' .. currentTitleObject.text .. ']]'
end
end
Line 77 ⟶ 105:
-- Topic-based restrictions
for _, topic in ipairs (
if topicWide then
for _, restriction in ipairs(topicWide) do
Line 84 ⟶ 112:
end
end
local additional = restrictionsDatabase["additional-available"][topic]
if additional then
for _, restriction in ipairs(additional) do
maybeAddRestriction(restriction)
end
end
end
for topic, scope in pairs(partialTopics) do
local additional = restrictionsDatabase["additional-available"][topic]
if additional then
Line 91 ⟶ 127:
end
end
local always = restrictionsDatabase["topic-wide"][topic]
if always then
for _, restriction in ipairs(always) do
maybeAddRestriction(restriction)
end
end
end
-- Add the protection level
if yesno(args.protection, true) or yesno(args.aeprotection, true) then
if protectionLevel then
-- handle ECR with protection correctly
if protectionLevel == "full" then alwaysAddRestriction("full") end
else
-- no ECR, so just add the protection as normal
alwaysAddRestriction(protectionLevel)
end
manualRestrictions = true
else
-- we have a |protection=foo parameter, but the page is *not* protected
addCategory(categoryDatabase['protection-error'])
end
end
Line 128 ⟶ 177:
-- Check whether any of the added restrictions are enabled
underRestrictions = #restrictions > 0 or args.other or args.other1
-- Determines whether we should use the string "article" or "page"
local articleOrPage = currentTitleObject:inNamespaces(1) and "article" or "page"
local function addToMessage(s)
messageBody = messageBody .. s
end
local function getTopicBlurb(code)
return frame:expandTemplate{
title = "Contentious topics/list",
args = { scope = code }
}
end
-- Makes a bullet point for a given contentious topic
-- the scope is either a string representing the exact scope of the topic
-- and is nil if it applies to the entire page or unspecified parts of the page
local function makeTopicBulletPoint(code, scope)
local topicBlurb = getTopicBlurb(code)
if topicBlurb == '' then
addCategory(categoryDatabase['bad-topic'])
-- scope is not nil, so we write that into the bullet point
addToMessage('* <b>' .. topicBlurb .. '</b>, specifically the parts about <b>' .. scope .. '</b>\n')
else
-- scope is nil, so we have nothing to add
addToMessage('* <b>' .. topicBlurb .. '</b>\n')
end
end
-- Makes a restriction bullet point
local function makeRestrictionBulletPoint(code)
Line 149 ⟶ 215:
end
--[[
Error categories
--]]
-- No contentious topic codes
if numberOfTopics == 0 then
addCategory(categoryDatabase['no-topic'])
end
--[[
Begin building the messageBody
--]]
messageBody = '<b>The [[Wikipedia:Contentious topics|contentious topics]] procedure applies to this ' .. articleOrPage .. '.</b>'
-- if there's only one topic, we make a short blurb
if numberOfTopics == 1 then
for topic, part in pairs(partialTopics) do
-- there's only one item, so this one runs once
addToMessage( ' Parts of this ' .. articleOrPage
.. (yesno(part, false) and '' or (' about <b>' .. part .. '</b>'))
.. ' relate to <b>'
.. getTopicBlurb(topic)
.. '</b>, a contentious topic.')
end
else
addToMessage(' This ' .. articleOrPage .. ' relates to <b>'
.. getTopicBlurb(completeTopics[1])
.. '</b>, a contentious topic.'
)
end
else
if numberOfCompleteTopics ~= 0 then
addToMessage('<p>The entire ' .. articleOrPage .. ' relates to ')
if numberOfCompleteTopics > 1 then
addToMessage('the following contentious topics:</p>\n')
for _, topic in ipairs(completeTopics) do
makeTopicBulletPoint(topic, nil)
end
else
addToMessage('<b>' .. getTopicBlurb(completeTopics[1]) .. '</b>, a contentious topic.</p>')
end
end
if numberOfPartialTopics ~= 0 then
addToMessage('<p>')
if numberOfCompleteTopics ~= 0 then
addToMessage('Additionally, parts ')
else
addToMessage('Parts ')
end
addToMessage('of this ' .. articleOrPage .. ' relate to ')
if numberOfPartialTopics > 1 then
addToMessage('the following contentious topics:</p>\n')
for topic, scope in pairs(partialTopics) do
if yesno(scope, false) then
-- the scope parameter is something like 'yes', which we can treat as nil
makeTopicBulletPoint(topic, nil)
else
makeTopicBulletPoint(topic, scope)
end
end
else
-- There's only one topic and scope, so this loop only runs once
for topic, scope in pairs(partialTopics) do
addToMessage('<b>' .. getTopicBlurb(topic) .. '</b>')
if yesno(scope, nil) == nil then
-- the scope is not a boolean value, so we have a free-text explanation of the applicable parts
addToMessage(', in particular the parts about <b>' .. scope .. '</b>')
end
addToMessage('.</p>')
end
end
end
end
if underRestrictions then
messageBody = '<p style="margin-top:0"><strong style="text-transform: uppercase;">Warning: active arbitration remedies</strong></p>'
Line 178 ⟶ 296:
.. '<p style="text-decoration:underline; text-align:center; font-size:120%;">The following restrictions apply to everyone editing this ' .. articleOrPage .. ':</p>\n'
for _, restriction in ipairs(restrictions) do
addCategory(categoryDatabase[restriction])
end
if args.other or args.other1 then
addCategory(categoryDatabase["other"])
-- then define a helper function to add a restriction
local function addOther(s)
addToMessage('* <b>' .. s .. '</b>\n')
end
-- then add the generic 'other' parameter
if args.other then
addOther(args.other)
end
-- and now we loop to infinity and beyond
local i = 1
while true do
if args['other' .. i] then
addOther(args['other' .. i])
i = i + 1
else
break
end
end
end
end
if not yesno(args.brief) then
.. 'any expected [[WP:Etiquette|standards of behaviour]], ' .. 'or any [[WP:List of policies|normal editorial process]] may be blocked or restricted by an administrator.</p>')
end
if section then
.. '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>')
end
if underRestrictions then
if args['placed-date'] then
elseif manualRestrictions then
addCategory(categoryDatabase['no-date'])
end
end
-- Now build the messageBox
Line 234 ⟶ 366:
-- Hard code for [[WP:BER]]
if TableTools.inArray(
messageBox = messageBox .. "<p class='PIA-flag' style='display:none; visibility:hidden;'>This page is subject to the extended confirmed restriction related to the Arab-Israeli conflict.</p>"
addCategory("Wikipedia pages subject to the extended confirmed restriction related to the Arab-Israeli conflict")
end
Line 254 ⟶ 387:
end
-- checking for unknown parameters with extensible modules is annoying; the module is primarily intended for hardcoded stuff
-- luckily, it makes use of a table for its main settings, and we can do some clever stuff with that
-- helper to mark a parameter as known
local function addKnownParameter(s)
table.insert(unknownParameterTable, s)
end
-- initialize the table with the keys of restrictionsDefinition JSON
unknownParameterTable = TableTools.keysToList(restrictionsDefinition, false, true)
-- then some hardcoded parameters
addKnownParameter('aeprotection')
addKnownParameter('brief')
addKnownParameter('nocat')
addKnownParameter('placed-date')
addKnownParameter('protection')
addKnownParameter('relatedcontent')
addKnownParameter('section')
addKnownParameter('small')
-- then add all of the partialTopics section parameters
for code, _ in pairs(partialTopics) do
addKnownParameter(code .. '-section')
end
-- then all the various topic parameters. Table is no longer a sequence; perform any computation requring a sequence above
unknownParameterTable['regexp1'] = 'topic[%d]*'
unknownParameterTable['regexp2'] = 't[%d]*'
unknownParameterTable['regexp3'] = '[%d]+'
unknownParameterTable['regexp4'] = 'other[%d]*'
-- set the tracking category
unknownParameterTable['unknown'] = '[[Category:' .. categoryDatabase['unknown'] .. '|_VALUE_' .. currentTitleObject.text .. ']]'
-- an finally, call the unknownParameterCheck
unknownParameterCheck = checkForUnknownParameters(unknownParameterTable, args)
return messageBox .. categories .. unknownParameterCheck
end
|