Module:Redirect hatnote

--[[

-- This module produces a "redirect" hatnote. It looks like this:

-- '"X" redirects here. For other uses, see Y.'

-- It implements the {{redirect}} template.

--]]

local mHatnote = require('Module:Hatnote')

local mHatList = require('Module:Hatnote list')

local mArguments --lazily initialize

local libraryUtil = require('libraryUtil')

local checkType = libraryUtil.checkType

local checkTypeMulti = libraryUtil.checkTypeMulti

local p = {}

--------------------------------------------------------------------------------

-- Helper functions

--------------------------------------------------------------------------------

local function getTitle(...)

--Calls mw.title.new and returns either a title object, or nil on error

local success, titleObj = pcall(mw.title.new, ...)

return success and titleObj or nil

end

--------------------------------------------------------------------------------

-- Main functions

--------------------------------------------------------------------------------

function p.redirect(frame)

mArguments = require('Module:Arguments')

local args = mArguments.getArgs(frame, {parentOnly=true})

--Get number of redirects

local numRedirects = tonumber(frame.args[1]) or 1

-- Create the options table.

local options = {}

options.selfref = args.selfref

return p._redirect(args, numRedirects, options)

end

function p._redirect(args, numRedirects, options, currentTitle, redirectTitle, targetTitle)

-- Validate the input. Don't bother checking currentTitle, redirectTitle or

-- targetTitle, as they are only used in testing.

checkType('_redirect', 1, args, 'table')

checkType('_redirect', 2, numRedirects, 'number', true)

numRedirects = numRedirects or 1

checkType('_redirect', 3, options, 'table', true)

options = options or {}

currentTitle = currentTitle or mw.title.getCurrentTitle()

-- Get the table of redirects

local redirect = {}

for i = 1, numRedirects do

-- Return an error if a redirect parameter is missing.

if not args[i] then

return mHatnote.makeWikitextError(

'missing redirect parameter',

'Template:Redirect#Errors',

args.category

)

end

redirect[i] = args[i]

end

-- Generate the text.

local formattedRedirect = {}

for k,v in pairs(redirect) do

formattedRedirect[k] = mHatnote.quote(v)

end

local text = {

mHatList.andList(formattedRedirect) .. ' ' .. (#redirect == 1 and 'redirects' or 'redirect') .. ' here.',

mHatList._forSee(args, #redirect + 1, {title = redirect[1], extratext = args.text})

}

text = table.concat(text, ' ')

-- Functionality for adding categories

local categoryTable = {}

local function addCategory(cat)

if cat and cat ~= '' then

-- Add by index to avoid duplicates

categoryTable[string.format('Category:%s', cat)] = true

end

end

--Generate tracking categories

local mhOptions = {}

local redirTitle

for k,v in pairs(redirect) do

-- We don't need a tracking category if the template invocation has been

-- copied directly from the docs, or if we aren't in main- or category-space.

if not v:find('^REDIRECT%d*$') and v ~= 'TERM' --

and currentTitle.namespace == 0 or currentTitle.namespace == 14

then

redirTitle = redirectTitle or getTitle(v)

if not redirTitle or not redirTitle.exists then

addCategory('Missing redirects')

elseif not redirTitle.isRedirect then

if string.find(redirTitle:getContent(), '#invoke:RfD') then

addCategory('Articles with redirect hatnotes impacted by RfD')

else

addCategory('Articles with redirect hatnotes needing review')

end

else

local target = targetTitle or redirTitle.redirectTarget

if target and target ~= currentTitle then

addCategory('Articles with redirect hatnotes needing review')

end

end

end

-- Generate the options to pass to Module:Hatnote.

if currentTitle.namespace == 0 and not mhOptions.selfref

and redirTitle and redirTitle.namespace ~= 0

then

-- We are on a mainspace page, and the hatnote starts with something

-- like "Wikipedia:Foo redirects here", so automatically label it as

-- a self-reference.

mhOptions.selfref = true

else

mhOptions.selfref = options.selfref

end

end

--concatenate all the categories

local category = ''

for k,v in pairs(categoryTable) do

category = category .. k

end

return mHatnote._hatnote(text, mhOptions) .. category

end

return p