Editing Module:Redirect hatnote
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 libraryUtil = require('libraryUtil') | local libraryUtil = require('libraryUtil') | ||
local checkType = libraryUtil.checkType | local checkType = libraryUtil.checkType | ||
− | |||
local p = {} | local p = {} | ||
Line 24: | Line 21: | ||
function p.redirect(frame) | function p.redirect(frame) | ||
− | + | -- Get the args table and work out the maximum arg key. | |
− | local args | + | local origArgs = frame:getParent().args |
− | -- | + | local args = {} |
− | local | + | 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( | + | |
+ | 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( | + | 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, | + | checkType('_redirect', 1, redirect, 'string') |
− | checkType('_redirect', 2, | + | checkType('_redirect', 2, data, 'table', true) |
− | |||
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() | ||
− | -- | + | |
− | local | + | -- 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 | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
end | end | ||
− | |||
− | |||
− | |||
− | |||
text = table.concat(text, ' ') | text = table.concat(text, ' ') | ||
− | -- | + | |
− | local | + | -- Generate the tracking category. |
− | + | -- We don't need a tracking category if the template invocation has been | |
− | if | + | -- copied directly from the docs, or if we aren't in mainspace. |
− | + | local category | |
− | + | 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 | + | category = category and string.format('[[Category:%s]]', category) or '' |
+ | |||
+ | -- Generate the options to pass to [[Module:Hatnote]]. | ||
local mhOptions = {} | local mhOptions = {} | ||
− | + | if currentTitle.namespace == 0 | |
− | + | 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 | ||