# Module:RfD

require('Module:No globals')  

local p = {}  

local getTargetFromText = require('Module:Redirect').getTargetFromText  
local messageBox  

local mboxText = "%s'''The purpose of this redirect is currently being discussed by the Wikipedia community."  
.. " The outcome of the discussion may result in a change of this page, or possibly its deletion in accordance with Wikipedia's .'''  
"  
.. " Please share your thoughts on the matter at **** on the page.  
"  
.. " **Click on the link below** to go to the current destination page.  
"  
.. "<small>Please notify the good-faith creator and any main contributors of the redirect by placing <code>&#123;&#123;:RFDNote&#124;%s&#125;&#125; &#126;&#126;&#126;&#126;</code> on their talk page.</small>"  
local errorMessage = '<span>Error: Unable to determine the redirect\'s target. If this page is a soft redirect, then this error can be ignored. Otherwise, please make sure that the instructions for placing this tag were followed correctly, in particular that the redirect\'s old content was passed in the <code>content</code> parameter.</span>  
'  
local deleteReason = ' debate closed as delete'  

local function makeRfdNotice(args)  
local currentTitle = mw.title.getCurrentTitle  
if not messageBox then  
messageBox = require('Module:Message box')  
end  
local discussionPage = args[1] and mw.text.trim(args[1])  
if discussionPage == '' then  
discussionPage = nil  
end  
local target = getTargetFromText(args.content)  
local isError = not target or not mw.title.new(target)  
local category  
if args.category then  
category = args.category  
elseif args.month and args.year then  
category = string.format('', args.month, args.year, currentTitle.text, currentTitle.text)  
else  
category = string.format('', currentTitle.text, currentTitle.text)  
end  
return string.format('%s<span id="delete-reason">%s</span>%s%s',  
messageBox.main('mbox', {  
type = 'delete',  
image = '',  
text = string.format(mboxText, isError and errorMessage or '', args.year, args.month, args.day, discussionPage or currentTitle.prefixedText, mw.text.nowiki(currentTitle.prefixedText))  
}),  
mw.uri.encode(deleteReason),  
category,  
isError and * or *  
end  

p[''] = function  
if not .args.content or mw.text.trim(.args.content) == '' then  
return '<span>Error: No content was provided. The original text of the page (the #REDIRECT line and any templates) must be placed inside of the content parameter.</span>'  
end  
local pframe = :getParent  
if pframe:preprocess('<includeonly>' .. os.clock .. '</includeonly>') ~= '' then  
-- We're being transcluded, so display the content of our target.  
local target = getTargetFromText(.args.content)  
if target then  
target = mw.title.new(target)  
end  
if target and not target.isRedirect and target ~= pframe:getTitle then  
-- We should actually be calling expandTemplate on the grandparent rather than on the parent, but we can't do that yet  
-- Since we don't have grandparent access, though, it means the thing we're calling doesn't either, so it doesn't really matter yet  
return pframe:expandTemplate{title = ':' .. target.prefixedText, args = pframe.args}  
end  
end  
-- We're not being transcluded, or we can't figure out how to display our target.  
-- Display the RfD banner.  
return makeRfdNotice(.args) .. '\n' .. .args.content  
end  

local substText = ""  
local dateText = 'month = %B\n|day = %e\n|year = %Y\n|time = %R\n|timestamp = %Y%m%d%H%M%S'  

-- called during subst when the template is initially placed on the page  
function p.main  
local titleText  
local pframe = :getParent  
local pargs = pframe.args  
local retval = string.format(substText, pargs.FULLPAGENAME or pargs[1] or *, os.date(dateText), pframe:getTitle == mw.title.getCurrentTitle.prefixedText and '|category=' or *, pargs.content or '')  
if mw.isSubsting then  
return retval  
else  
return :expandTemplate{title = 'Template:Error:must be substituted', args = {'rfd'}} .. :preprocess(retval)  
end  
end  

return p