Module:Redirect hatnote: Difference between revisions
From the Croc Wiki, the Croc encyclopedia
Jump to navigationJump to search
Content deleted Content added
remove the check for "other uses" coming last, as this is not how Template:Redirect currently works |
create a formatUseTable to reduce code redundancy |
||
Line 43: | Line 43: | ||
iArg = iArg + 2 |
iArg = iArg + 2 |
||
local useTable = data[iData] or {} |
local useTable = data[iData] or {} |
||
⚫ | |||
local use = args[iArg] |
local use = args[iArg] |
||
local page = args[iArg + 1] |
local page = args[iArg + 1] |
||
local nextUse = args[iArg + 2] |
local nextUse = args[iArg + 2] |
||
pages[#pages + 1] = page |
|||
useTable.pages = pages |
|||
if use ~= 'and' then |
if use ~= 'and' then |
||
useTable.use = use |
useTable.use = use |
||
Line 61: | Line 63: | ||
return p._redirect(redirect, data, options) |
return p._redirect(redirect, data, options) |
||
⚫ | |||
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 {} |
|||
⚫ | |||
if isFirst then |
|||
⚫ | |||
elseif not useTable.use then |
|||
return nil |
|||
⚫ | |||
⚫ | |||
⚫ | |||
use = useTable.use |
|||
⚫ | |||
local pages = useTable.pages |
|||
if isFirst then |
|||
redirect = redirect or error( |
|||
'isFirst was set in formatUseTable, but no redirect was supplied', |
|||
⚫ | |||
) |
|||
⚫ | |||
else |
|||
⚫ | |||
end |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
end |
end |
||
Line 70: | Line 109: | ||
-- Generate the text. |
-- Generate the text. |
||
local text = {} |
local text = {} |
||
-- Redirect text. |
|||
text[#text + 1] = '"' .. redirect .. '" redirects here.' |
text[#text + 1] = '"' .. redirect .. '" redirects here.' |
||
text[#text + 1] = formatUseTable(data[1] or {}, true, redirect) |
|||
-- The first table, a special case. |
|||
if data[1] and data[1].use and data[1].use ~= 'other uses' then |
|||
local useTable1 = data[1] or {} |
|||
⚫ | |||
⚫ | |||
local pages1 = mHatnote.formatPages(unpack(useTable1)) |
|||
pages1 = mw.text.listToText(pages1) |
|||
⚫ | |||
⚫ | |||
use1, |
|||
pages1 |
|||
⚫ | |||
-- The other tables. |
|||
if use1 ~= 'other uses' then |
|||
for i = 2, #data do |
for i = 2, #data do |
||
text[#text + 1] = formatUseTable(data[i] or {}, false) |
|||
⚫ | |||
if not origUse then |
|||
break |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
use = origUse |
|||
⚫ | |||
⚫ | |||
⚫ | |||
⚫ | |||
text[#text + 1] = string.format( |
|||
'For %s, see %s.', |
|||
⚫ | |||
⚫ | |||
⚫ | |||
end |
end |
||
end |
end |
||
Line 115: | Line 124: | ||
-- Find whether to add the tracking category. |
-- Find whether to add the tracking category. |
||
-- We add the category if: |
-- We add the category if all of the following are true: |
||
-- a) redirect isn't any of the keywords 'REDIRECT', 'REDIRECT1', |
-- a) redirect isn't any of the keywords 'REDIRECT', 'REDIRECT1', |
||
-- 'REDIRECT2', ..., or 'TERM'. |
-- 'REDIRECT2', ..., or 'TERM'. |
Revision as of 03:46, May 15, 2014
This Lua module is used on approximately 55,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 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 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
-- 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
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)
checkType('_redirect', 1, redirect, 'string')
checkType('_redirect', 2, data, 'table', true)
checkType('_redirect', 3, options, 'table', true)
-- 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]].
options = options or {}
local mhOptions = {}
mhOptions.selfref = options.selfref
-- Find whether to add the tracking category.
-- We add the category if all 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.
-- 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