Jump to content

Module:RfD

Permanently protected module
From Wikipedia, the free encyclopedia
This is an old revision of this page, as edited by Wbm1058 (talk | contribs) at 14:31, 4 June 2023 (remove linkspam link to the template under discussion. just the link to the discussion should be sufficient. hopefully this little change doesn't break any tools.). The present address (URL) is a permanent link to this revision, which may differ significantly from the current revision.

require('strict')

local p = {}

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

local mboxText = "'''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 [[Wikipedia:Deletion policy|deletion policy]].''' <br />"
	.. " Please share your thoughts on the matter at '''[[Wikipedia:Redirects for discussion/Log/%s %s %s#%s|this redirect's entry]]''' on the [[Wikipedia:Redirects for discussion|Redirects for discussion]] page.<br />"
	.. "  '''Click on the link below''' to go to the current destination page.<br />"
	.. "<small>Please notify the good-faith creator and any main contributors of the redirect by placing <code>&#123;&#123;[[Wikipedia:Substitution|subst]]:[[Template:Rfd notice|Rfd notice]]&#124;%s&#125;&#125; &#126;&#126;&#126;&#126;</code> on their talk page.</small>"
local deleteReason = '[[Wikipedia:Redirects for discussion]] debate closed as delete'
local messageOnTransclusionsStandard = '&lsaquo;The template below is included via a redirect'
    .. ' (%s) that is under discussion. See [[Wikipedia:Redirects for discussion/Log/%s %s %s#%s|redirects for discussion]]'
    .. ' to help reach a consensus.&rsaquo;'
local messageOnTransclusionsTiny = '&lsaquo;[[Wikipedia:Redirects for discussion/Log/%s %s %s#%s|See RfD]]&rsaquo;'

local function makeTransclusionTag(args, redirect)
	local discussionPage = args[1] and mw.text.trim(args[1])
	if not discussionPage or discussionPage == '' then
		discussionPage = redirect
	end
	local visClasses = {
		['autoconfirmed']='autoconfirmed-show',
		['extendedconfirmed']='extendedconfirmed-show sysop-show'
	} -- More can be added if justified by situation
	local sizeAttrs = {
		['standard'] = {
			['tags'] = {'<div ', '</div>'},
			['style'] = ' border-bottom:1px solid #AAAAAA;',
			['message'] = messageOnTransclusionsStandard:format(redirect, args.year, args.month, args.day, discussionPage)
		},
		['tiny'] = {
			['tags'] = {' <span ', '</span> '},
			['style'] = '',
			['message'] = messageOnTransclusionsTiny:format(args.year, args.month, args.day, discussionPage)
		}
	}
	local size = sizeAttrs[args.showontransclusion] and args.showontransclusion or 'standard'
	local tags = sizeAttrs[size]['tags']
	local visibility = visClasses[args.transclusiontagvisibility] or ''
	local classes = 'class="boilerplate metadata plainlinks ' .. visibility .. '" '
	local id = 'id="rfd-t" '
	local style = 'style="background-color: transparent; padding: 0; font-size:xx-small; color:#000000;'
		.. 'text-align:left;' .. sizeAttrs[size]['style'] .. '" '
	return tags[1] .. classes .. id .. style .. '>' .. sizeAttrs[size]['message'] .. tags[2]
end

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.timestamp then
                -- Extract stable year and month from timestamp; args.month and args.year can change if the discussion is relisted (see [[Special:Diff/896302321]])
                local lang = mw.language.getContentLanguage()
                local catMonth = lang:formatDate('F', args.timestamp)
                local catYear = lang:formatDate('Y', args.timestamp)
		category = string.format('[[Category:Redirects for discussion from %s %s|%s]][[Category:All redirects for discussion|%s]]', catMonth, catYear, currentTitle.text, currentTitle.text)
	else
		category = string.format('[[Category:Redirects for discussion|%s]][[Category:All redirects for discussion|%s]]', currentTitle.text, currentTitle.text)
	end
	if category then category = category..'[[Category:Temporary maintenance holdings]]' end
	return string.format('%s<span id="delete-reason" style="display:none;">%s</span>%s%s',
		messageBox.main('mbox', {
			type = 'delete',
			name = 'RfD',
			image = 'none',
			text = string.format(mboxText, args.year, args.month, args.day, discussionPage or currentTitle.prefixedText, mw.text.nowiki(currentTitle.prefixedText))
		}),
		mw.uri.encode(deleteReason),
		category,
		isError and '[[Category:RfD errors]]' or ''
	)
end

p[''] = function(frame)
	local args = frame.args
	if not args.content or mw.text.trim(args.content) == '' then
		return '<span class="error">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.[[Category:RfD errors]]</span>'
	end
	local pframe = frame:getParent()
	if pframe:preprocess('<includeonly>1</includeonly>') == '1' 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
		local redirect = pframe:getTitle()
		if target and not target.isRedirect and target ~= redirect 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
			local parsedTarget = pframe:expandTemplate{title = ':' .. target.prefixedText, args = pframe.args}
			if frame.args.showontransclusion and not mw.isSubsting() then
				return makeTransclusionTag(args, redirect) .. parsedTarget
			else
				return parsedTarget
			end
		end
	end
	-- We're not being transcluded, or we can't figure out how to display our target.
	-- Check if we can find the target.
	local target = getTargetFromText(args.content)
	messageBox = require('Module:Message box')
	local redirbox
	if target then -- target isn't nil
		redirbox = messageBox.main('mbox', {
			type = 'notice',
			name = 'RedirectBox',
			image = '[[File:Symbol redirect blue.svg|40px]]',
			text = "'''This title is currently a redirect ''' to [[:" .. getTargetFromText(args.content) .. "]]; click there to go to the current target. The full content of this redirect page, including all [[Wikipedia:Categorizing redirects|redirect categories]], is displayed below."
		})
	else
		redirbox = messageBox.main('mbox', {
			type = 'notice',
			name = 'RedirectBox',
			image = '[[File:Symbol redirect vote 4.svg|40px]]',
			text = "'''This redirect's target could not be determined.''' This page may be a [[Wikipedia:Soft redirect|soft redirect]], or not a redirect at all. The content of the page is displayed below."
		})
	end
	-- Display the RfD banner.
	return makeRfdNotice(frame.args) .. '\n' .. redirbox .. frame.args.content
end

local substText = "{{<includeonly>safesubst:</includeonly>#invoke:RfD||%s%s|%s%s\n"
	.. "<!-- The above content is generated by {{subst:rfd}}. -->\n<!-- End of RFD message. Don't edit anything above here. Feel free to edit below here, but do NOT change the redirect's target. -->|content=\n%s\n"
	.. "<!-- Don't add anything after this line unless you're drafting a disambiguation page or article to replace the redirect. -->\n}}"
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(frame)
	local titleText
	local pframe = frame:getParent()
	local pargs = pframe.args
	local Date
	if pargs.days then
		Date = os.date(dateText, os.time() - 86400*pargs.days)
	else
		Date = os.date(dateText)
	end
	local retval = string.format(substText, pargs.FULLPAGENAME or pargs[1] or '', pargs.showontransclusion and '|showontransclusion=1' or '', Date, pframe:getTitle() == mw.title.getCurrentTitle().prefixedText and '|category=' or '', pargs.content or '')
	if mw.isSubsting() then
		return retval
	else
		return frame:expandTemplate{title = 'Template:Error:must be substituted', args = {'rfd'}} .. frame:preprocess(retval)
	end
end

return p