Module:Redirect hatnote
Appearance
| This Lua module is used on approximately 61,000 pages and changes may be widely noticed. Test changes in the module's /sandbox or /testcases subpages, or in your own module sandbox. Consider discussing changes on the talk page before implementing them. |
| Due to a server limit of 500 "expensive parser function" calls (e.g. #ifexist:, PAGESIZE:, and PAGESINCATEGORY:), this module will only work properly if the page using it has not already exceeded the limit. When the limit is exceeded, the page using this template or module is categorised in Category:Pages with too many expensive parser function calls. (further information) |
| This module is rated as ready for general use. It has reached a mature state, is considered relatively stable and bug-free, and may be used wherever appropriate. It can be mentioned on help pages and other Wikipedia resources as an option for new users. To minimise server load and avoid disruptive output, improvements should be developed through sandbox testing rather than repeated trial-and-error editing. |
| This module is currently protected from editing. See the protection policy and protection log for more details. Please discuss any changes on the talk page; you may submit an edit request to ask an administrator to make an edit if it is uncontroversial or supported by consensus. You may also request that this page be unprotected. |
| This module depends on the following other modules: |
This module produces a hatnote for disambiguating a page that is linked to by a given redirect. It implements the {{redirect}} hatnote template.
Usage from wikitext
This module cannot be used directly from wikitext. Please use the {{redirect}} or {{redirect2}} templates instead.
Usage from Lua
To use this module from Lua, first load the module.
local mRedirectHatnote = require('Module:Redirect hatnote')
The module can then be used with the following syntax:
mRedirectHatnote._redirect(redirect, data, options, titleObj)
See also
--[[
-- 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 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 = '[[Category:Missing redirects]]'
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 = '[[Category:Invalid redirects]]'
end
end
end
end
end
category = category or ''
return mHatnote._hatnote(text, mhOptions) .. category
end
return p