Module:Article history/config: Difference between revisions

Content deleted Content added
we need to activate the peer review icon if the current status is not specified as well
Update featured portal wording per request
 
(69 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('{{')
Line 16 ⟶ 18:
end
 
-- Gets the Good Article topic for the given key. Uses
-- [[Module:Good article topics]].
local function getGoodArticleTopic(key)
if not key then
Line 23 ⟶ 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 36 ⟶ 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 43 ⟶ 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
return title
end
end
 
-- 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 args[prefix .. 'date2'] or prefixArgs[prefix]
end
 
-- Returns a date as formatted by getLongDate. If the date is invalid, it raises
local function validateDate(key, date)
-- 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
Line 73 ⟶ 95:
"invalid date '%s' detected in parameter '%s'",
tostring(date),
keyparam
),
'Template:Article history#ErrorsInvalid 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
Line 95 ⟶ 121:
prefix, t[1]
),
'Template:Article history#ErrorsNo date parameter'
)
end
Line 104 ⟶ 130:
 
-- Organise the input
local function addData(sep)
if args[prefix .. 'date'] then
local t = {}
local argPrefix = prefix .. sep
do
local key = prefixargPrefix .. '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 = prefixargPrefix .. suffix
t[suffix] = args[key]
end
t.argPrefix = argPrefix
data[#data + 1] = t
end
if args[prefix .. 'date2date'] then
addData('')
local t, oldKeys, newKeys = {}, {}, {}
do
local oldKey = prefix .. 'date2'
local newKey = prefix .. '2date'
t.date = validateDate(oldKey, args[oldKey])
table.insert(oldKeys, "'" .. oldKey .. "'")
table.insert(newKeys, "'" .. newKey .. "'")
end
for i, suffix in ipairs(suffixes) do
local oldKey = prefix .. suffix .. '2'
local newKey = prefix .. '2' .. suffix
table.insert(oldKeys, "'" .. oldKey .. "'")
table.insert(newKeys, "'" .. newKey .. "'")
t[suffix] = args[oldKey]
end
data[#data + 1] = t
articleHistoryObj:addWarning(
string.format(
"the %s parameters are deprecated; use %s instead",
mw.text.listToText(oldKeys),
mw.text.listToText(newKeys)
),
'Template:Article history#Errors'
)
end
if prefixArgs[prefix] then
for _, prefixData in ipairs(prefixArgs[prefix]) do
addData(tostring(prefixData[1]))
local t = {}
do
local key = prefix .. tostring(prefixData[1]) .. 'date'
t.date = validateDate(key, args[key])
end
for i, suffix in ipairs(suffixes) do
local key = prefix .. tostring(prefixData[1]) .. suffix
t[suffix] = args[key]
end
data[#data + 1] = t
end
end
Line 166:
end
 
-- This makes the text for Main Page features such as DYKs and ITNs for the
local function makeDateText(dateData, blurb)
-- dates contained in dateData (made with the makeDateData function).
-- This makes the text for Main Page features such as DYKs and ITNs for the
-- datesThe containedparameter $1 in dateDatathe (madeblurb will be replaced with the makeDateDatalist function)of dates.
local function makeDateText(dateData, blurb, wantBold)
-- The parameter $1 in the blurb will be replaced with the list of dates.
local datesbold = {}wantBold and "'''" or ""
local dates, doneLinks = {}, {}
for i, t in ipairs(dateData) do
local date
if t.link then
if t.link and not doneLinks[t.link] then
dates[i] = string.format('on [[%s|%s]]', t.link, t.date)
date = string.format('[[%s|%s]]', t.link, t.date)
doneLinks[t.link] = true
else
dates[i]date = string.format('on %s', t.date)
end
dates[i] = bold .. date .. bold
end
local dateList = mw.text.listToText(dates, ', ', ', and ')
Line 183 ⟶ 187:
 
return {
 
-------------------------------------------------------------------------------
-- CONFIG TABLE START
Line 193 ⟶ 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 210 ⟶ 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 230 ⟶ 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 255 ⟶ 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 276 ⟶ 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 292 ⟶ 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 300 ⟶ 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 311 ⟶ 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 333 ⟶ 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 348 ⟶ 371:
end
end
 
-- GA categories
local gacat = articleHistoryObj.args.gacat
if gacat then
local cdSelectionCat = 'Wikipedia CD Selection - People'
if gacat == 'actors' then
ret[#ret + 1] = Category.new('Wikipedia good articles on actors, models and celebrities')
ret[#ret + 1] = Category.new(cdSelectionCat)
elseif gacat == 'bands' then
ret[#ret + 1] = Category.new('Wikipedia good articles on performers and composers')
elseif gacat == 'hist figures' then
ret[#ret + 1] = Category.new('Wikipedia good articles on historical figures')
ret[#ret + 1] = Category.new(cdSelectionCat)
elseif gacat == 'musicians' then
ret[#ret + 1] = Category.new('Wikipedia good articles on performers and composers')
ret[#ret + 1] = Category.new(cdSelectionCat)
elseif gacat == 'politicians' then
ret[#ret + 1] = Category.new('Wikipedia good articles on politicians')
ret[#ret + 1] = Category.new(cdSelectionCat)
elseif gacat == 'royalty' then
ret[#ret + 1] = Category.new('Wikipedia good articles on royalty')
ret[#ret + 1] = Category.new(cdSelectionCat)
elseif gacat == 'writers' then
ret[#ret + 1] = Category.new('Wikipedia good articles on writers and critics')
ret[#ret + 1] = Category.new(cdSelectionCat)
else
articleHistoryObj:addWarning(
string.format(
"invalid value '%s' detected in the 'gacat' parameter",
tostring(gacat)
),
'Template:Article history#Errors'
)
end
end
 
return ret
end
Line 391 ⟶ 378:
name = 'Former good article nominee',
aliases = {'FAILEDGA'},
icon = 'Symbol unsupportoppose vote.svg',
text = function (articleHistoryObj)
local articlePage = articleHistoryObj.currentTitle.subjectPageTitle.prefixedText
Line 397 ⟶ 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 446 ⟶ 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 486 ⟶ 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 515 ⟶ 494:
makeTemplateLink('fac')
),
'Template:Article history#ErrorsFeatured article candidates'
)
end
Line 527 ⟶ 506:
makeTemplateLink('FAR')
),
'Template:Article history#ErrorsFeatured article review'
)
end
Line 538 ⟶ 517:
articleHistoryObj:raiseError(
string.format(
"Please do not use '%s' as avalue of the ''%s'' parameter:; these " ..
'these assessments are the responsibility of individual WikiProjects.', ..
'WikiProjects',
articleHistoryObj.args[currentStatusParam],
currentStatusParam
),
'Template:Article history#ErrorsWikiProject assessments'
)
end
Line 549 ⟶ 529:
},
 
-- 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 statuses = articleHistoryObj.cfg.statuses
local statusCode = articleHistoryObj.args[articleHistoryObj.cfg.currentStatusParam]
local statusId = articleHistoryObj:getStatusIdForCode(statusCode)
Line 576 ⟶ 558:
articleHistoryObj:raiseError(
'former featured articles should have a current status',
'Template:Article history#ErrorsFormer featured articles'
)
elseif statusId == 'GA' then
statusId = 'FFA/GA'
elseif statusId == 'DGA' then
statusId = 'FFA'
else
articleHistoryObj:raiseError(
Line 586 ⟶ 570:
tostring(statusCode)
),
'Template:Article history#ErrorsFormer featured articles'
)
end
Line 598 ⟶ 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 605 ⟶ 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 630 ⟶ 654:
num, num
),
'Template:Article history#ErrorsFeatured topic names'
)
else
Line 638 ⟶ 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 651 ⟶ 675:
"featured topic names were specified; " ..
"please check the parameter names",
'Template:Article history#ErrorsFeatured topic names'
)
end
Line 669 ⟶ 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 677 ⟶ 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 684 ⟶ 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 708 ⟶ 740:
local hasGoodLink = false
local text = {}
 
-- First topic
do
Line 772 ⟶ 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 785 ⟶ 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 793 ⟶ 828:
-- Topic-specific status categories
local function addTopicCats(catFormat)
for i_, topic in ipairs(data) do
addCat(string.format(catFormat, topic.name))
end
Line 807 ⟶ 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 849 ⟶ 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 880 ⟶ 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 922 ⟶ 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 938 ⟶ 1,122:
aliases = {'fail', 'failed'}
}
},
validStatuses = {
FFAC = true,
FA = true,
FFA = true
}
},
Line 965 ⟶ 1,144:
aliases = {'merge'}
}
},
validStatuses = {
FA = true,
FFA = true
},
categories = function (articleHistoryObj, actionObj)
Line 996 ⟶ 1,171:
aliases = {'pass', 'promoted', 'nom'}
}
},
validStatuses = {
}
},
Line 1,014 ⟶ 1,187:
aliases = {'fail', 'failed', 'remove', 'removed', 'demoted'}
}
},
validStatuses = {
FA = true,
FFAC = true
},
categories = function (articleHistoryObj, actionObj)
Line 1,044 ⟶ 1,213:
aliases = {'fail', 'failed'}
}
},
validStatuses = {
FFLC = true,
FL = true,
FFL = true
}
},
Line 1,070 ⟶ 1,234:
aliases = {'merge'}
}
},
validStatuses = {
FL = true,
FFL = true
},
categories = function (articleHistoryObj, actionObj)
Line 1,107 ⟶ 1,267:
aliases = {'fail', 'failed'}
}
},
validStatuses = false, -- Any status
},
FTR = {
Line 1,129 ⟶ 1,288:
aliases = {'merge'}
}
},
validStatuses = false, -- Any status
},
FPOC = {
Line 1,146 ⟶ 1,304:
aliases = {'fail', 'failed'}
}
},
validStatuses = {
FFPOC = true,
FPO = true,
FFPO = true
}
},
Line 1,172 ⟶ 1,325:
aliases = {'merge'}
}
},
validStatuses = {
FPO = true,
FFPO = true
}
},
Line 1,193 ⟶ 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,241 ⟶ 1,382:
text = 'Not listed'
}
},
validStatuses = {
GA = true,
DGA = true,
FFAC = true,
FA = true,
FFA = true
},
categories = function (articleHistoryObj, actionObj)
Line 1,278 ⟶ 1,412:
aliases = {'fail', 'failed'}
}
},
validStatuses = false
},
GTR = {
Line 1,300 ⟶ 1,433:
aliases = {'merge'}
}
},
validStatuses = false
},
PR = {
Line 1,317 ⟶ 1,449:
}
},
validStatuses = false,
categories = {'Old requests for peer review'}
},
Line 1,379 ⟶ 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,409 ⟶ 1,547:
text = 'Demoted',
aliases = {'demote'}
},
},
validStatuses = false
},
AFD = {
Line 1,455 ⟶ 1,592:
text = 'Renamed',
aliases = {'rename', 'move', 'moved'}
},
},
validStatuses = false
},
MFD = {
id = 'MFD',
name = 'MiscellaneaMiscellany for deletion',
results = {
kept = {
Line 1,501 ⟶ 1,637:
text = 'Renamed',
aliases = {'rename', 'move', 'moved'}
},
},
validStatuses = false
},
TFD = {
Line 1,543 ⟶ 1,678:
},
renamed = {
id = 'renamed',
text = 'Renamed',
aliases = {'rename', 'move', 'moved'}
},
},
validStatuses = false
},
CSD = {
Line 1,561 ⟶ 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,576 ⟶ 1,702:
text = 'Speedily kept',
aliases = {'speedy keep'}
},
['speedily deleted'] = {
id = 'speedily deleted',
text = 'Speedily deleted',
aliases = {'speedy delete'}
},
redirected = {
Line 1,586 ⟶ 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,591 ⟶ 1,722:
text = 'Renamed',
aliases = {'rename', 'move', 'moved'}
},
},
validStatuses = false
},
PROD = {
Line 1,608 ⟶ 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,632 ⟶ 1,753:
text = 'Redirected',
aliases = {'redirect'}
},
afd = {
id = 'afd',
text = 'Sent to [[WP:AFD|articles for deletion]]',
aliases = {'afded'}
},
renamed = {
Line 1,637 ⟶ 1,763:
text = 'Renamed',
aliases = {'rename', 'move', 'moved'}
},
},
validStatuses = false
},
DRV = {
Line 1,659 ⟶ 1,784:
text = 'Overturned',
aliases = {'overturn'}
},
restored = {
id = 'restored',
text = 'Restored',
aliases = {'restore'}
},
['no consensus'] = {
Line 1,664 ⟶ 1,794:
text = 'No consensus'
}
},
validStatuses = false
}
},
Line 1,672 ⟶ 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,677 ⟶ 1,844:
{
id = 'DYK',
icon = 'DYKSymbol questionmark iconquestion.svg',
iconCaption = 'Did You Know',
iconSmallSize = '15px',
noticeBarIcon = true,
isActive = function (articleHistoryObj)
Line 1,685 ⟶ 1,851:
end,
makeData = function (articleHistoryObj)
return makeDateData(articleHistoryObj, 'dyk', {'entry', 'nom', 'ignoreerror'})
end,
text = function (articleHistoryObj, collapsibleNoticeObj)
local data = collapsibleNoticeObj:getData(articleHistoryObj)
if not data then
local raPage = 'Wikipedia:Recent additions/'
return nil
.. getDate('Y/F#j F Y', data[1].date)
doend
for _, t in ipairs(data) do
local raTitle = makeTitle(raPage)
local raPage = 'Wikipedia:Recent additions/' ..
if not raTitle or not raTitle.exists then
getDate('Y/F#j F Y', t.date)
if not titleExists(raPage) then
raPage = 'Wikipedia:Recent additions'
end
t.link = raPage
end
local blurbfact = string.format('fact from this article'
local nomPage = data[1].nom or ('Template:Did you know nominations/' .. articleHistoryObj.currentTitle.text)
"A [[%s|'''fact from this article''']] appeared on " ..
if titleExists(nomPage) then
"Wikipedia's [[Main Page]] in the " ..
"'fact = '\"[[:Template:Did' you.. know|DidnomPage you.. know?]]\"'|' ".. fact .. ']]'
end
"column $1.",
local blurb = "A " .. fact .. " appeared on " ..
raPage
"Wikipedia's [[Main Page]] in the " ..
)
"''\"[[:Template:Did you know|Did you know?]]\"'' " ..
return makeDateText(data, blurb)
"column on $1."
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,717 ⟶ 1,891:
local entries = {}
local lastEntryDate
for i_, t in ipairs(data) do
entries[#entries + 1] = t.entry
lastEntryDate = t.date
Line 1,729 ⟶ 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,747 ⟶ 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
cat 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
cats[1] = Category.new(cat)
return cats
end
Line 1,779 ⟶ 1,971:
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
Line 1,787 ⟶ 2,010:
local blurb = intro ..
" featured on Wikipedia's [[Main Page]] in the " ..
"''\"[[Template:In the news|In the news]]\"'' column on $1."
return makeDateText(datadates, blurb)
end,
categories = {'Wikipediafunction In(articleHistoryObj, the news articles'}collapsibleNoticeObj)
local cats = {}
cats[1] = Category.new('Wikipedia In the news articles')
return cats
end
},
 
Line 1,800 ⟶ 2,027:
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',
Line 1,808 ⟶ 2,036:
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
Line 1,817 ⟶ 2,078:
" featured on Wikipedia's [[Main Page]] in the " ..
"''\"[[Wikipedia:Selected anniversaries|On this day...]]\"'' " ..
"column on $1."
return makeDateText(datadates, blurb)
end,
categories = {'Selectedfunction anniversaries(articleHistoryObj, articles'}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
},
 
Line 1,860 ⟶ 2,136:
-------------------------------------------------------------------------------
-- Notice bar icons
-- This table holds notice bar icons only for icons that don't appear as part
-- of a row.
-------------------------------------------------------------------------------
 
-- 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 = {
Line 1,887 ⟶ 2,171:
-------------------------------------------------------------------------------
-- 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 = {
Line 1,903 ⟶ 2,188:
ret[#ret + 1] = Category.new('Wikipedia articles rejected for Four awards')
elseif articleHistoryObj:getStatusId() == 'FA' then
local isPossibleFour, isDYK = false, false
for i_, obj in ipairs(articleHistoryObj:getCollapsibleNoticeObjects()) do
if obj.id == 'DYK' then
isDYK = true
Line 1,911 ⟶ 2,196:
end
if isDYK then
for i_, obj in ipairs(articleHistoryObj:getActionObjects()) do
if obj.id == 'GAN' and obj:getResult().resultId == 'successfullisted' then
ret[#ret + 1] = Category.new('Possible Wikipedia four award articles')
isPossibleFour = true
break
end
end
end
end
if isPossibleFour then
return ret
ret[#ret + 1] = Category.new('Possible Wikipedia four award articles')
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,957 ⟶ 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,972 ⟶ 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 = '20px',
 
-------------------------------------------------------------------------------
Line 2,000 ⟶ 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 2,009 ⟶ 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
Line 2,026 ⟶ 2,334:
 
-- A help link for row-error-missing-icon
['row-error-missing-icon-help'] = 'Template:Article history#ErrorsMissing icon',
 
-- Error for action objects that aren't passed a code.
Line 2,034 ⟶ 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 2,042 ⟶ 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 2,052 ⟶ 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 2,062 ⟶ 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 2,087 ⟶ 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