Module:Redirect hatnote
Appearance
![]() | This Lua module is used on approximately 59,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. |
![]() | This module is rated as ready for general use. It has reached a mature form and is thought to be relatively bug-free and ready for use wherever appropriate. It is ready to mention on help pages and other Wikipedia resources as an option for new users to learn. To reduce server load and bad output, it should be improved by sandbox testing rather than repeated trial-and-error editing. |
![]() | This module is subject to page protection. It is a highly visible module in use by a very large number of pages, or is substituted very frequently. Because vandalism or mistakes would affect many pages, and even trivial editing might cause substantial load on the servers, it is protected from editing. |
![]() | 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 p = {}
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
--]]
local args = require('Module:Arguments').getArgs(frame)
local maxArg = 0
for k, v in pairs(args) do
if type(k) == 'number' and k > maxArg then
maxArg = k
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
while iArg < maxArg do
iArg = iArg + 2
local useTable = data[iData] or {}
local use = args[iArg]
local page = args[iArg + 1]
useTable[#useTable + 1] = page
data[iData] = useTable
if use ~= 'and' then
useTable.use = use
iData = iData + 1
end
mw.logObject(useTable)
end
-- Create the options table.
local options = {}
options.selfref = args.selfref
return p._redirect(redirect, data, options)
end
function p._redirect(redirect, data, options)
checkType('_redirect', 1, redirect, 'string')
checkType('_redirect', 2, data, 'table', true)
checkType('_redirect', 3, options, 'table', true)
-- Generate the text.
local text = {}
-- Redirect text.
text[#text + 1] = '"' .. redirect .. '" redirects here.'
-- The first table, a special case.
local useTable1 = data[1] or {}
local use1 = useTable1.use or 'other uses'
useTable1[1] = useTable1[1] or redirect .. ' (disambiguation)'
local pages1 = mHatnote.formatPages(unpack(useTable1))
pages1 = mw.text.listToText(pages1)
text[#text + 1] = string.format(
'For %s, see %s.',
use1,
pages1
)
-- The other tables.
if use1 ~= 'other uses' then
for i = 2, #data do
local useTable = data[i] or {}
local origUse = useTable.use
if not origUse then
break
end
local use
if tonumber(origUse) == 1 then
use = 'other uses'
else
use = origUse
end
useTable[1] = useTable[1] or origUse .. ' (disambiguation)'
local pages = mHatnote.formatPages(unpack(useTable))
pages = mw.text.listToText(pages)
text[#text + 1] = string.format(
'For %s, see %s.',
use,
pages
)
if use == 'other uses' then
-- "Other uses" text must come last, or it doesn't make sense
-- grammatically.
break
end
end
end
text = table.concat(text, ' ')
-- Generate the options to pass to [[Module:Hatnote]].
options = options or {}
local mhOptions = {}
mhOptions.selfref = options.selfref
-- Find whether to add the tracking category.
-- We add the category if:
-- a) redirect isn't any of the keywords 'REDIRECT', 'REDIRECT1',
-- 'REDIRECT2', ..., or 'TERM'.
-- b) we are in the main namespace.
-- c) the redirect title does not exist.
local category
if not redirect:find('^REDIRECT%d*$') and redirect ~= 'TERM' then
local currentTitle = mw.title.getCurrentTitle()
if currentTitle.namespace == 0 then
local success, redirectTitle = pcall(mw.title.new, redirect)
if success and not redirectTitle.exists then
category = '[[Category:Missing redirects]]'
end
end
end
category = category or ''
return mHatnote._hatnote(text, mhOptions) .. category
end
return p