Modul:Redirect hatnote
This is [[MediaWiki:Tagline]]. Set to <code>display:none</code> by chameleon skin.
This module is rated as ready for general use. It has reached a mature form and is thought to be 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 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}} template 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)
The above documentation is transcluded from Modul:Redirect hatnote/doc. (edit | history) Subpages of this module. |
--[[
-- 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