Module:Article history/config: Difference between revisions

Content deleted Content added
make the article name available to the featured topic categories function
Update featured portal wording per request
 
(89 intermediate revisions by 17 users not shown)
Line 10:
-------------------------------------------------------------------------------
 
-- Makes a link to a template page surrounded by double curly braces. A
-- workalike for the {{tl}} template.
local function makeTemplateLink(s)
local openb = mw.text.nowiki('{{')
local closeb = mw.text.nowiki('}}')
return string.format('%s[[Template:%s|%s]]%s', openb, s, s, closeb)
end
 
-- Gets the Good Article topic for the given key. Uses
-- [[Module:Good article topics]].
local function getGoodArticleTopic(key)
if not key then
Line 17 ⟶ 27:
end
 
-- Returns the Good Article page link and display value for a given Good Article
-- key. If the key wasn't valid, the default Good Article page and display value
-- is returned instead.
local function getGoodArticleTopicLink(key)
local topic = getGoodArticleTopic(key)
Line 30 ⟶ 43:
end
 
-- Wrapper function for mw.language:formatDate, going through pcall to catch
-- invalid input errors.
local function getDate(format, date)
local success, result = pcall(lang.formatDate, lang, format, date)
Line 37 ⟶ 52:
end
 
-- Gets the date in the format YYYYMMDD, as a number. Months and dates are
-- zero-padded. Results from this function are intended to be used in date
-- calculations.
local function getYmdDate(date)
returndate = tonumber(getDate('Ymd', date))
if date then
return tonumber(date)
else
return nil
end
end
 
-- Gets the date in the format Month d, YYYY.
local function getLongDate(date)
return getDate('F j, Y', date)
end
 
-- Returns true if the given page is an existing title, and false or nil
local function makeTitle(page)
-- otherwise
local function titleExists(page)
local success, title = pcall(mw.title.new, page)
ifreturn success thenand title.exists
end
return title
 
-- Returns a truthy value if a date parameter for the given prefix has been
-- provided by the user.
local function isActiveDatedObject(articleHistoryObj, prefix)
local args = articleHistoryObj.args
local prefixArgs = articleHistoryObj.prefixArgs
return args[prefix .. 'date'] or prefixArgs[prefix]
end
 
-- Returns a date as formatted by getLongDate. If the date is invalid, it raises
-- an error using param as the parameter name containing the invalid date.
local function validateDate(param, date, articleHistoryObj)
local longDate = getLongDate(date)
if longDate then
return longDate
else
articleHistoryObj:raiseError(
string.format(
"invalid date '%s' detected in parameter '%s'",
tostring(date),
param
),
'Template:Article history#Invalid date'
)
end
end
 
-- Generates a data table for a date-related notice such as DYK and ITN. prefix
-- is the parameter prefix for that notice type (e.g. "dyk"), and suffixes is
-- an array of parameter suffixes in addition to "date" that is used by that
-- notice type (e.g. "entry" for the "dykentry" and "dyk2entry" parameters).
local function makeDateData(articleHistoryObj, prefix, suffixes)
local args = articleHistoryObj.args
local prefixArgs = articleHistoryObj.prefixArgs
 
-- Sanity checks
if prefixArgs[prefix] then
for _, t in ipairs(prefixArgs[prefix]) do
if not t.date then
articleHistoryObj:raiseError(
string.format(
"an argument starting with '%s%d' was detected, " ..
"but no '%s%ddate' parameter was specified",
prefix, t[1],
prefix, t[1]
),
'Template:Article history#No date parameter'
)
end
end
end
 
local data = {}
 
-- Organise the input
local function addData(sep)
local t = {}
local argPrefix = prefix .. sep
do
local key = argPrefix .. 'date'
t.date = validateDate(key, args[key], articleHistoryObj)
t.month, t.day, t.year = t.date:match('(%a+) (%d+), (%d+)')
t.day = tonumber(t.day)
t.year = tonumber(t.year)
t.ymdDate = getYmdDate(t.date)
end
for _, suffix in ipairs(suffixes) do
local key = argPrefix .. suffix
t[suffix] = args[key]
end
t.argPrefix = argPrefix
data[#data + 1] = t
end
if args[prefix .. 'date'] then
addData('')
end
if prefixArgs[prefix] then
for _, prefixData in ipairs(prefixArgs[prefix]) do
addData(tostring(prefixData[1]))
end
end
if #data < 1 then
error(string.format(
"no data items found for prefix '%s' and parameter checks failed'",
tostring(prefix)
))
end
 
return data
end
 
-- This makes the text for Main Page features such as DYKs and ITNs for the
-- dates contained in dateData (made with the makeDateData function).
-- The parameter $1 in the blurb will be replaced with the list of dates.
local function makeDateText(dateData, blurb, wantBold)
local bold = wantBold and "'''" or ""
local dates, doneLinks = {}, {}
for i, t in ipairs(dateData) do
local date
if t.link and not doneLinks[t.link] then
date = string.format('[[%s|%s]]', t.link, t.date)
doneLinks[t.link] = true
else
date = t.date
end
dates[i] = bold .. date .. bold
end
local dateList = mw.text.listToText(dates, ', ', ', and ')
return mw.message.newRawMessage(blurb, dateList):plain()
end
 
return {
 
-------------------------------------------------------------------------------
-- CONFIG TABLE START
Line 63 ⟶ 197:
-------------------------------------------------------------------------------
 
-- The statuses table containscontain validconfiguration tables for possible current statuses.
-- of the article.
-- Each statustable can have the following fields:
--
-- id: the main ID for the status. This should be the same as the configuration
-- table key.
-- aliases: a table of ID aliases that can be used to access the config table.
-- icon: The status icon.
-- iconSize: The icon size, including "px" suffix. The default is defined in
-- defaultStatusIconSize.
-- iconSmallSize: The icon size if we are outputting a small template. The
-- default is defined in defaultSmallStatusIconSize.
-- iconMultiSize: The icon size if we are outputting multiple status rows. The
-- default is defaultSmallStatusIconSizedefaultMultiStatusIconSize.
-- text: The status text. This may be a string or a function. If it is a
-- function, it takes an article history object as input, and should return
Line 80 ⟶ 214:
-- $1 - The full page name of the article or subject page
-- $2 - The page name without the namespace name
-- categories: An array ofThe categories usedset by the status. This may be an array of
-- category names, or a function. If it is a function, it takes an article
-- history object as the first parameter, and the current status object as
-- the second parameter, and should return an array of category objects.
-- noticeBarIcon: the icon to use for the notice bar. This can be a string, or
-- a function, or true. If it is a function it takes an article history
-- object as the first parameter, and should output the icon filename. If it
-- is true, it uses the value of icon. If it is nil then no notice bar icon
-- will be displayed.
-- noticeBarIconCaption: the caption to use for the notice bar icon. The status
-- name is used by default. This can be a string or a function. If it is a
-- function, it takes an article history object as its first parameter, and
-- should return the caption text. If this is absent, the icon caption is
-- used instead.
-- noticeBarIconSize: the size of the notice bar icon, including "px" suffix.
-- The default is set by defaultNoticeBarIconSize.
 
statuses = {
Line 100 ⟶ 249:
link = link or 'Wikipedia:Featured article candidates/' .. articlePage
local text = "'''%s''' is a [[Wikipedia:Featured articles|featured article]]; " ..
"it (or a previous version of it) has been '''''[[%s|identified]]''''' " ..
"as one of the best articles produced by the [[Wikipedia:Wikipedians|Wikipedia community]]. " ..
"Even so, if you can update or improve it, [[Wikipedia:Be bold|please do so]]."
Line 125 ⟶ 274:
text = "'''$1''' is a former [[Wikipedia:Featured article candidates|featured article candidate]]. " ..
"Please view the links under Article milestones below to see why " ..
"the nomination failedwas archived. For older candidates, please check the " ..
"[[Wikipedia:Featured article candidates/Archived nominations/Index|archive]]."
},
Line 146 ⟶ 295:
link = link or 'Wikipedia:Featured list candidates/' .. articlePage
local text = "'''%s''' is a [[Wikipedia:Featured lists|featured list]], " ..
"which means it has been '''''[[%s|identified]]''''' as one of the best " ..
"[[Wikipedia:ListsStand-alone lists|lists]] produced by the [[Wikipedia:Wikipedians|Wikipedia community]]. " ..
"If you can update or improve it, [[Wikipedia:Be bold|please do so]]."
return string.format(text, articlePage, link)
Line 162 ⟶ 311:
"[[Wikipedia:Featured list criteria|featured list standard]], you may " ..
"[[Wikipedia:Featured list candidates|renominate]] the article to " ..
"become a [[Wikipedia:Featured listlists|featured list]]."
},
FFLC = {
Line 170 ⟶ 319:
iconCaption = 'Former FLC',
text = "'''$1''' is a former [[Wikipedia:Featured list candidates|featured list candidate]]. " ..
"Please view the link under Article milestones below to see why the nomination failedwas archived. " ..
"Once the objections have been addressed you may " ..
"[[Wikipedia:Featured list candidates#Resubmitting nominations|resubmit]] " ..
Line 181 ⟶ 330:
isMulti = true,
statuses = {'FFA', 'GA'}
},
['FFAC/GA'] = {
id = 'FFAC/GA',
name = 'Former featured article candidate, current good article',
isMulti = true,
statuses = {'FFAC', 'GA'}
},
GA = {
Line 203 ⟶ 358:
if title.namespace == 1 then
ret[#ret + 1] = Category.new('Wikipedia good articles')
ret[#ret + 1] = Category.new('Wikipedia CD Selection-GAs')
ret[#ret + 1] = Category.new('GA-Class Good articles')
local topic = getGoodArticleTopic(articleHistoryObj.args.topic)
if topic then
Line 225 ⟶ 378:
name = 'Former good article nominee',
aliases = {'FAILEDGA'},
icon = 'Symbol unsupportoppose vote.svg',
text = function (articleHistoryObj)
local articlePage = articleHistoryObj.currentTitle.subjectPageTitle.prefixedText
Line 231 ⟶ 384:
local text = "'''%s''' was a '''''[[%s|%s]]''''' nominee, " ..
"but did not meet the [[Wikipedia:Good article criteria|good article criteria]] " ..
"at the time. There aremay be suggestions below for improving the article. " ..
"Once these issues have been addressed, the article can be " ..
"[[Wikipedia:Good article nominations|renominated]]. " ..
Line 280 ⟶ 433:
"[[Wikipedia:Featured topic candidates|featured topic candidate]]. " ..
"Please view the links under Article milestones below to see why " ..
"the nomination failedwas archived."
},
FPO = {
id = 'FPO',
name = 'Featured portal',
icon = 'CscrLinecons big-formerstar.svg',
text = "TheThis '''$2portal was Portal''' is a [[Wikipedia:Featured portals|featured portal candidates/Portal:$2|identified]],''' " ..
"as a [[Wikipedia:Featured portals|featured portal]] " ..
"which means it has been " ..
"'''''before the [[Wikipedia:FeaturedVillage portalpump candidates(proposals)/Portal:$2|identified]]'''''Archive 138#RfC " ..
"as one'about ofmarking the bestFeatured portals onprocess [[Wikipedia]].as "historical"|process ended in 2017]]..',
"If you see a way this portal can be updated or improved without " ..
"compromising previous work, please feel free to contribute.",
categories = function (articleHistoryObj)
return {Category.new(
Line 320 ⟶ 471:
"[[Wikipedia:Featured portal candidates|featured portal candidate]]. " ..
"Please see the links under Portal milestones below for its " ..
"original nomination page and why the nomination failed.",
categories = function (articleHistoryObj)
return {Category.new(
'Wikipedia featured portal candidates (contested)',
articleHistoryObj.currentTitle.text
)}
end
},
PR = {
Line 332 ⟶ 477:
-- header row.
id = 'PR',
name = 'Peer reviewed',
noticeBarIcon = 'Nuvola apps kedit.svg'
}
},
NA = {
 
-- A valid current status, but doesn't trigger a header row.
-- The following are statuses that
id = 'NA',
nullStatuses = {
noticeBarIcon = 'Nuvola apps kedit.svg'
PR = true
},
-- The following are invalid statuses.
 
invalidStatuses = {
FAC = {
id = 'FAC',
text = function (articleHistoryObj)
articleHistoryObj:raiseError(
string.format(
'use the template %s to nominate an article for Featured article status',
makeTemplateLink('fac')
),
'Template:Article history#Featured article candidates'
)
end
},
FAR = {
id = 'FAR',
text = function (articleHistoryObj)
articleHistoryObj:raiseError(
string.format(
'use the template %s to nominate an article for Featured article review',
makeTemplateLink('FAR')
),
'Template:Article history#Featured article review'
)
end
},
STUB = {
id = 'STUB',
aliases = {'START', 'B', 'A'},
text = function (articleHistoryObj)
},
local currentStatusParam = articleHistoryObj.cfg.currentStatusParam
NA = {
articleHistoryObj:raiseError(
id = 'NA',
string.format(
aliases = {'PR', ''}
"do not use '%s' as value of the '%s' parameter; these " ..
'assessments are the responsibility of individual ' ..
'WikiProjects',
articleHistoryObj.args[currentStatusParam],
currentStatusParam
),
'Template:Article history#WikiProject assessments'
)
end
},
},
 
-- This function allows the generation of custom status ID. It takes an
-- articleHistory object as the first parameter, and should output the status
-- ID.
getStatusIdFunction = function (articleHistoryObj)
-- Get the status ID. The status code is the code passed in from the
-- arguments, and the ID is the value contained in the config.
local statusesstatusCode = articleHistoryObj.args[articleHistoryObj.cfg.statusescurrentStatusParam]
local statusCode = articleHistoryObj.args.currentstatus
local statusId = articleHistoryObj:getStatusIdForCode(statusCode)
 
Line 383 ⟶ 556:
if ffaObj then
if not statusId then
articleHistoryObj:raiseError(
-- @TODO: Error
'former featured articles should have a current status',
'Template:Article history#Former featured articles'
)
elseif statusId == 'GA' then
statusId = 'FFA/GA'
elseif statusId ~== 'FFADGA' then
statusId = 'FFA'
-- @TODO: Error -
else
articleHistoryObj:raiseError(
string.format(
"'%s' is not a valid current status for former featured articles",
tostring(statusCode)
),
'Template:Article history#Former featured articles'
)
end
end
Line 398 ⟶ 582:
-- Notices
-------------------------------------------------------------------------------
 
-- The notices table contains configuration tables for notices about the article
-- that are unrelated to its current status.
-- Each configuration table can have the following fields:
--
-- id: the main ID for the notice. This should be the same as the configuration
-- table key.
-- isActive: a function that should return a truthy value if the notice should
-- be displayed, and a falsy value if not. (Falsy values are false and nil,
-- and truthy values are everything else.) The function takes an article
-- history object as its first parameter.
-- makeData: a function that should return a table of data to be used by other
-- functions in this notice configuration table. It can be accessed using
-- noticeObj:getData().
-- icon: the filename of the notice icon, minus the "File:" prefix.
-- iconCaption: the icon caption.
-- iconSize: The icon size, including "px" suffix. The default is defined in
-- defaultIconSize.
-- text: The notice text. This may be a string or a function. If it is a
-- function, it takes an article history object as the first parameter, and
-- the current notice object as the second parameter, and should return the
-- text string.
-- categories: The categories set by the notice. This may be an array of
-- category names, or a function. If it is a function, it takes an article
-- history object as the first parameter, and the current notice object as
-- the second parameter, and should return an array of category objects.
-- noticeBarIcon: the icon to use for the notice bar. This can be a string, or
-- a function, or true. If it is a function it takes an article history
-- object as the first parameter, and should output the icon filename. If it
-- is true, it uses the value of icon. If it is nil then no notice bar icon
-- will be displayed.
-- noticeBarIconCaption: the caption to use for the notice bar icon. This can be
-- a string or a function. If it is a function, it takes an article history
-- object as its first parameter, and should return the caption text. If this
-- is absent, the icon caption is used instead.
-- noticeBarIconSize: the size of the notice bar icon, including "px" suffix.
-- The default is set by defaultNoticeBarIconSize.
 
notices = {
Line 405 ⟶ 626:
local args = articleHistoryObj.args
local prefixArgs = articleHistoryObj.prefixArgs
-- ftmain is included here because it leads to better error
return (args.ftname or prefixArgs.ft) and true or false
-- messages than leaving it out, even though ftmain by itself is
-- invalid.
return args.ftname or args.ftmain or prefixArgs.ft
end,
makeData = function (articleHistoryObj)
Line 430 ⟶ 654:
num, num
),
'Template:Article history#ErrorsFeatured topic names'
)
else
Line 438 ⟶ 662:
data[#data + 1] = makeTopicData(args.ftname, args.ftmain)
if prefixArgs.ft then
for i_, t in ipairs(prefixArgs.ft) do
if t[1] > 1 then -- we use args.ftname instead of args.ft1name
data[#data + 1] = makeTopicData(t.name, t.main, t[1])
Line 451 ⟶ 675:
"featured topic names were specified; " ..
"please check the parameter names",
'Template:Article history#ErrorsFeatured topic names'
)
end
Line 469 ⟶ 693:
icon = function (articleHistoryObj, noticeObj)
local data = noticeObj:getData(articleHistoryObj)
if not data then
return nil
end
if data.isInFeaturedTopic then
return 'Cscr-featuredtopic.svg'
Line 477 ⟶ 704:
iconCaption = function (articleHistoryObj, noticeObj)
local data = noticeObj:getData(articleHistoryObj)
if not data then
return nil
end
if data.isInFeaturedTopic then
return 'Featured topic star'
Line 484 ⟶ 714:
end,
iconSize = '48px',
iconSmallSize = '30px',
text = function (articleHistoryObj, noticeObj)
local data = noticeObj:getData(articleHistoryObj)
if not data then
return nil
end
local article = articleHistoryObj.currentTitle.subjectPageTitle.prefixedText
 
Line 508 ⟶ 740:
local hasGoodLink = false
local text = {}
 
-- First topic
do
Line 572 ⟶ 804:
categories = function (articleHistoryObj, noticeObj)
local data = noticeObj:getData(articleHistoryObj)
if not data then
return nil
end
local status = articleHistoryObj:getStatusId()
local article = articleHistoryObj.currentTitle.subjectPageTitle.prefixedText
Line 585 ⟶ 820:
elseif status == 'FL' then
addCat('FL-Class Featured topics articles')
elseif status == 'FFA/GA' or status == 'FFAC/GA' or status == 'GA' then
addCat('GA-Class Featured topics articles')
else
Line 593 ⟶ 828:
-- Topic-specific status categories
local function addTopicCats(catFormat)
for i_, topic in ipairs(data) do
addCat(string.format(catFormat, topic.name))
end
Line 607 ⟶ 842:
-- Importance categories
local hasTop, hasHigh, hasMid, hasLow -- These check for dupes
for i_, topic in ipairs(data) do
local cat, sort
if topic.status == 'FT' then
Line 649 ⟶ 884:
local status = articleHistoryObj:getStatusId()
local data = {}
data.mainDate = args.maindate
 
local function validateMainDate(argName, dataName, dataTimestampName)
if not data.mainDate then
data[dataName] = args[argName]
if status == 'FA' then
if data[dataName] then
data.categoryOnly = 'Featured articles that have not appeared on the main page'
data[dataTimestampName] = getYmdDate(data[dataName])
elseif status == 'FL' then
if not data[dataTimestampName] then
data.categoryOnly = 'Featured lists that have not appeared on the main page'
articleHistoryObj:raiseError(
string.format(
"invalid date '%s' detected in parameter '%s'",
data[dataName],
argName
),
'Template:Article history#Invalid date'
)
end
end
return data
end
 
validateMainDate('maindate', 'mainDate', 'mainDateTimestamp')
data.mainDateTimestamp = getYmdDate(data.mainDate)
if data.currentTimestamp =mainDate getYmdDate()then
validateMainDate('maindate2', 'mainDate2', 'mainDate2Timestamp')
if not data.mainDateTimestamp then
if data.mainDate2 and data.mainDateTimestamp >= data.mainDate2Timestamp then
articleHistoryObj:raiseError(
articleHistoryObj:raiseError(
string.format(
"invalidthe date in the '%smaindate' detectedparameter must be earlier than the date in parameterthe 'maindatemaindate2' parameter",
'Template:Article history#Main Page date order'
data.mainDate
),
end
'Template:Article history#Errors'
)
end
 
-- The first Today's Featured List was on 13 June 2011.
data.currentTimestamp = getYmdDate()
data.isList = (status == 'FL' or status == 'FFL') and data.mainDateTimestamp >= 20110613
 
 
-- Whether the page is a list or not for the purposes of the Main
-- Page. The first Today's Featured List was on 13 June 2011, so
-- lists that were featured before then count as articles.
data.isList = (status == 'FL' or status == 'FFL')
and (not data.mainDate or data.mainDateTimestamp >= 20110613)
 
return data
Line 680 ⟶ 928:
text = function (articleHistoryObj, noticeObj)
local data = noticeObj:getData(articleHistoryObj)
if not data or not data.categoryOnlymainDate then
return nil
end
 
-- Build the blurb for all the possible combinations of past,
local blurb = "This article %s on Wikipedia's [[Main Page]] as " ..
-- present and future appearances of maindate and maindate2.
"[[Wikipedia:Today's featured %s/%s|Today's featured %s]]%s."
local longDate = getLongDate(data.mainDate)
local pagetype = data.isList and 'list' or 'article'
local mainDateLong = getLongDate(data.mainDate)
local tenseBlurb, dateBlurb
local mainDate2Long = data.mainDate2 and getLongDate(data.mainDate2)
if data.mainDateTimestamp < data.currentTimestamp then
local todaysFA = "Today's featured " .. pagetype
tenseBlurb = 'appeared'
 
dateBlurb = ' on ' .. longDate
local function makeFeaturedLink(date, display)
elseif data.mainDateTimestamp == data.currentTimestamp then
return string.format(
tenseBlurb = 'is currently on'
"[[Wikipedia:Today's featured %s/%s|%s]]",
dateBlurb = ''
pagetype,
date,
display or date
)
end
 
local function isPast(timestamp)
return timestamp < data.currentTimestamp
end
 
local function isCurrent(timestamp)
return timestamp == data.currentTimestamp
end
 
local function isFuture(timestamp)
return timestamp > data.currentTimestamp
end
 
if data.mainDate2 then
if isPast(data.mainDateTimestamp) then
if isPast(data.mainDate2Timestamp) then
return string.format(
"This article appeared on Wikipedia's Main Page as %s on %s, and on %s.",
todaysFA,
makeFeaturedLink(mainDateLong),
makeFeaturedLink(mainDate2Long)
)
elseif isCurrent(data.mainDate2Timestamp) then
return string.format(
"This article is currently on Wikipedia's Main Page as %s. It also appeared previously on %s.",
makeFeaturedLink(mainDate2Long, todaysFA),
makeFeaturedLink(mainDateLong)
)
else
return string.format(
"This article appeared on Wikipedia's Main Page as %s on %s, and will appear again on %s.",
todaysFA,
makeFeaturedLink(mainDateLong),
makeFeaturedLink(mainDate2Long)
)
end
elseif isCurrent(data.mainDateTimestamp) then
if isFuture(data.mainDate2Timestamp) then
return string.format(
"This article is currently on Wikipedia's Main Page as %s, and will appear again on %s.",
makeFeaturedLink(mainDateLong, todaysFA),
makeFeaturedLink(mainDate2Long)
)
else
return nil
end
else
if isFuture(data.mainDate2Timestamp) then
return string.format(
"This article will appear on Wikipedia's Main Page as %s on %s, and again on %s.",
todaysFA,
makeFeaturedLink(mainDateLong),
makeFeaturedLink(mainDate2Long)
)
else
return nil
end
end
else
if isPast(data.mainDateTimestamp) then
tenseBlurb = 'will appear'
return string.format(
dateBlurb = ' on ' .. longDate
"This article appeared on Wikipedia's Main Page as %s on %s.",
makeFeaturedLink(mainDateLong, todaysFA),
mainDateLong
)
elseif isCurrent(data.mainDateTimestamp) then
return string.format(
"This article is currently on Wikipedia's Main Page as %s.",
makeFeaturedLink(mainDateLong, todaysFA),
mainDateLong
)
else
return string.format(
"This article will appear on Wikipedia's Main Page as %s on %s.",
makeFeaturedLink(mainDateLong, todaysFA),
mainDateLong
)
end
end
return string.format(
blurb, tenseBlurb, pagetype, longDate, pagetype, dateBlurb
)
end,
categories = function (articleHistoryObj, noticeObj)
local data = noticeObj:getData(articleHistoryObj)
if not data then
return nil
end
local status = articleHistoryObj:getStatusId()
local cats = {}
 
if data.categoryOnly then
local pagetype = data.isList and 'lists' or 'articles'
cats[1] = Category.new(data.categoryOnly)
if data.mainDate and data.mainDateTimestamp <= data.currentTimestamp then
else
cats[#cats + 1] = Category.new(string.format(
'Featured %s that have appeared on the main page',
pagetype
data.isList and 'lists' or 'articles'
))
if data.mainDate2 and data.mainDate2Timestamp <= data.currentTimestamp then
cats[#cats + 1] = Category.new(string.format(
'Featured %s that have appeared on the main page twice',
pagetype
))
else
cats[#cats + 1] = Category.new(string.format(
'Featured %s that have appeared on the main page once',
pagetype
))
end
elseif status == 'FA' or status == 'FL' or data.mainDate then
cats[#cats + 1] = Category.new(string.format(
'Featured %s that have not appeared on the main page',
pagetype
))
end
Line 722 ⟶ 1,066:
-- Actions
-------------------------------------------------------------------------------
 
-- The actions table contains configuration tables for actions such as featured
-- article candidacies and peer review, etc.
-- Each configuration table can have the following fields:
--
-- id: the main ID for the action. This should be the same as the configuration
-- table key.
-- name: the name of the action. This can be a string or a function. If it is
-- a function, it takes an article history object as its first parameter and
-- the action object as its second parameter, and should return the name.
-- results: a table of possible results for the action. Keys in the table should
-- be a result ID, e.g. "promoted" or "kept", and values should be a subtable
-- with the following fields:
-- id: the result ID. This should be the same as the table key. It will
-- also define a possible input value for the action's result parameter.
-- text: the displayed result text. This may be a string or a function. If it
-- is a function, it takes an article history object as the first
-- parameter and the current action object as the second parameter, and
-- should return the result string.
-- aliases: an array of result ID aliases. Each of these will define a valid
-- value for the action's result parameter.
-- text: The action text. This may be a string or a function. If it is a
-- function, it takes an article history object as the first parameter and
-- the current action object as the second parameter, and should return the
-- text string.
-- categories: The categories set by the notice. This may be an array of
-- category names, or a function. If it is a function, it takes an article
-- history object as the first parameter and the current action object as the
-- second parameter, and should return an array of category objects.
-- noticeBarIcon: the icon to use for the notice bar. This can be a string, or
-- a function, or true. If it is a function it takes an article history
-- object as the first parameter, and should output the icon filename. If it
-- is true, it uses the value of icon. If it is nil then no notice bar icon
-- will be displayed.
-- noticeBarIconCaption: the caption to use for the notice bar icon. This can be
-- a string or a function. If it is a function, it takes an article history
-- object as its first parameter, and should return the caption text. If this
-- is absent, the icon caption is used instead.
-- noticeBarIconSize: the size of the notice bar icon, including "px" suffix.
-- The default is set by defaultNoticeBarIconSize.
 
actions = {
Line 738 ⟶ 1,122:
aliases = {'fail', 'failed'}
}
},
validStatuses = {
FFAC = true,
FA = true,
FFA = true
}
},
Line 765 ⟶ 1,144:
aliases = {'merge'}
}
},
validStatuses = {
FA = true,
FFA = true
},
categories = function (articleHistoryObj, actionObj)
Line 796 ⟶ 1,171:
aliases = {'pass', 'promoted', 'nom'}
}
},
validStatuses = {
}
},
Line 814 ⟶ 1,187:
aliases = {'fail', 'failed', 'remove', 'removed', 'demoted'}
}
},
validStatuses = {
FA = true,
FFAC = true
},
categories = function (articleHistoryObj, actionObj)
Line 844 ⟶ 1,213:
aliases = {'fail', 'failed'}
}
},
validStatuses = {
FFLC = true,
FL = true,
FFL = true
}
},
Line 870 ⟶ 1,234:
aliases = {'merge'}
}
},
validStatuses = {
FL = true,
FFL = true
},
categories = function (articleHistoryObj, actionObj)
Line 907 ⟶ 1,267:
aliases = {'fail', 'failed'}
}
},
validStatuses = false, -- Any status
},
FTR = {
Line 929 ⟶ 1,288:
aliases = {'merge'}
}
},
validStatuses = false, -- Any status
},
FPOC = {
Line 946 ⟶ 1,304:
aliases = {'fail', 'failed'}
}
},
validStatuses = {
FFPOC = true,
FPO = true,
FFPO = true
}
},
Line 972 ⟶ 1,325:
aliases = {'merge'}
}
},
validStatuses = {
FPO = true,
FFPO = true
}
},
Line 993 ⟶ 1,342:
aliases = {'fail', 'failed', 'not promoted'}
}
},
validStatuses = {
FGAN = true,
GA = true,
DGA = true,
FFAC = true,
FA = true,
FFA = true
},
categories = function (articleHistoryObj, actionObj)
Line 1,041 ⟶ 1,382:
text = 'Not listed'
}
},
validStatuses = {
GA = true,
DGA = true,
FFAC = true,
FA = true,
FFA = true
},
categories = function (articleHistoryObj, actionObj)
Line 1,078 ⟶ 1,412:
aliases = {'fail', 'failed'}
}
},
validStatuses = false
},
GTR = {
Line 1,100 ⟶ 1,433:
aliases = {'merge'}
}
},
validStatuses = false
},
PR = {
Line 1,117 ⟶ 1,449:
}
},
validStatuses = false,
categories = {'Old requests for peer review'}
},
Line 1,179 ⟶ 1,510:
}
},
categories = function (articleHistoryObj, actionObj)
validStatuses = false
local ret = {}
local result = actionObj.resultId
if result == 'copyedited' then
ret[1] = Category.new('Articles copy edited by the Guild of Copy Editors')
end
return ret
end
},
WAR = {
Line 1,209 ⟶ 1,547:
text = 'Demoted',
aliases = {'demote'}
},
},
validStatuses = false
},
AFD = {
Line 1,255 ⟶ 1,592:
text = 'Renamed',
aliases = {'rename', 'move', 'moved'}
},
},
validStatuses = false
},
MFD = {
id = 'MFD',
name = 'MiscellaneaMiscellany for deletion',
results = {
kept = {
Line 1,301 ⟶ 1,637:
text = 'Renamed',
aliases = {'rename', 'move', 'moved'}
},
},
validStatuses = false
},
TFD = {
Line 1,343 ⟶ 1,678:
},
renamed = {
id = 'renamed',
text = 'Renamed',
aliases = {'rename', 'move', 'moved'}
},
},
validStatuses = false
},
CSD = {
Line 1,361 ⟶ 1,696:
id = 'deleted',
text = 'Deleted',
aliases = {'delete', 'speedily deleted', 'speedy delete'}
},
merged = {
id = 'merged',
text = 'Merged',
aliases = {'merge'}
},
['no consensus'] = {
id = 'no consensus',
text = 'No consensus'
},
['speedily kept'] = {
Line 1,376 ⟶ 1,702:
text = 'Speedily kept',
aliases = {'speedy keep'}
},
['speedily deleted'] = {
id = 'speedily deleted',
text = 'Speedily deleted',
aliases = {'speedy delete'}
},
redirected = {
Line 1,386 ⟶ 1,707:
text = 'Redirected',
aliases = {'redirect'}
},
prod = {
id = 'prod',
text = 'Converted to [[WP:PROD|proposed deletion]]',
aliases = {'prodded'}
},
afd = {
id = 'afd',
text = 'Sent to [[WP:AFD|articles for deletion]]',
aliases = {'afded'}
},
renamed = {
Line 1,391 ⟶ 1,722:
text = 'Renamed',
aliases = {'rename', 'move', 'moved'}
},
},
validStatuses = false
},
PROD = {
Line 1,408 ⟶ 1,738:
text = 'Deleted',
aliases = {'delete'}
},
merged = {
id = 'merged',
text = 'Merged',
aliases = {'merge'}
},
['no consensus'] = {
id = 'no consensus',
text = 'No consensus'
},
['speedily kept'] = {
id = 'nospeedily consensuskept',
text = 'Speedily kept',
aliases = {'speedy keep'}
Line 1,432 ⟶ 1,753:
text = 'Redirected',
aliases = {'redirect'}
},
afd = {
id = 'afd',
text = 'Sent to [[WP:AFD|articles for deletion]]',
aliases = {'afded'}
},
renamed = {
Line 1,437 ⟶ 1,763:
text = 'Renamed',
aliases = {'rename', 'move', 'moved'}
},
},
validStatuses = false
},
DRV = {
Line 1,459 ⟶ 1,784:
text = 'Overturned',
aliases = {'overturn'}
},
restored = {
id = 'restored',
text = 'Restored',
aliases = {'restore'}
},
['no consensus'] = {
Line 1,464 ⟶ 1,794:
text = 'No consensus'
}
},
validStatuses = false
}
},
Line 1,472 ⟶ 1,801:
-- Collapsible notices
-------------------------------------------------------------------------------
 
-- The collapsibleNotices table contains configuration tables for notices that
-- go in the collapsible part of the template, underneath the actions.
-- Each configuration table can have the following fields:
--
-- id: the main ID for the notice. This should be the same as the configuration
-- table key.
-- isActive: a function that should return a truthy value if the notice should
-- be displayed, and a falsy value if not. (Falsy values are false and nil,
-- and truthy values are everything else.) The function takes an article
-- history object as its first parameter.
-- makeData: a function that should return a table of data to be used by other
-- functions in this notice configuration table. It can be accessed using
-- noticeObj:getData().
-- icon: the filename of the notice icon, minus the "File:" prefix.
-- iconCaption: the icon caption.
-- iconSize: The icon size, including "px" suffix. The default is defined in
-- defaultIconSize.
-- text: The notice text. This may be a string or a function. If it is a
-- function, it takes an article history object as the first parameter, and
-- the current collapsible notice object as the second parameter, and should
-- return the text string.
-- categories: The categories set by the notice. This may be an array of
-- category names, or a function. If it is a function, it takes an article
-- history object as the first parameter, and the current collapsible notice
-- object as the second parameter, and should return an array of category
-- objects.
-- noticeBarIcon: the icon to use for the notice bar. This can be a string, or
-- a function, or true. If it is a function it takes an article history
-- object as the first parameter, and should output the icon filename. If it
-- is true, it uses the value of icon. If it is nil then no notice bar icon
-- will be displayed.
-- noticeBarIconCaption: the caption to use for the notice bar icon. This can be
-- a string or a function. If it is a function, it takes an article history
-- object as its first parameter, and should return the caption text. If this
-- is absent, the icon caption is used instead.
-- noticeBarIconSize: the size of the notice bar icon, including "px" suffix.
-- The default is set by defaultNoticeBarIconSize.
 
collapsibleNotices = {
Line 1,477 ⟶ 1,844:
{
id = 'DYK',
icon = 'DYKSymbol questionmark iconquestion.svg',
iconCaption = 'Did You Know',
noticeBarIcon = true,
isActive = function (articleHistoryObj)
return isActiveDatedObject(articleHistoryObj, 'dyk')
local args = articleHistoryObj.args
local prefixArgs = articleHistoryObj.prefixArgs
return args.dykdate or args.dykdate2 or prefixArgs.dyk
end,
makeData = function (articleHistoryObj)
return makeDateData(articleHistoryObj, 'dyk', {'entry', 'nom', 'ignoreerror'})
local args = articleHistoryObj.args
local prefixArgs = articleHistoryObj.prefixArgs
 
-- Sanity checks
if prefixArgs.dyk then
for _, t in ipairs(prefixArgs.dyk) do
if not t.date then
articleHistoryObj:raiseError(
string.format(
"an argument starting with 'dyk%d' was detected, " ..
"but no 'dyk%ddate' parameter was specified",
t[1], t[1]
),
'Template:Article history#Errors'
)
end
end
end
 
local function validateDate(key, date)
local longDate = getLongDate(date)
if longDate then
return longDate
else
articleHistoryObj:raiseError(
string.format(
"invalid date '%s' detected in parameter '%s'",
tostring(date),
key
),
'Template:Article history#Errors'
)
end
end
 
local data = {}
 
-- Organise the input
if args.dykdate then
data[#data + 1] = {
date = validateDate('dykdate', args.dykdate),
entry = args.dykentry
}
end
if args.dykdate2 then
data[#data + 1] = {
date = validateDate('dykdate2', args.dykdate2),
entry = args.dykentry2
}
articleHistoryObj:addWarning(
"the 'dykdate2' and 'dykentry2' parameters are " ..
"deprecated; use 'dyk2date' and 'dyk2entry' instead",
'Template:Article history#Errors'
)
end
if prefixArgs.dyk then
for _, t in ipairs(prefixArgs.dyk) do
data[#data + 1] = {
date = validateDate('dyk' .. t[1] .. 'date', t.date),
entry = t.entry
}
end
end
if #data < 1 then
error('no DYKs found and parameter checks failed')
end
 
return data
end,
text = function (articleHistoryObj, collapsibleNoticeObj)
local data = collapsibleNoticeObj:getData(articleHistoryObj)
localif textnot =data {}then
return nil
 
end
local raPage
for _, t in ipairs(data) do
do
local raPage = 'Wikipedia:Recent additions/' ..
.. getDate('Y/F#j F Y', data[1]t.date)
localif raTitlenot = makeTitletitleExists(raPage) then
if not raTitle or not raTitle.exists then
raPage = 'Wikipedia:Recent additions'
end
t.link = raPage
end
local fact = 'fact from this article'
 
local nomPage = data[1].nom or ('Template:Did you know nominations/' .. articleHistoryObj.currentTitle.text)
text[#text + 1] = string.format(
if titleExists(nomPage) then
"A [[%s|'''fact from this article''']] appeared on Wikipedia's " ..
fact = '[[' .. nomPage .. '|' .. fact .. ']]'
"[[Main Page]] in the ''\"[[:Template:Did you know|Did you know?]]\"'' column ",
raPage
)
 
local dates = {}
for i, t in ipairs(data) do
dates[i] = 'on ' .. t.date
end
local blurb = "A " .. fact .. " appeared on " ..
text[#text + 1] = mw.text.listToText(dates, ', ', ', and ')
text "Wikipedia's [[#textMain + 1Page]] =in the " '.'.
"''\"[[:Template:Did you know|Did you know?]]\"'' " ..
"column on $1."
return table.concat(text)
return makeDateText(data, blurb, true)
end,
collapsibleText = function (articleHistoryObj, collapsibleNoticeObj)
local data = collapsibleNoticeObj:getData(articleHistoryObj)
if not data then
return nil
end
local ctext = {}
if #data == 1 and data[1].entry then
Line 1,594 ⟶ 1,891:
local entries = {}
local lastEntryDate
for i_, t in ipairs(data) do
entries[#entries + 1] = t.entry
lastEntryDate = t.date
Line 1,606 ⟶ 1,903:
ctext[#ctext + 1] = 'The text of the entries was:\n'
local list = mw.html.create('ul')
for i_, t in ipairs(data) do
if t.entry then
list:tag('li'):wikitext(string.format(
Line 1,624 ⟶ 1,921:
end,
categories = function (articleHistoryObj, collapsibleNoticeObj)
local data = collapsibleNoticeObj:getData(articleHistoryObj)
if not data then
return nil
end
local cats = {}
do
local status = articleHistoryObj:getStatusId()
local status = articleHistoryObj:getStatusId()
local cat
local statusCat
if status == 'FA' then
catif status == 'FA' then
statusCat = 'Wikipedia Did you know articles that are featured articles'
elseif status == 'FL' then
cat statusCat = 'Wikipedia Did you know articles that are featured lists'
elseif status == 'GA' or status == 'FFA/GA' then
cat statusCat = 'Wikipedia Did you know articles that are good articles'
else
statusCat = 'Wikipedia Did you know articles'
end
cats[#cats + 1] = Category.new(statusCat)
end
for _, t in ipairs(data) do
if not t.ignoreerror then
if t.entry then
local mCheckDYKEntry = require('Module:Check DYK hook')
if not mCheckDYKEntry._isValidHook(t.entry) then
cats[#cats + 1] = Category.new('Pages with a malformed DYK entry')
end
else
cats[#cats + 1] = Category.new('Pages with a missing DYK entry')
end
end
end
return cats
end
},
 
-- ITN
{
id = 'ITN',
isActive = function (articleHistoryObj)
return isActiveDatedObject(articleHistoryObj, 'itn')
end,
makeData = function (articleHistoryObj)
return makeDateData(articleHistoryObj, 'itn', {'link'})
end,
icon = 'Globe current.svg',
iconCaption = 'In the news',
noticeBarIcon = true,
noticeBarIconSize = '20px',
text = function (articleHistoryObj, collapsibleNoticeObj)
local data = collapsibleNoticeObj:getData(articleHistoryObj)
if not data then
return nil
end
local dates = {}
for _, t in ipairs(data) do
local date = {}
if t.link then
date.link = t.link
elseif t.ymdDate >= 20110701 then
date.link = string.format(
'Wikipedia:In the news/Candidates/%s %d',
t.month,
t.year
)
elseif t.ymdDate >= 20090101 then
date.link = string.format(
'Wikipedia:ITN archives/%d/%s',
t.year,
t.month
)
elseif t.ymdDate >= 20050101 then
date.link = string.format(
'Portal:Current events/%d %s %d',
t.year,
t.month,
t.day
)
end
date.date = t.date
dates[#dates + 1] = date
end
local intro
if #data > 1 then
intro = 'News items involving this article were'
else
catintro = 'WikipediaA Didnews youitem knowinvolving articlesthis article was'
end
cats[1]local blurb = Categoryintro ..new(cat)
" featured on Wikipedia's [[Main Page]] in the " ..
"''\"[[Template:In the news|In the news]]\"'' column on $1."
return makeDateText(dates, blurb)
end,
categories = function (articleHistoryObj, collapsibleNoticeObj)
local cats = {}
cats[1] = Category.new('Wikipedia In the news articles')
return cats
end
},
 
-- On This Day
{
id = 'OTD',
isActive = function (articleHistoryObj)
return isActiveDatedObject(articleHistoryObj, 'otd')
end,
makeData = function (articleHistoryObj)
return makeDateData(articleHistoryObj, 'otd', {'link', 'oldid'})
-- TODO: remove 'link' after it is no longer needed for tracking
end,
icon = 'Nuvola apps date.svg',
iconCaption = 'On this day...',
noticeBarIcon = true,
noticeBarIconSize = '20px',
text = function (articleHistoryObj, collapsibleNoticeObj)
local data = collapsibleNoticeObj:getData(articleHistoryObj)
if not data then
return nil
end
local dates = {}
for _, t in ipairs(data) do
local date = {}
date.date = t.date
date.link = t.link
if t.oldid then
-- TODO: Move this inside the main module
local oldid = tonumber(t.oldid)
if oldid and
math.floor(oldid) == oldid and
oldid > 0 and
oldid < math.huge
then
-- If the oldid is valid, it takes precedence over
-- explicit links.
date.link = 'Special:PermaLink/' .. t.oldid
else
collapsibleNoticeObj:addWarning(
string.format(
"invalid oldid '%s' detected in parameter '%s'; " ..
"if an oldid is specified it must be a positive integer",
t.oldid,
t.argPrefix .. 'oldid'
),
'Template:Article history#Invalid oldid'
)
end
end
dates[#dates + 1] = date
end
local intro
if #data > 1 then
intro = 'Facts from this article were'
else
intro = 'A fact from this article was'
end
local blurb = intro ..
" featured on Wikipedia's [[Main Page]] in the " ..
"''\"[[Wikipedia:Selected anniversaries|On this day...]]\"'' " ..
"column on $1."
return makeDateText(dates, blurb)
end,
categories = function (articleHistoryObj, collapsibleNoticeObj)
local cats = {}
cats[1] = Category.new('Selected anniversaries articles')
local data = collapsibleNoticeObj:getData(articleHistoryObj)
if data then
for _, t in ipairs(data) do
if t.link then
cats[#cats + 1] = Category.new(
'Article history templates with linked otd dates'
)
break
end
end
end
return cats
end
},
 
-- Article Collaboration and Improvement Drive
{
id = 'ACID',
isActive = function (articleHistoryObj)
return articleHistoryObj.args.aciddate
end,
icon = 'Article Collaboration and Improvement Drive.svg',
iconCaption = 'Article Collaboration and Improvement Drive',
noticeBarIcon = true,
noticeBarIconSize = '20px',
text = function (articleHistoryObj)
local args = articleHistoryObj.args
local blurb = 'This article was on the ' ..
'[[WP:ACID|Article Collaboration and Improvement Drive]] ' ..
'for the week of %s.'
local date = validateDate('aciddate', args.aciddate)
return string.format(blurb, date)
end
},
 
-- League of Copy Editors
{
id = 'LOCE',
isActive = function (articleHistoryObj)
return articleHistoryObj.args.loceNotAnActiveOption
end,
icon = 'LoCiconRevised.png',
iconCaption = 'League of Copyeditors',
iconSize = '25px',
noticeBarIcon = true,
text = 'This article, or a portion of it, was copyedited by the ' ..
'[[WP:LoCE|League of Copyeditors]].'
}
},
 
-------------------------------------------------------------------------------
-- Notice bar icons
-------------------------------------------------------------------------------
 
-- This table holds configuration tables for notice bar icons that don't appear
-- as part of a row. Other notice bar icons are handled in the statuses,
-- notices, actions, and collapsibleNotices tables.
-- It accepts the following fields:
-- isActive: a function that should return a truthy value if the notice should
-- be displayed, and a falsy value if not. (Falsy values are false and nil,
-- and truthy values are everything else.) The function takes an article
-- history object as its first parameter.
-- icon: the filename of the notice bar icon, minus the "File:" prefix.
 
noticeBarIcons = {
-- Peer review, or NA status
{
isActive = function (articleHistoryObj)
local status = articleHistoryObj:getStatusId()
-- @XXX: This is what the template does, but we should take into
-- account peer review actions as well.
return not status or status == 'PR' or status == 'NA'
end,
icon = 'Nuvola apps kedit.svg'
},
 
-- Wikipedia 1.0
{
isActive = function (articleHistoryObj)
return articleHistoryObj.args['v1.0NotAnActiveOption']
end,
icon = 'WP1 0 Icon.svg'
}
},
 
-------------------------------------------------------------------------------
-- Extra categories
-------------------------------------------------------------------------------
 
-- This table contains categories that don't appear as part of a row. It is an
-- array of functions; each function takes an article history object as input
-- and must return an array of category objects as output.
 
extraCategories = {
-- Four award
function (articleHistoryObj)
local yesno = require('Module:Yesno')
local ret = {}
local isFour = yesno(articleHistoryObj.args.four)
if isFour then
ret[#ret + 1] = Category.new('Wikipedia four award articles')
elseif isFour == false then
ret[#ret + 1] = Category.new('Wikipedia articles rejected for Four awards')
elseif articleHistoryObj:getStatusId() == 'FA' then
local isDYK = false
for _, obj in ipairs(articleHistoryObj:getCollapsibleNoticeObjects()) do
if obj.id == 'DYK' then
isDYK = true
break
end
end
if isDYK then
for _, obj in ipairs(articleHistoryObj:getActionObjects()) do
if obj.id == 'GAN' and obj.resultId == 'listed' then
ret[#ret + 1] = Category.new('Possible Wikipedia four award articles')
break
end
end
end
end
return ret
end,
 
-- Deletion to Quality award
function (articleHistoryObj)
local ret = {}
local status = articleHistoryObj:getStatusId()
if status == 'FA' or status == 'FL' or status == 'GA' then
local iAfd = 0
local hasAfd = false
local actionObjects = articleHistoryObj:getActionObjects()
for i, obj in ipairs(actionObjects) do
if obj.id == 'AFD' then
iAfd = i
hasAfd = true
break
end
end
if hasAfd then
local function hasNomination(id, result)
for i = iAfd + 1, #actionObjects do
local obj = actionObjects[i]
if obj.id == id and obj.resultId == result then
return true
end
end
return false
end
if status == 'GA' and hasNomination('GAN', 'listed') or
status == 'FL' and hasNomination('FLC', 'promoted') or
status == 'FA' and hasNomination('FAC', 'promoted')
then
ret[#ret + 1] = Category.new('Deletion to Quality Award candidates')
end
end
end
return ret
end,
},
 
Line 1,657 ⟶ 2,259:
oldid = 'oldid'
},
 
-- The parameter used to set the current status.
currentStatusParam = 'currentstatus',
 
-------------------------------------------------------------------------------
Line 1,670 ⟶ 2,275:
-- The default size for icons. The default is 30px.
defaultIconSize = '30px',
 
-- The default size for icons for small templates. The default is 15px.
defaultSmallIconSize = '15px',
 
-- The default size for status icons. The default is 50px.
defaultStatusIconSize = '50px',
 
-- The default size for status icons for smallmulti status templates. The default is 30px.
defaultSmallStatusIconSizedefaultMultiStatusIconSize = '30px',
 
-- The default size for notice bar icons. The default is 15px.
Line 1,685 ⟶ 2,287:
-- The default size for collapsible status icons. The default is 50px.
defaultCollapsibleNoticeIconSize = '20px',
 
-- The default size for collapsible status icons for small templates. The
-- default is 30px.
defaultSmallCollapsibleNoticeIconSize = '15px',
 
-------------------------------------------------------------------------------
Line 1,713 ⟶ 2,311:
-- The milestones result header.
['milestones-result-header'] = 'Result',
 
-- The text displayed when the current status is unknown.
['status-unknown'] = '?',
 
-- The format to display the action dates in. The syntax is the same as the
Line 1,722 ⟶ 2,317:
 
-- The category to use if any errors are detected.
['error-category'] = 'ArticleHistoryArticle history templates with errors',
 
-- Define boilerplate text for error messages and warnings, both with and
-- without help links.
-- $1 - the error message
-- $2 - a link to a help page and section for the error
['error-message-help'] = 'Error: $1 ([[$2|help]]).',
['error-message-nohelp'] = 'Error: $1.',
['warning-help'] = 'Warning: $1 ([[$2|help]]).',
['warning-nohelp'] = 'Warning: $1.',
 
-- Error for row objects that should output notice bar icons but for which no
-- icon values could be found.
['row-error-missing-icon'] = "notice bar icon config set to 'true' but no " ..
'image could be found',
 
-- A help link for row-error-missing-icon
['row-error-missing-icon-help'] = 'Template:Article history#Missing icon',
 
-- Error for action objects that aren't passed a code.
Line 1,736 ⟶ 2,342:
 
-- A help link for action-error-no-code
['action-error-no-code-help'] = 'Template:Article history#ErrorsAction codes',
 
-- Error for action objects that are passed an invalid code.
Line 1,744 ⟶ 2,350:
 
-- A help link for action-error-invalid-code
['action-error-invalid-code-help'] = 'Template:Article history#ErrorsAction codes',
 
-- Error for action objects with blank result parameters, where result
Line 1,754 ⟶ 2,360:
 
-- A help link for action-error-blank-result
['action-error-blank-result-help'] = 'Template:Article history#ErrorsAction results',
 
-- Error for action objects with invalid result parameters.
Line 1,764 ⟶ 2,370:
 
-- A help link for action-error-invalid-result
['action-error-invalid-result-help'] = 'Template:Article history#ErrorsAction results',
 
-- ErrorWarning for action objects with invalid dates.
-- $1 - the date input by the user
-- $2 - the date parameter name
['action-errorwarning-invalid-date'] = "invalid date '$1' detected in parameter '$2'",
 
-- A help link for action-errorwarning-invalid-date
['action-errorwarning-invalid-date-help'] = 'Template:Article history#ErrorsInvalid date',
 
-- Error for action objects with no dates.
-- $1 - the parameter number
-- $2 - the date parameter name
-- $3 - the action parameter name
['action-error-no-date'] = "no date specified for action $1; " ..
"please add a ['action-warning-no-date to parameter '$2'] or= remove"no thedate other parametersspecified for action $1; ", ..
"please add a date to parameter '$2' or remove the other parameters " ..
"beginning with '$3'",
 
-- A help link for action-errorwarning-no-date
['action-errorwarning-no-date-help'] = 'Template:Article history#ErrorsNo date',
 
-- The text to display in place of the action date if it is missing.
Line 1,789 ⟶ 2,397:
-- $1 - the oldid input by the user
-- $2 - the oldid parameter name
['action-errorwarning-invalid-oldid'] = "invalid oldid '$1' detected in parameter '$2'; " ..
"if an oldid is specified it must be a positive integer",
 
-- A help link for action-errorwarning-invalid-oldid
['action-errorwarning-invalid-oldid-help'] = 'Template:Article history#ErrorsInvalid oldid',
 
-- Error for invalid current status codes.
-- $1 - the code input by the user
['articlehistory-warning-invalid-status'] = "'$1' is not a valid status code",
 
-- A help link for articlehistory-warning-invalid-status
['articlehistory-warning-invalid-status-help'] = 'Template:Article history#Invalid status',
 
-- Warning for invocations that specify a current status without specifying any
-- actions.
['articlehistory-warning-status-no-actions'] = "a current status was supplied " ..
'without any actions',
 
-- A help link for articlehistory-warning-status-no-actions
['articlehistory-warning-status-no-actions-help'] = 'Template:Article history#No actions',
 
-- The text to display the current status at the bottom of the collapsible