Module:Sandbox/Harryboyles/Article history

local p = { --collect categories to avoid cluttering the HTML tree. category = {}, includeonly = {}, errors = {}, title = mw.title.getCurrentTitle, }

--If the latest FAR failed --If currentstatus is FA or FL ==> Do nothing --If there is no currentstatus ==> Error --Else ==> FFA tr function p._statusFFA(args, action) local row = mw.html.create local result = mw.ustring.upper(args['action' .. action .. 'result']) local status = mw.ustring.upper(args['currentstatus'])

if result == 'FAILED' or result == 'REMOVED' or result == 'FAIL' or result == 'REMOVE' or result == 'DEMOTED' then if status == 'FA' and status == 'FL' then -- Do nothing elseif status then if status == 'FFA/GA' or args['small'] == 'yes' then iconsize = 30 else iconsize = 50 end row :tag('tr') :tag('td') :addClass('mbox-image') :wikitext('') :done :tag('td') :addClass('mbox-text') :wikitext("" .. p.title.prefixedText .. " is a former featured article. "..                       "Please see the links under Article milestones below for its original nomination page (for older articles, check " .. "the nomination archive) and why it was removed.") table.insert(p.includeonly, "") else row :tag('tr') :addClass('error') :tag('td') :addClass('mbox-image') :wikitext("") :done :tag('td') :addClass('mbox-text') :wikitext('Former featured articles should have a current status!') :done :done table.insert(p.errors, '') end end return tostring(row) end

function p.statusFAC(args) local row = mw.html.create row :tag('tr') :addClass('error') :tag('td') :addClass('mbox-image') :done :tag('td') :addClass('mbox-text') :wikitext("Use the template to nominate an article for Featured article status; " ..                    "this simplifies the nomination procedure. A bot will add the details to the ArticleHistory template when the FAC process is closed.") :done :done table.insert(p.errors, '') return tostring(row) end

function p.statusFFAC(args) local row = mw.html.create if args['small'] == 'yes' then iconsize = 30 else iconsize = 50 end row :tag('tr') :tag('td') :addClass('mbox-image') :wikitext("") :done :tag('td') :addClass('mbox-text') :wikitext("" .. p.title.prefixedText .. " is a former featured article candidate. "..                   "Please view the links under Article milestones below to see why the nomination failed. " ..                    "For older candidates, please check the archive.") table.insert(p.includeonly, "") return tostring(row) end

function p.statusFA(args) local row = mw.html.create for i=20, 1 , -1 do       if args["action".. i] and mw.ustring.upper(args["action".. i]) == "FAC" then actionlink = args["action" .. i .. "link"] break end end if not actionlink then actionlink = "Wikipedia:Featured article candidates/" .. p.title.prefixedText end if args['small'] == 'yes' then iconsize = 30 else iconsize = 48 end row :tag('tr') :tag('td') :addClass('mbox-image') :wikitext("") :done :tag('td') :addClass('mbox-text') :wikitext(""..p.title.prefixedText .. " is a featured article; " ..                   "it (or a previous version of it) has been identified " ..                    "as one of the best articles produced by the Wikipedia community. " ..                    "Even so, if you can update or improve it, please do so.") table.insert(p.includeonly, "") return tostring(row) end

function p.statusFAR(args) local row = mw.html.create row :tag('tr') :addClass('error') :tag('td') :addClass('mbox-image') :done :tag('td') :addClass('mbox-text') :wikitext("Use the template to nominate an article for Featured article status; " ..                    "this simplifies the nomination procedure. A bot will add the details to the ArticleHistory template when the FAR process is closed.") table.insert(p.errors, "") return tostring(row) end

function p.statusFFLC(args) if args['small'] == 'yes' then iconsize = 30 else iconsize = 50 end local row = mw.html.create row :tag('tr') :tag('td') :addClass('mbox-image') :wikitext("") :done :tag('td') :addClass('mbox-text') :wikitext(""..p.title.prefixedText .. " is a former featured list candidate. " ..                   "Please view the link under Article milestones below to see why the nomination failed. " ..                    "Once the objections have been addressed you may resubmit the article for featured list status.") table.insert(p.includeonly, "") return tostring(row) end

function p.statusFL(args) local row = mw.html.create for i=20, 1 , -1 do       if args["action".. i] == "FL" then actionlink = args["action" .. i .. "link"] break end end if not actionlink then actionlink = "Wikipedia:Featured list candidates/" .. p.title.prefixedText end if args['small'] == 'yes' then iconsize = 30 else iconsize = 48 end row :tag('tr') :tag('td') :addClass('mbox-image') :wikitext("") :done :tag('td') :addClass('mbox-text') :wikitext(""..p.title.prefixedText .. " is a featured list, " ..                   "which means it has been identified as one of the best lists produced by the Wikipedia community. " ..                    "If you can update or improve it, please do so.") table.insert(p.includeonly, "") return tostring(row) end

function p.statusFFL(args) local row = mw.html.create if args['small'] == 'yes' then iconsize = 30 else iconsize = 50 end row :tag('tr') :tag('td') :addClass('mbox-image') :wikitext("") :done :tag('td') :addClass('mbox-text') :wikitext(""..p.title.prefixedText .. " is a former featured list. " ..                   "Please see the links under Article milestones below for its original nomination page and why it was removed. " ..                    "If it has improved again to featured list standard, you may " ..                    "renominate the article to become a featured list.") :done :done return tostring(row) end

function p.statusGA(args, gatopic) local row = mw.html.create if string.len(gatopic) > 0 then topiclink = '/' .. gatopic else topiclink = '' end

if args['currentstatus'] =='FFA/GA' then iconsize = 25 elseif args['small'] == 'yes' then iconsize = 30 else iconsize = 40 end

row :tag('tr') :tag('td') :addClass('mbox-image') :wikitext("") :done :tag('td') :addClass('mbox-text') :wikitext(""..p.title.prefixedText .. " has been listed as one of the " ..gatopic.."good articles " ..                   "under the good article criteria. If you can improve it further, please do so. " ..                    " If it no longer meets these criteria, you can reassess it. ") if p.title:inNamespace("Talk") then table.insert(p.includeonly, "") if gatopic then table.insert(p.includeonly,"") else table.insert(p.includeonly, "|") end end return tostring(row) end

function p.statusFGAN(args, gatopic) local row = mw.html.create if args['small'] == 'yes' then iconsize = 30 else iconsize = 50 end row :tag('tr') :tag('td') :addClass('mbox-image') :wikitext("") :done :tag('td') :addClass('mbox-text') :wikitext(""..p.title.prefixedText .. " was one of the " .. gatopic .." good article nominees, " ..                   "but did not meet the good article criteria at the time. There are suggestions below for improving the article. " ..                    "Once these issues have been addressed, the article can be renominated. " ..                    "Editors may also seek a reassessment of the decision if they believe there was a mistake.") table.insert(p.includeonly, "") return tostring(row) end

function p.statusDGA(args, gatopic) local row = mw.html.create if args['small'] == 'yes' then iconsize = 30 else iconsize = 50 end row :tag('tr') :tag('td') :addClass('mbox-image') :wikitext("") :done :tag('td') :addClass('mbox-text') :wikitext(""..p.title.prefixedText .. " was one of the " .. gatopic .." good articles, " ..                   "but it has been removed from the list. There are suggestions below for improving the article to meet the good article criteria. " ..                    "Once these issues have been addressed, the article can be renominated. " ..                    "Editors may also seek a reassessment of the decision if they believe there was a mistake.") table.insert(p.includeonly, "") return tostring(row) end

function p.statusFFT(args) local row = mw.html.create if args['small'] == 'yes' then iconsize = 30 else iconsize = 50 end row :tag('tr') :tag('td') :addClass('mbox-image') :wikitext("") :done :tag('td') :addClass('mbox-text') :wikitext("This article is part of a former featured topic series. " ..                   "If it has improved again to featured topic standard, " ..                    "you may renominate the topic to become a featured topic.") :done :done return tostring(row) end

function p.statusFFTC(args) local row = mw.html.create if args['small'] == 'yes' then iconsize = 30 else iconsize = 50 end row :tag('tr') :tag('td') :addClass('mbox-image') :wikitext("") :done :tag('td') :addClass('mbox-text') :wikitext("This article is part of a former featured topic candidate. " ..                   "Please view the links under Article milestones below to see why the nomination failed.") return tostring(row) end

function p.statusFPO(args) local row = mw.html.create if args['small'] == 'yes' then iconsize = 30 else iconsize = 50 end row :tag('tr') :tag('td') :addClass('mbox-image') :wikitext("") :done :tag('td') :addClass('mbox-text') :wikitext("The "..p.title.text .." Portal is a featured portal, " ..                   "which means it has been identified " ..                    "as one of the best portals on Wikipedia. If you see a way this portal can be updated or improved without compromising previous work, please feel free to contribute.") table.insert(p.includeonly, "") return tostring(row) end

function p.statusFFPO(args) local row = mw.html.create if args['small'] == 'yes' then iconsize = 30 else iconsize = 50 end row :tag('tr') :tag('td') :addClass('mbox-image') :wikitext("") :done :tag('td') :addClass('mbox-text') :wikitext("This portal is a former featured portal. " ..                   "Please see the links under Portal milestones below for its original nomination page and why it was removed.") table.insert(p.includeonly, "") return tostring(row) end

function p.statusFFPOC(args) local row = mw.html.create if args['small'] == 'yes' then iconsize = 30 else iconsize = 50 end row :tag('tr') :tag('td') :addClass('mbox-image') :wikitext("") :done :tag('td') :addClass('mbox-text') :wikitext("This portal is a former featured portal candidate. " ..                   "Please see the links under Portal milestones below for its original nomination page and why the nomination failed.") table.insert(p.includeonly, "") return tostring(row) end

function p.statusInvalid(args) local row = mw.html.create row :tag('tr') :addClass('error') :tag('td') :addClass('mbox-image') :done :tag('td') :addClass('mbox-text') :wikitext("Please do not use " .. args['currentstatus'] .." as a currentstatus parameter: " ..                   "these assessments are the responsibility of individual WikiProjects.") table.insert(p.errors, "") return tostring(row) end

function p.statusUnknown(args) local row = mw.html.create row :tag('tr') :addClass('error') :tag('td') :addClass('mbox-image') :wikitext("") :done :tag('td') :addClass('mbox-text') :wikitext("Unknown current status!") :done :done table.insert(p.errors, "") return tostring(row) end

function p.statusFT(args) local isFA = false if args['ftname'] then if p.featuredTopicSum(args['ftname']) then isFA = true elseif args['ft2name'] then if p.featuredTopicSum(args['ft2name']) then isFA = true elseif args['ft3name'] then if p.featuredTopicSum(args['ft3name']) then isFA = true elseif args['ft4name'] then if p.featuredTopicSum(args['ft4name']) then isFA = true end end end end end

if args['small'] then iconsize = 30 else iconsize = 48 end

if isFA then image = '' else image = '' end local row = mw.html.create:tag('tr') :tag('td') :addClass('mbox-image') :wikitext(image) :done local cell = row:tag('td') :addClass('mbox-text')

if (args['ftmain'] == 'yes') then cell:wikitext('the main article in') else cell:wikitext('part of') end cell:wikitext(" the ' .. args['ftname'] .. " series, a ") if p.featuredTopicSum(args['ftname']) then cell:wikitext('featured topic. ') else cell:wikitext('good topic. ') end

if (args['ft2name']) then cell:wikitext('It is also ') if (args['ft2main'] == 'yes') then cell:wikitext('the main article in') else cell:wikitext('part of') end cell:wikitext(" the ' .. args['ft2name'] .. " series, a ") if p.featuredTopicSum(args['ft2name']) then cell:wikitext('featured topic') else cell:wikitext('good topic') end end

if (args['ft3name']) then cell:wikitext('It is also ') if (args['ft3main'] == 'yes') then cell:wikitext('the main article in') else cell:wikitext('part of') end cell:wikitext(" the ' .. args['ft3name'] .. " series, a ") if p.featuredTopicSum(args['ft3name']) then cell:wikitext('featured topic') else cell:wikitext('good topic') end end

if (args['ft4name']) then cell:wikitext('It is also ') if (args['ft4main'] == 'yes') then cell:wikitext('the main article in') else cell:wikitext('part of') end cell:wikitext(" the ' .. args['ft4name'] .. " series, a ") if p.featuredTopicSum(args['ft4name']) then cell:wikitext('featured topic') else cell:wikitext('good topic') end end

if args['ft2name'] then cell:wikitext('These are ') else cell:wikitext('This is ') end cell:wikitext("identified as among the best series of articles produced by the Wikipedia community. If you can update or improve ") if args['ft2name'] then cell:wikitext('them') else cell:wikitext('it') end cell:wikitext(", please do so.")

-- Categories if args['currentstatus'] == 'FA' then table.insert(p.includeonly,'') table.insert(p.includeonly,'') if args['ft2name'] then table.insert(p.includeonly,'') end if args['ft3name'] then table.insert(p.includeonly,'') end if args['ft4name'] then table.insert(p.includeonly,'') end

elseif args['currentstatus'] == 'FL' then table.insert(p.includeonly,'') table.insert(p.includeonly,'') if args['ft2name'] then table.insert(p.includeonly,'') end if args['ft3name'] then table.insert(p.includeonly,'') end if args['ft4name'] then table.insert(p.includeonly,'') end elseif args['currentstatus'] == 'FFA/GA' or args['currentstatus'] == 'GA' then table.insert(p.includeonly,'') table.insert(p.includeonly,'') if args['ft2name'] then table.insert(p.includeonly,'') end if args['ft3name'] then table.insert(p.includeonly,'') end if args['ft4name'] then table.insert(p.includeonly,'') end else table.insert(p.includeonly,'') table.insert(p.includeonly,'') if args['ft2name'] then table.insert(p.includeonly,'') end if args['ft3name'] then table.insert(p.includeonly,'') end if args['ft4name'] then table.insert(p.includeonly,'') end end

if p.featuredTopicSum(args['ftname']) then if args['ftmain'] == 'yes' then table.insert(p.includeonly,'') else table.insert(p.includeonly,'') end else if args['ftmain'] == 'yes' then table.insert(p.includeonly,'') else table.insert(p.includeonly,'') end end

if args['ft2name'] then if p.featuredTopicSum(args['ft2name']) then if args['ft2main'] == 'yes' then table.insert(p.includeonly,'') else table.insert(p.includeonly,'') end else if args['ft2main'] == 'yes' then table.insert(p.includeonly,'') else table.insert(p.includeonly,'') end end end if args['ft3name'] then if p.featuredTopicSum(args['ft3name']) then if args['ft3main'] == 'yes' then table.insert(p.includeonly,'') else table.insert(p.includeonly,'[[Category:High-importance Featured topics articles)')           end        else            if args['ft3main'] == 'yes' then                table.insert(p.includeonly,'')            else                table.insert(p.includeonly,'[[Category:Low-importance Featured topics articles)')            end        end    end

if args['ft4name'] then if p.featuredTopicSum(args['ft4name']) then if args['ft4main'] == 'yes' then table.insert(p.includeonly,'') else table.insert(p.includeonly,'[[Category:High-importance Featured topics articles)')           end        else            if args['ft4main'] == 'yes' then                table.insert(p.includeonly,'')            else                table.insert(p.includeonly,'[[Category:Low-importance Featured topics articles)')            end        end    end

return tostring(row) end

function p.featuredTopicSum(topic) --featured topics need at least two featured-class articles (FT criteria 3(a)(i)); if this criterion is not met, the article is a GT.--> --at least 50% of the articles in the topic need to be featured for the topic to be an FT   return mw.site.stats.pagesInCategory('Wikipedia featured topics ' .. topic .. ' featured content') > 1 and mw.site.stats.pagesInCategory('Wikipedia featured topics ' .. topic .. ' featured content') >= (mw.site.stats.pagesInCategory('Wikipedia featured topics ' .. topic) + mw.site.stats.pagesInCategory('Wikipedia featured topics ' .. topic .. ' good content')-2) end

function p.milestoneMainPage(args) local lang = mw.language.getContentLanguage local status = args['currentstatus']

if lang:formatDate('Ymd', args['maindate']) < lang:formatDate('Ymd', '20110613') then mptype = 'article' elseif args['currentstatus'] == 'FL' or args['currentstatus'] == 'FFL' then mptype = 'list' else mptype = 'article' end if args['small'] == 'yes' then iconsize = 15 else iconsize = 30 end local row = mw.html.create('tr') :tag('td') :addClass('mbox-image') :wikitext("") :done

local text = "This article " if lang:formatDate('Ymd', args['maindate']) < lang:formatDate('Ymd') then text = text .. "appeared" elseif lang:formatDate('Ymd', args['maindate']) > lang:formatDate('Ymd') then text = text .. "will appear" else text = text .. "is currently" end

text = text .. " on Wikipedia's Main Page as Today's featured " .. mptype .. "" if lang:formatDate('Ymd', args['maindate']) ~= lang:formatDate('Ymd') then text = text .. " on " .. lang:formatDate('F j, Y',args['maindate']) end text = text .. "."   row:tag('td') :addClass('mbox-text') :wikitext(text) if args['currentstatus'] == 'FA' or args['currentstatus'] == 'FL' then table.insert(p.includeonly, "") end

return tostring(row) end

function p.historyheader(args) local status = args['currentstatus'] local images = "" if status == 'PR' or status == 'NA' or not status then images = images .. ('')   end if args['dykdate'] then images = images .. ('')   end if args['itndate'] then images = images .. ('')   end if args['otddate'] then images = images .. ('')   end if args['aciddate'] then images = images .. ('')   end if args['loceNotAnActiveOption'] then images = images .. ('')   end if args['v1.0NotAnActiveOption'] then images = images .. ('')   end local header = mw.html.create('tr') :tag('th') :attr('colspan', 3) :attr('style', 'font-size:110%') :tag('span') :attr('style', 'float:left') :wikitext(images) :done if status == 'FL' or status == 'FFLC' or status == 'FFL' then header:wikitext('List') else header:wikitext(p.title.subjectNsText) end header:wikitext(' milestones')

return header:allDone end

function p.historyoutput(action, date, link, result, oldid, args) local output = mw.html.create:tag('tr') if action then action = mw.ustring.upper(action) end if result then result = mw.ustring.lower(result) end --Date local datecell = output:tag('td') if oldid then datecell:tag('span') :addClass('plainlinks') :wikitext('['.. p.title:fullUrl('oldid='..oldid)) if date then datecell:wikitext(' ' .. mw.language.getContentLanguage:formatDate('F j, Y', date)) else datecell:wikitext(' ?') table.insert(p.errors, ) end datecell:wikitext(']') datecell:done else if date then datecell:wikitext(mw.language.getContentLanguage:formatDate('F j, Y', date)) else datecell:wikitext(' ?') table.insert(p.errors, ) end end output:done

--Process if link == nil or link == "" then link = tostring(p.title.talkPageTitle) end local processcell = output:tag('td'):wikitext("'''[[" .. link .. "|")   if action == 'FAC' then        processcell:wikitext('Featured article candidate')    elseif action == 'FAR' or action == 'FARC' then        processcell:wikitext('Featured article review')    elseif action == 'BP' then        processcell:wikitext('Brilliant prose')    elseif action == 'RBP' then        processcell:wikitext('Refreshing brilliant prose')    elseif action == 'PR' then        processcell:wikitext('Peer review')    elseif action == 'WPR' and (result == "Approved" or result == "approved" or result == "Approved version" or result == "approved version") then        processcell:wikitext('WikiProject approved revision')    elseif action == 'WPR' and (result == "Copyedit" or result == "copyedit" or result == "Copyedited" or result == "copyedited" or result == "Proofread" or result == "proofread") then        processcell:wikitext('Guild of Copy Editors')    elseif action == 'WPR' and (result == "COTW" or result == "CotW" or result == "Cotw" or result == "cotw" or                     result == "Collaborated" or result == "collaborated" or result == "Collaboration" or result == "collaboration") then        processcell:wikitext('WikiProject collaboration')    elseif action == 'WPR' and (result == "Maindate" or result == "maindate") then        processcell:wikitext("Today's featured article")    elseif action == 'WPR' then        processcell:wikitext("WikiProject peer review")    elseif action == 'WAR' then        processcell:wikitext("WikiProject A-class review")    elseif action == 'GAN' or action == 'GAC' then        processcell:wikitext("Good article nominee")    elseif action == 'GAR' then        processcell:wikitext("Good article reassessment")    elseif action == 'MFD' then        processcell:wikitext("Miscellanea for deletion")    elseif action == 'AFD' then        processcell:wikitext("Articles for deletion")    elseif action == 'IFD' then        processcell:wikitext("Images for deletion")    elseif action == 'TFD' then        processcell:wikitext("Templates for deletion")    elseif action == 'CSD' then        processcell:wikitext("Candidate for speedy deletion")    elseif action == 'PROD' then        processcell:wikitext("Proposed deletion")    elseif action == 'DRV' then        processcell:wikitext("Deletion review")    elseif action == 'FTC' then        processcell:wikitext("Featured topic candidate")    elseif action == 'FTR' then        processcell:wikitext("Featured topic removal candidate")    elseif action == 'GTC' then        processcell:wikitext("Good topic candidate")    elseif action == 'GTR' then        processcell:wikitext("Good topic removal candidate")    elseif action == 'FLC' then        processcell:wikitext("Featured list candidate")    elseif action == 'FLR' then        processcell:wikitext("Featured list removal candidate")    elseif action == 'FPOC' then        processcell:wikitext("Featured portal candidate")    elseif action == 'FPOR' then        processcell:wikitext("Featured portal review")    end

processcell:wikitext("]]'''") output:done

--Result local resultcell = output:tag('td')

if action == 'FAC' or action == 'FLC' or action == 'FTC' or action == 'GTC' or action == 'FPOC' then if result == 'pass' or result == 'passed' or result == 'promoted' then resultcell:wikitext('Promoted') elseif result == 'fail' or result == 'failed' or result == 'not promoted' then resultcell:wikitext('Not promoted') else resultcell:wikitext('?') table.insert(p.errors, ) end elseif action == 'FAR' or action == 'FARC' or action == 'FLR' or action == 'FTR' or action == 'GTR' or action == 'FPOR' then if result == 'pass' or result == 'passed' or result == 'keep' or result == 'kept' then resultcell:wikitext('Kept') if action == 'FAR' or action == 'FARC' then table.insert(p.category, '') end elseif result == 'fail' or result == 'failed' or result == 'remove' or result == 'removed' or result == 'demoted' then resultcell:wikitext('Demoted') elseif result == 'merged' or result == 'merge' then resultcell:wikitext('Merged') else resultcell:wikitext('?') table.insert(p.errors, ) end elseif action == 'RBP' then if result == 'pass' or result == 'keep' or result == 'kept' then resultcell:wikitext('Kept') elseif result == 'fail' or result == 'failed' or result == 'remove' or result == 'removed' or result == 'demoted' then resultcell:wikitext('Not kept') else resultcell:wikitext('?') table.insert(p.errors, ) end elseif action == 'BP' then if result == 'pass' or result == 'promoted' or result == 'nominated' or result == 'nom' then resultcell:wikitext('Nominated') else resultcell:wikitext('?') table.insert(p.errors, ) end elseif action == 'GAN' or action == 'GAC' then if result == 'pass' or result == 'passed' or result == 'promoted' or result == 'listed' then resultcell:wikitext('Listed') elseif result == 'fail' or result == 'failed' or result == 'not promoted' or result == 'not listed' then resultcell:wikitext('Not liseted') else resultcell:wikitext('?') table.insert(p.errors, ) end elseif action == 'GAR' then if result == 'pass' or result == 'passed' or result == 'keep' or result == 'kept' then resultcell:wikitext('Kept') elseif result == 'fail' or result == 'failed' or result == 'delisted' then resultcell:wikitext('Delisted') elseif result == 'listed' then resultcell:wikitext('Listed') elseif result == 'not listed' then resultcell:wikitext('Not listed') else resultcell:wikitext('?') table.insert(p.errors, ) end elseif action == 'MFD' or action == 'AFD' or action == 'TFD' or action == 'IFD' or action == 'CSD' or action == 'PROD' then if result == 'withdrawn' or result == 'keep' or result == 'kept' then resultcell:wikitext('Kept') elseif result == 'delete' or result == 'deleted'then resultcell:wikitext('Deleted') elseif result == 'merged' or result == 'merge' then resultcell:wikitext('Merged') elseif result == 'no consensus' then resultcell:wikitext('No consensus') elseif result == 'speedy keep' or result == 'speedily kept' then resultcell:wikitext('Speedily kept') elseif result == 'speedy delete' or result == 'speedily deleted' then resultcell:wikitext('Speedily deleted') elseif result == 'redirect' or result == 'redirected' then resultcell:wikitext('Redirected') elseif result == 'rename' or result == 'renamed' or result == 'move' or result == 'moved' then resultcell:wikitext('Renamed') else resultcell:wikitext('?') table.insert(p.errors, ) end

elseif action == 'DRV' then if result == 'endorse' or result == 'endorsed' then resultcell:wikitext('Endorsed') elseif result == 'relisted' or result == 'relist' then resultcell:wikitext('Relisted') elseif result == 'overturn' or result == 'overturned' then resultcell:wikitext('Overturned') elseif result == 'no consensus' then resultcell:wikitext('No consensus') else resultcell:wikitext('?') table.insert(p.errors, ) end

elseif action == 'PR' then if result == 'not reviewed' then resultcell:wikitext('Not reviewed') else resultcell:wikitext('Reviewed') end

elseif action == 'WPR' then if result == 'approved' or result == 'approved version' then if oldid then resultcell:tag('small') :wikitext('[' .. p.title:fullUrl('diff=cur&oldid='..oldid) .. ' Diff to current version]') :done else resultcell:wikitext('?') table.insert(p.errors, ) end elseif result == 'copyedit' or result == 'copyedited' or result == 'proofread' then resultcell:wikitext('Copyedited') elseif result == 'maindate' then resultcell:wikitext('Main Page') elseif result == 'cotw' or result == 'collaborated' or result == 'collaboration' then resultcell:wikitext('Collaborated') elseif result == 'reviewed' then resultcell:wikitext('Reviewed') elseif result == 'not reviewed' then resultcell:wikitext('Not reviewed') else resultcell:wikitext('Reviewed') end

elseif action == 'WAR' then if result == 'pass' or result == 'passed' or result == 'approved' then resultcell:wikitext('Approved') elseif result == 'fail' or result == 'failed' or result == 'not approved' or result == 'not reviewed' then resultcell:wikitext('Not approved') elseif result == 'reviewed' or result == '' then resultcell:wikitext('Reviewed') elseif result == 'keep' or result == 'kept' then resultcell:wikitext('kept') elseif result == 'demote' or result == 'demoted' then resultcell:wikitext('Demoted') else resultcell:wikitext('?') table.insert(p.errors, ) end else resultcell:wikitext('?') table.insert(p.errors, ) end output:done:done

--Categories if action == 'FAR' or action == 'FARC' then if result == 'fail' or result == 'failed' or result == 'remove' or result == 'removed' or result == 'demoted' or result == 'merged' or result == 'merge' then if args['currentstatus'] == 'FA' or args['currentstatus'] == 'FL' then table.insert(p.category, '') else table.insert(p.category, '') end end elseif action == 'RBP' then if result == 'fail' or result == 'failed' or result == 'remove' or result == 'removed' or result == 'demoted' then table.insert(p.category, '') end elseif action == 'GAN' or action == 'GAC' then if result == 'fail' or result == 'failed' or result == 'not promoted' or result == 'not listed' then if args['currentstatus'] == 'FA' or args['currentstatus'] == 'GA' or args['currentstatus'] == 'FFA'  or args['currentstatus'] == 'FFA/GA' then

else table.insert(p.category, '') end end elseif action == 'GAR' then if result == 'fail' or result == 'failed' or result == 'delisted' then if args['currentstatus'] == 'FA' or args['currentstatus'] == 'GA' or args['currentstatus'] == 'FFA/GA' then

else table.insert(p.category, '') end end elseif action == 'FLR' then if result == 'fail' or result == 'failed' or result == 'remove' or result == 'removed' or result == 'demoted' or result == 'merged' or result == 'merge' then if args['currentstatus'] == 'FL' then table.insert(p.category, '') else table.insert(p.category, '') end end elseif action == 'PR' then table.insert(p.category, '') end return output end

function p.milestoneDYK(args) local td = mw.html.create('tr') local row = td   if args['action1'] then row = row:tag('td') :attr('colspan', '3') :attr('width', '100%') if args['dykentry'] then row = row:tag('table') :addClass('collapsible collapsed') :attr('style', 'margin: 0; padding: 0; border-collapse: collapse; width: 100%; background: transparent') :tag('tr') :tag('th') :attr('style', 'font-weight: normal; text-align: left; width: 100%') end row = row:wikitext('&#32;') else row = row:tag('td') :addClass('mbox-image') :wikitext('') :done if args['dykentry'] then row = row:tag('td') :addClass('mbox-text') :tag('table') :addClass('collapsible collapsed') :attr('style', 'margin: 0; padding: 0; border-collapse: collapse; width: 100%; background: transparent') :tag('tr') :tag('th') :attr('style', 'font-weight: normal; text-align: left; width: 100%') else row = row:tag('td') :addClass('mbox-text') end end local lang = mw.language.getContentLanguage local text if mw.title.makeTitle('Wikipedia', 'Recent additions/' .. lang:formatDate('Y/F#j F Y', args['dykdate'])).exists then text = "A fact from this article" else text = "A fact from this article" end text = text .." appeared on Wikipedia's Main Page in the  \"Did you know?\"  column on ".. lang:formatDate('F j, Y',args['dykdate']) if args['dykdate2'] then text = text .. ', and on '.. lang:formatDate('F j, Y',args['dykdate']) end text = text .. '.'   row = row:wikitext(text) if args['dykentry'] then row = row:done:done :tag('tr') :tag('td') :attr('style', 'border: 1px silver solid') :wikitext("The text of the entry was: Did you know " .. args['dykentry'].."") :done:done:done elseif args['action1'] then row:done end if args['action1'] then row:done end row:done

if args['currentstatus'] == FA then table.insert(p.includeonly, '') elseif args['currentstatus'] == FL then table.insert(p.includeonly, '') elseif args['currentstatus'] == 'FFA/GA' or args['currentstatus'] == 'GA' then table.insert(p.includeonly, '') else table.insert(p.includeonly, '') end

return row:allDone end

function p.milestoneITN(args) local lang = mw.language.getContentLanguage table.insert(p.category,"") local mboximage = "" local text = "A news item involving this article was featured on Wikipedia's Main Page in the \"In the news\"" if args['itnlink'] then text = text .. " column" else text = text .. " column" end text = text .. " on " .. lang:formatDate('F j, Y', args['itndate']) if args['itndate2'] then text = text .. ", and on " .. lang:formatDate('F j, Y', args['itndate2']) end text = text .. '.'

local row = mw.html.create('tr') if args['action1'] then row:tag('td') :attr('colspan', '3') :wikitext(mboximage .. " " .. text) else row:tag('td') :addClass('mbox-image') :wikitext(mboximage) :done :tag('td') :addClass('mbox-text') :wikitext(text) end return row end

function p.milestoneOTD(args) local lang = mw.language.getContentLanguage table.insert(p.category, "") local mboximage = "" local text = "A fact from this article was featured on Wikipedia's Main Page in the \"On this day...\"" if args['otdlink'] then text = text .. " column" else text = text .. " column" end text = text .. " on " .. lang:formatDate('F j, Y', args['otddate']) if args['otddate2'] then text = text .. ", and on " .. lang:formatDate('F j, Y', args['otddate2']) end text = text .. '.'

local row = mw.html.create('tr') if args['action1'] then row:tag('td') :attr('colspan', '3') :wikitext(mboximage .. " " .. text) else row:tag('td') :addClass('mbox-image') :wikitext(mboximage) :done :tag('td') :addClass('mbox-text') :wikitext(text) end return row end

function p.milestoneACID(args) local lang = mw.language.getContentLanguage local mboximage = "" local text = "This article was on the Article Collaboration and Improvement Drive for the week of " .. lang:formatDate('F j, Y', args['aciddate']) .. '.'

local row = mw.html.create('tr') if args['action1'] then row:tag('td') :attr('colspan', '3') :wikitext(mboximage .. " " .. text) else row:tag('td') :addClass('mbox-image') :wikitext(mboximage) :done :tag('td') :addClass('mbox-text') :wikitext(text) end return row end

function p.milestoneLoC(args) local mboximage = "" local text = "This article, or a portion of it, was copyedited by the League of Copyeditors."

local row = mw.html.create('tr') if args['action1'] then row:tag('td') :attr('colspan', '3') :wikitext(mboximage .. " " .. text) else row:tag('td') :addClass('mbox-image') :wikitext(mboximage) :done :tag('td') :addClass('mbox-text') :wikitext(text) end return row end

function p.currentstatus(args) local row = mw.html.create local statuses = { FA="Featured article", FAR="Featured article review candidate", FARC="Featured article review candidate", FFA="Former featured article", ["FFA/GA"]="Former featured article, current good article", FFAC="Former featured article candidate", FACFAILED="Former featured article candidate", FFLC="Former featured list candidate", FL="Featured list", FFL="Former featured list", GA="Good article", FGAN="Former good article nominee", FAILEDGA="Former good article nominee", DGA="Delisted good article", DELISTEDGA="Delisted good article", FFT="Part of former featured topic", FFTC="Former featured topic candidate", FPO="Featured portal", FFPO="Former featured portal", FFPOC="Former featured portal candidate", PR="Peer reviewed", }

local currentstatus = false for i=2, 20, 1 do       if args['action'..i] then currentstatus = true end end if currentstatus then local td = row:tag('tr'):tag('td') :attr('colspan', '3') if statuses[args['currentstatus']] then td:wikitext("Current status: " .. statuses[args['currentstatus']] .. "") if args['currentstatus'] == "FA" or args['currentstatus'] == "FL" or args['currentstatus'] == "FFA/GA" or args['currentstatus'] == "GA" then if args['gacat'] then td:wikitext(" (" .. args['gacat'] .. ")")               end end else td:wikitext("Current status: ?") end elseif args['action1'] == nil then row:tag('tr') :addClass('error') :tag('td') :addClass('mbox-image') :wikitext("") :done :tag('td') :addClass('mbox-text') :wikitext("Current status is supplied without any actions!") table.insert(p.errors,"") end return row end

function p.fourawardtest(args, status) -- If article has not yet been tested for WP:FOUR if args['four'] then return false end -- If article has been on DYK if not args['dykdate'] then return false end -- If article is currently FA   if status ~= FA then return false end -- If successful GAN is anywhere in the history for i=1, 20, 1 do       if args['action'..i] and mw.ustring.upper(args['action' .. i]) == 'GAN' then if args['action'..i .. 'result'] and mw.ustring.lower(args['action' .. i .. 'result']) == 'listed' then return true end end end --No successful GAN in history return false end

function p._articlehistory(args, frame) local status = args['currentstatus'] local gatopic = frame:expandTemplate { title='GA/Topic', args = {args['topic']}} if status then status = mw.ustring.upper(args['currentstatus']) end

local tbl = mw.html.create('table')

tbl :addClass('tmbox') :addClass('tmbox-notice')

if args.small == 'yes' then tbl:addClass('mbox-small') end

--Sorting current status --FFA check based on most recent FAR (if there is one) for i=20, 1 , -1 do       if args["action".. i] and mw.ustring.upper(args["action".. i]) == "FAR" then tbl:node(p._statusFFA(args, i)) break end end

if status == 'FFA' then -- Already covered in FFA check previously-- elseif status == 'FAC' then tbl:node(p.statusFAC(args)) elseif status == 'FFAC' or status == 'FACFAILED' then tbl:node(p.statusFFAC(args)) elseif status == 'FA' then tbl:node(p.statusFA(args)) elseif status == 'FAR' then tbl:node(p.statusFAR(args)) elseif status == 'FFLC' then tbl:node(p.statusFFLC(args)) elseif status == 'FL' then tbl:node(p.statusFL(args)) elseif status == 'FFL' then tbl:node(p.statusFFL(args)) elseif status == 'FFA/GA' or status == 'GA' then tbl:node(p.statusGA(args, gatopic)) elseif status == 'FGAN' or status == 'FAILEDGA' then tbl:node(p.statusFGAN(args, gatopic)) elseif status == 'DGA' or status == 'DELISTEDGA' then tbl:node(p.statusDGA(args, gatopic   )) elseif status == 'FFT' then tbl:node(p.statusFFT(args)) elseif status == 'FFTC' then tbl:node(p.statusFFTC(args)) elseif status == 'FPO' then tbl:node(p.statusFPO(args)) elseif status == 'FFPO' then tbl:node(p.statusFFPO(args)) elseif status == 'FFPOC' then tbl:node(p.statusFFPOC(args)) elseif status == 'START' or status == 'STUB' or status == 'B' or status == 'A' then tbl:node(p.statusInvalid(args)) elseif status == 'PR' or status == 'NA' or status == nil or status == '' then --do nothing if no status selected else tbl:node(p.statusUnknown(args)) end

if args['ftname'] then tbl:node(p.statusFT(args)) end if args['maindate'] then tbl:node(p.milestoneMainPage(args)) --If the article is an FA or FL but has not been on the main page, add it to a category elseif status == 'FA' then table.insert(p.category,"") elseif status == 'FL' then table.insert(p.category,"") end --Article milestones local history = tbl if args['action1'] then history = history:tag('tr') :tag('td') :attr('colspan', 2) :attr('style', 'width: 100%;') :tag('table') :attr('style','width:100%; background:transparent; font-size:90%') :addClass('AH-milestones')

if args['action2'] or args['dykdate'] or args['itndate'] or args['otddate'] or args['aciddate'] or args['loceNotAnActiveOption'] then history:addClass('collapsible collapsed') history:node(p.historyheader(args)) history:tag('tr') :attr('style', 'text-align: left') :tag('th'):wikitext('Date'):done :tag('th'):wikitext('Process'):done :tag('th'):wikitext('Result'):done end

for i=1, 20, 1 do       if args['action'..i] then history:node(p.historyoutput(args['action'..i], args['action'..i..'date'], args['action'..i..'link'], args['action'..i..'result'], args['action'..i..'oldid'], args)) elseif args['action'..i..'date'] or args['action'..i..'link'] or args['action'..i..'result'] or args['action'..i..'oldid'] then table.insert(p.errors, '') end end end if args['dykdate'] then history:node(p.milestoneDYK(args)) end if args['four'] and mw.ustring.lower(args['four']) == 'yes' then table.insert(p.includeonly,"") end if args['itndate'] then history:node(p.milestoneITN(args)) end if args['otddate'] then history:node(p.milestoneOTD(args)) end if args['aciddate'] then history:node(p.milestoneACID(args)) end if args['loceNotAnActiveOption'] then history:node(p.milestoneLoC(args)) end if args['currentstatus'] ~= nil and args['currentstatus'] ~= "" then history:node(p.currentstatus(args)) end if args['action1'] then --width hack history:done:done:tag('td') end --Categories if args['categories'] or args['category'] then table.insert(p.errors, "") end if args['list'] then table.insert(p.errors, "") end if args['topic'] then if not gatopic or gatopic == "" then table.insert(p.errors, "") end end if status == "FFA/GA" or status == "GA" then if args['gacat'] == 'actors' then table.insert(p.includeonly, "" ..               "") elseif args['gacat'] == 'bands' then table.insert(p.includeonly, "") elseif args['gacat'] == 'hist figures' then table.insert(p.includeonly, "" ..               "") elseif args['gacat'] == 'musicians' then table.insert(p.includeonly, "" ..           "") elseif args['gacat'] == 'politicians' then table.insert(p.includeonly, "" ..           "") elseif args['gacat'] == 'royalty' then table.insert(p.includeonly, "" ..           "") elseif args['gacat'] == 'writers' then table.insert(p.includeonly, "" ..           "") elseif args['gacat'] == "" then else table.insert(p.errors, "") end if p.fourawardtest(args, status) then table.insert(p.includeonly, "") end end return tostring(tbl) .. table.concat(p.category) .. table.concat(p.includeonly) .. table.concat(p.errors) end

function p.articlehistory(frame) local pframe = frame:getParent

local args = {}; for k, v in pairs( pframe.args ) do       args[k] = v;    end for k, v in pairs( frame.args ) do       args[k] = v;    end

return p._articlehistory( args, frame ) end

return p