Module:Redirect hatnote: Difference between revisions

From the Croc Wiki, the Croc encyclopedia
Jump to navigationJump to search
Content added Content deleted
(remove the check for "other uses" coming last, as this is not how Template:Redirect currently works)
m (Protected "Module:Redirect hatnote": High traffic page ([Edit=Allow only administrators] (indefinite) [Move=Allow only administrators] (indefinite)))
 
(32 intermediate revisions by 8 users not shown)
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 = {}


--------------------------------------------------------------------------------
function p.redirect(frame)
-- Helper functions
-- 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 function getTitle(...)
-- Return an error if no redirect was specified.
--Calls mw.title.new and returns either a title object, or nil on error
local redirect = args[1]
local success, titleObj = pcall(mw.title.new, ...)
if not redirect then
return success and titleObj or nil
return mHatnote.makeWikitextError(
end
'no redirect specified',
'Template:Redirect#Errors',
args.category
)
end


--------------------------------------------------------------------------------
-- Create the data table.
-- Main functions
local data = {}
--------------------------------------------------------------------------------
local iArg = 0
local iData = 1
repeat
iArg = iArg + 2
local useTable = data[iData] or {}
local use = args[iArg]
local page = args[iArg + 1]
local nextUse = args[iArg + 2]
useTable[#useTable + 1] = page
if use ~= 'and' then
useTable.use = use
end
data[iData] = useTable
if nextUse ~= 'and' then
iData = iData + 1
end
until iArg >= maxArg - 1


function p.redirect(frame)
mArguments = require('Module:Arguments')
local args = mArguments.getArgs(frame, {parentOnly=true})
--Get number of redirects
local numRedirects = tonumber(frame.args[1]) or 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
end


function p._redirect(redirect, data, options)
function p._redirect(args, numRedirects, options, currentTitle, redirectTitle, targetTitle)
-- Validate the input. Don't bother checking currentTitle, redirectTitle or
checkType('_redirect', 1, redirect, 'string')
-- targetTitle, as they are only used in testing.
checkType('_redirect', 2, data, 'table', true)
checkType('_redirect', 1, args, 'table')
checkType('_redirect', 2, numRedirects, 'number', true)
numRedirects = numRedirects or 1
checkType('_redirect', 3, options, 'table', true)
checkType('_redirect', 3, options, 'table', true)
options = options or {}

currentTitle = currentTitle or mw.title.getCurrentTitle()
-- Generate the text.
-- Get the table of redirects
local text = {}
local redirect = {}
-- Redirect text.
for i = 1, numRedirects do
text[#text + 1] = '"' .. redirect .. '" redirects here.'
-- Return an error if a redirect parameter is missing.
-- The first table, a special case.
if not args[i] then
local useTable1 = data[1] or {}
return mHatnote.makeWikitextError(
local use1 = useTable1.use or 'other uses'
'missing redirect parameter',
useTable1[1] = useTable1[1] or redirect .. ' (disambiguation)'
'Template:Redirect#Errors',
local pages1 = mHatnote.formatPages(unpack(useTable1))
args.category
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
)
)
end
end
redirect[i] = args[i]
end
end
-- Generate the text.
local formattedRedirect = {}
for k,v in pairs(redirect) do
formattedRedirect[k] = mHatnote.quote(v)
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 options to pass to [[Module:Hatnote]].
local function addCategory(cat)
options = options or {}
if cat and cat ~= '' then
-- Add by index to avoid duplicates
categoryTable[string.format('[[Category:%s]]', cat)] = true
end
end
--Generate tracking categories
local mhOptions = {}
local mhOptions = {}
local redirTitle
mhOptions.selfref = options.selfref
for k,v in pairs(redirect) do

-- Find whether to add the tracking category.
-- We don't need a tracking category if the template invocation has been
-- copied directly from the docs, or if we aren't in main- or category-space.
-- We add the category if:
if not v:find('^REDIRECT%d*$') and v ~= 'TERM' --
-- a) redirect isn't any of the keywords 'REDIRECT', 'REDIRECT1',
and currentTitle.namespace == 0 or currentTitle.namespace == 14
-- 'REDIRECT2', ..., or 'TERM'.
then
-- b) we are in the main namespace.
redirTitle = redirectTitle or getTitle(v)
-- c) the redirect title does not exist.
if not redirTitle or not redirTitle.exists then
local category
addCategory('Missing redirects')
if not redirect:find('^REDIRECT%d*$') and redirect ~= 'TERM' then
elseif not redirTitle.isRedirect then
local currentTitle = mw.title.getCurrentTitle()
if string.find(redirTitle:getContent(), '#invoke:RfD') then
if currentTitle.namespace == 0 then
addCategory('Articles with redirect hatnotes impacted by RfD')
local success, redirectTitle = pcall(mw.title.new, redirect)
else
if success and not redirectTitle.exists then
addCategory('Articles with redirect hatnotes needing review')
category = '[[Category:Missing redirects]]'
end
else
local target = targetTitle or redirTitle.redirectTarget
if target and target ~= currentTitle then
addCategory('Articles with redirect hatnotes needing review')
end
end
end
end
end

-- Generate the options to pass to [[Module:Hatnote]].
if currentTitle.namespace == 0 and not mhOptions.selfref
and redirTitle and redirTitle.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
category = category or ''


return mHatnote._hatnote(text, mhOptions) .. category
return mHatnote._hatnote(text, mhOptions) .. category

Latest revision as of 18:10, August 8, 2023

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 mHatList = require('Module:Hatnote list')
local mArguments --lazily initialize
local libraryUtil = require('libraryUtil')
local checkType = libraryUtil.checkType
local checkTypeMulti = libraryUtil.checkTypeMulti

local p = {}

--------------------------------------------------------------------------------
-- Helper functions
--------------------------------------------------------------------------------

local function getTitle(...)
	--Calls mw.title.new and returns either a title object, or nil on error
	local success, titleObj = pcall(mw.title.new, ...)
	return success and titleObj or nil
end

--------------------------------------------------------------------------------
-- Main functions
--------------------------------------------------------------------------------

function p.redirect(frame)
	mArguments = require('Module:Arguments')
	local args = mArguments.getArgs(frame, {parentOnly=true})
	--Get number of redirects
	local numRedirects = tonumber(frame.args[1]) or 1
	-- Create the options table.
	local options = {}
	options.selfref = args.selfref
	return p._redirect(args, numRedirects, options)
end

function p._redirect(args, numRedirects, options, currentTitle, redirectTitle, targetTitle)
	-- Validate the input. Don't bother checking currentTitle, redirectTitle or
	-- targetTitle, as they are only used in testing.
	checkType('_redirect', 1, args, 'table')
	checkType('_redirect', 2, numRedirects, 'number', true)
	numRedirects = numRedirects or 1
	checkType('_redirect', 3, options, 'table', true)
	options = options or {}
	currentTitle = currentTitle or mw.title.getCurrentTitle()
	-- Get the table of redirects
	local redirect = {}
	for i = 1, numRedirects do
		-- Return an error if a redirect parameter is missing.
		if not args[i] then
			return mHatnote.makeWikitextError(
				'missing redirect parameter',
				'Template:Redirect#Errors',
				args.category
			)
		end
		redirect[i] = args[i]
	end
	-- Generate the text.
	local formattedRedirect = {}
	for k,v in pairs(redirect) do
		formattedRedirect[k] = mHatnote.quote(v)
	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, ' ')
	-- Functionality for adding categories	
	local categoryTable = {}
	local function addCategory(cat)
		if cat and cat ~= '' then
			-- Add by index to avoid duplicates
			categoryTable[string.format('[[Category:%s]]', cat)] = true
		end
	end
	--Generate tracking categories
	local mhOptions = {}
	local redirTitle
	for k,v in pairs(redirect) do
		-- We don't need a tracking category if the template invocation has been
		-- copied directly from the docs, or if we aren't in main- or category-space.
		if not v:find('^REDIRECT%d*$') and v ~= 'TERM' -- 
			and currentTitle.namespace == 0 or currentTitle.namespace == 14
		then
			redirTitle = redirectTitle or getTitle(v)
			if not redirTitle or not redirTitle.exists then
				addCategory('Missing redirects')
			elseif not redirTitle.isRedirect then
				if string.find(redirTitle:getContent(), '#invoke:RfD') then
					addCategory('Articles with redirect hatnotes impacted by RfD')
				else
					addCategory('Articles with redirect hatnotes needing review')
				end
			else
				local target = targetTitle or redirTitle.redirectTarget
				if target and target ~= 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 redirTitle and redirTitle.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

	return mHatnote._hatnote(text, mhOptions) .. category
end
 
return p