Editing Module:Redirect hatnote

Jump to: navigation, search

Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.
Latest revision Your text
Line 6: Line 6:
  
 
local mHatnote = require('Module:Hatnote')
 
local mHatnote = require('Module:Hatnote')
local mHatList = require('Module:Hatnote list')
 
local mArguments --lazily initialize
 
 
local libraryUtil = require('libraryUtil')
 
local libraryUtil = require('libraryUtil')
 
local checkType = libraryUtil.checkType
 
local checkType = libraryUtil.checkType
local checkTypeMulti = libraryUtil.checkTypeMulti
 
  
 
local p = {}
 
local p = {}
Line 24: Line 21:
  
 
function p.redirect(frame)
 
function p.redirect(frame)
mArguments = require('Module:Arguments')
+
-- Get the args table and work out the maximum arg key.
local args = mArguments.getArgs(frame, {parentOnly=true})
+
local origArgs = frame:getParent().args
--Get number of redirects
+
local args = {}
local numRedirects = tonumber(frame.args[1]) or 1
+
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.
 
-- Create the options table.
 
local options = {}
 
local options = {}
 
options.selfref = args.selfref
 
options.selfref = args.selfref
return p._redirect(args, numRedirects, options)
+
 +
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
 
end
  
function p._redirect(args, numRedirects, options, currentTitle, redirectTitle, targetTitle)
+
function p._redirect(redirect, data, options, currentTitle, redirectTitle, targetTitle)
 
-- Validate the input. Don't bother checking currentTitle, redirectTitle or
 
-- Validate the input. Don't bother checking currentTitle, redirectTitle or
 
-- targetTitle, as they are only used in testing.
 
-- targetTitle, as they are only used in testing.
checkType('_redirect', 1, args, 'table')
+
checkType('_redirect', 1, redirect, 'string')
checkType('_redirect', 2, numRedirects, 'number', true)
+
checkType('_redirect', 2, data, 'table', true)
numRedirects = numRedirects or 1
 
 
checkType('_redirect', 3, options, 'table', true)
 
checkType('_redirect', 3, options, 'table', true)
 +
data = data or {}
 
options = options or {}
 
options = options or {}
 
currentTitle = currentTitle or mw.title.getCurrentTitle()
 
currentTitle = currentTitle or mw.title.getCurrentTitle()
-- Get the table of redirects
+
 
local redirect = {}
+
-- Generate the text.
for i = 1, numRedirects do
+
local text = {}
-- Return an error if a redirect parameter is missing.
+
text[#text + 1] = '"' .. redirect .. '" redirects here.'
if not args[i] then
+
text[#text + 1] = formatUseTable(data[1] or {}, true, redirect)
return mHatnote.makeWikitextError(
+
if data[1] and data[1].use and data[1].use ~= 'other uses' then
'missing redirect parameter',
+
for i = 2, #data do
'Template:Redirect#Errors',
+
text[#text + 1] = formatUseTable(data[i] or {}, false)
args.category
 
)
 
 
end
 
end
redirect[i] = args[i]
 
end
 
-- Generate the text.
 
local formattedRedirect = {}
 
for k,v in pairs(redirect) do
 
formattedRedirect[k] = '"' .. v .. '"'
 
 
end
 
end
local text = {
 
mHatList.andList(formattedRedirect) .. ' ' .. (#redirect == 1 and 'redirects' or 'redirect') .. ' here.',
 
mHatList._forSee(args, #redirect + 1, {title = redirect[1], extratext = args.text})
 
}
 
 
text = table.concat(text, ' ')
 
text = table.concat(text, ' ')
-- Functionality for adding categories
+
local categoryTable = {}
+
-- Generate the tracking category.
function addCategory(cat)
+
-- We don't need a tracking category if the template invocation has been
if cat and cat ~= '' then
+
-- copied directly from the docs, or if we aren't in mainspace.
-- Add by index to avoid duplicates
+
local category
categoryTable[string.format('[[Category:%s]]', cat)] = true
+
if not redirect:find('^REDIRECT%d*$') and redirect ~= 'TERM' --
 +
and currentTitle.namespace == 0
 +
then
 +
redirectTitle = redirectTitle or getTitle(redirect)
 +
if not redirectTitle or not redirectTitle.exists then
 +
category = 'Missing redirects'
 +
elseif not redirectTitle.isRedirect then
 +
category = 'Articles with redirect hatnotes needing review'
 +
else
 +
local mRedirect = require('Module:Redirect')
 +
local target = mRedirect.getTarget(redirectTitle)
 +
targetTitle = targetTitle or target and getTitle(target)
 +
if targetTitle and targetTitle ~= currentTitle then
 +
category = 'Articles with redirect hatnotes needing review'
 +
end
 
end
 
end
 
end
 
end
--Generate tracking categories
+
category = category and string.format('[[Category:%s]]', category) or ''
 +
 
 +
-- Generate the options to pass to [[Module:Hatnote]].
 
local mhOptions = {}
 
local mhOptions = {}
for k,v in pairs(redirect) do
+
if currentTitle.namespace == 0
-- We don't need a tracking category if the template invocation has been
+
and redirectTitle and redirectTitle.namespace ~= 0
-- copied directly from the docs, or if we aren't in main- or category-space.
+
then
if not v:find('^REDIRECT%d*$') and v ~= 'TERM' --
+
-- We are on a mainspace page, and the hatnote starts with something
and currentTitle.namespace == 0 or currentTitle.namespace == 14
+
-- like "Wikipedia:Foo redirects here", so automatically label it as a
then
+
-- self-reference.
redirectTitle = redirectTitle or getTitle(v)
+
mhOptions.selfref = true
if not redirectTitle or not redirectTitle.exists then
+
else
addCategory('Missing redirects')
+
mhOptions.selfref = options.selfref
elseif not redirectTitle.isRedirect then
 
addCategory('Articles with redirect hatnotes needing review')
 
else
 
local mRedirect = require('Module:Redirect')
 
local target = mRedirect.getTarget(redirectTitle)
 
targetTitle = targetTitle or target and getTitle(target)
 
if targetTitle and targetTitle ~= currentTitle then
 
addCategory('Articles with redirect hatnotes needing review')
 
end
 
end
 
end
 
 
 
-- Generate the options to pass to [[Module:Hatnote]].
 
if currentTitle.namespace == 0 and not mhOptions.selfref
 
and redirectTitle and redirectTitle.namespace ~= 0
 
then
 
-- We are on a mainspace page, and the hatnote starts with something
 
-- like "Wikipedia:Foo redirects here", so automatically label it as
 
-- a self-reference.
 
mhOptions.selfref = true
 
else
 
mhOptions.selfref = options.selfref
 
end
 
end
 
--concatenate all the categories
 
local category = ''
 
for k,v in pairs(categoryTable) do
 
category = category .. k
 
 
end
 
end
  

Please note that all contributions to All About Ayrshire may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see All About Ayrshire:Copyrights for details). Do not submit copyrighted work without permission!

Cancel Editing help (opens in new window)

Template used on this page: