Module:Redirect hatnote

-- -- This module produces a "redirect" hatnote. It looks like this: -- '"X" redirects here. For other uses, see Y.' -- It implements the template. --

local mHatnote = require('Module:Hatnote') local libraryUtil = require('libraryUtil') local checkType = libraryUtil.checkType local mRedirect -- lazily initialise Module:Redirect

local p = {}

local function getTitle(...) local success, titleObj = pcall(mw.title.new, ...) if success then return titleObj else return nil end end

function p.redirect(frame) -- Get the args table and work out the maximum arg key. local origArgs = frame:getParent.args local args = {} local maxArg = 0 for k, v in pairs(origArgs) do		if type(k) == 'number' and k > maxArg then maxArg = k		end v = v:match('^%s*(.-)%s*$') -- Trim whitespace if v ~= '' then args[k] = v		end end

-- Return an error if no redirect was specified. local redirect = args[1] if not redirect then return mHatnote.makeWikitextError(			'no redirect specified',			'Template:Redirect#Errors',			args.category		) end

-- Create the data table. local data = {} local iArg = 0 local iData = 1 repeat iArg = iArg + 2 local useTable = data[iData] or {} local pages = useTable.pages or {} local use = args[iArg] local page = args[iArg + 1] local nextUse = args[iArg + 2] pages[#pages + 1] = page useTable.pages = pages if use ~= 'and' then useTable.use = use end data[iData] = useTable if nextUse ~= 'and' then iData = iData + 1 end until iArg >= maxArg - 1

-- Create the options table. local options = {} options.selfref = args.selfref return p._redirect(redirect, data, options) end

local function formatUseTable(useTable, isFirst, redirect) -- Formats one use table. Use tables are the tables inside the data array. -- Each one corresponds to one use. (A use might be the word "cats" in the	-- phrase "For cats, see Felines".) -- Returns a string, or nil if no use was specified. -- The isFirst parameter is used to apply special formatting for the first -- table in the data array. If isFirst is specified, the redirect parameter useTable = useTable or {} local use if isFirst then use = useTable.use or 'other uses' elseif not useTable.use then return nil elseif tonumber(useTable.use) == 1 then use = 'other uses' else use = useTable.use end local pages = useTable.pages or {} if isFirst then redirect = redirect or error(			'isFirst was set in formatUseTable, but no redirect was supplied',			2		) pages[1] = pages[1] or redirect .. ' (disambiguation)' else pages[1] = pages[1] or useTable.use .. ' (disambiguation)' end pages = mHatnote.formatPages(unpack(pages)) pages = mw.text.listToText(pages) return string.format(		'For %s, see %s.',		use,		pages	) end

function p._redirect(redirect, data, options, titleObj) -- Validate the input. Don't bother checking titleObj as it is only used -- for testing purposes. checkType('_redirect', 1, redirect, 'string') checkType('_redirect', 2, data, 'table', true) checkType('_redirect', 3, options, 'table', true) data = data or {} options = options or {}

-- Generate the text. local text = {} text[#text + 1] = '"' .. redirect .. '" redirects here.' text[#text + 1] = formatUseTable(data[1] or {}, true, redirect) if data[1] and data[1].use and data[1].use ~= 'other uses' then for i = 2, #data do			text[#text + 1] = formatUseTable(data[i] or {}, false) end end text = table.concat(text, ' ') -- Generate the options to pass to Module:Hatnote. local mhOptions = {} mhOptions.selfref = options.selfref

-- Find whether to add the tracking category. -- We only add the category if both of the following are true: -- a) redirect isn't any of the keywords 'REDIRECT', 'REDIRECT1',	-- 'REDIRECT2', ..., or 'TERM'.	-- b) we are in the main namespace. -- If these are both true, then we check for existence of the redirect. If -- it doesn't exist, then we add the missing redirect category. If it does -- exist, but the redirect target is not the current page, we add the -- invalid redirect category. local category if not redirect:find('^REDIRECT%d*$') and redirect ~= 'TERM' then titleObj = titleObj or mw.title.getCurrentTitle if titleObj.namespace == 0 then local redirectTitle = getTitle(redirect) if redirectTitle then if not redirectTitle.exists then category = '' else mRedirect = require('Module:Redirect') local target = mRedirect.getTarget(redirectTitle) local targetTitle = target and getTitle(target) if targetTitle and not mw.title.equals(targetTitle, titleObj) then category = '' end end end end end category = category or ''

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