Module:Redirect hatnote: Difference between revisions

From Zoophilia Wiki
Jump to navigationJump to search
meta>Nihiltres
(Added category tracking for unusual early termination behaviour when first use is "other uses")
m (1 revision imported)
 
(11 intermediate revisions by 5 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
Line 22: Line 24:


function p.redirect(frame)
function p.redirect(frame)
-- Get the args table and work out the maximum arg key.
mArguments = require('Module:Arguments')
local origArgs = frame:getParent().args
local args = mArguments.getArgs(frame, {parentOnly=true})
local args = {}
--Get number of redirects
local maxArg = 0
local numRedirects = tonumber(frame.args[1]) or 1
for k, v in pairs(origArgs) do
-- Create the options table.
if type(k) == 'number' and k > maxArg then
local options = {}
maxArg = k
options.selfref = args.selfref
end
return p._redirect(args, numRedirects, options)
v = v:match('^%s*(.-)%s*$') -- Trim whitespace
end
if v ~= '' then
args[k] = v
end
end


--Get table of redirects
function p._redirect(args, numRedirects, options, currentTitle, redirectTitle, targetTitle)
local numRedirects = tonumber(frame.args[1]) or 1
-- 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 = {}
local redirect = {}
for i = 1, numRedirects do
for i = 1, numRedirects do
-- Return an error if no redirect was specified.
-- Return an error if a redirect parameter is missing.
if not args[i] then
if not args[i] then
return mHatnote.makeWikitextError(
return mHatnote.makeWikitextError(
'no redirect specified',
'missing redirect parameter',
'Template:Redirect#Errors',
'Template:Redirect#Errors',
args.category
args.category
Line 50: Line 56:
redirect[i] = args[i]
redirect[i] = args[i]
end
end
-- Create the data table.
local data = {}
local iArg = numRedirects - 1
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 legacy, but partly maintained for its effect of
-- cancelling empty use items.
useTable = useTable or {}
local use
if not (useTable.use or isFirst) then
return nil
end
use = useTable.use or 'other uses'
local pages = useTable.pages or {}
redirect = redirect[1] or error(
'no redirect was supplied',
2
)
pages[1] = pages[1] or redirect .. ' (disambiguation)'
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, currentTitle, redirectTitle, targetTitle)
-- Validate the input. Don't bother checking currentTitle, redirectTitle or
-- targetTitle, as they are only used in testing.
checkTypeMulti('_redirect', 1, redirect, {'string', 'table'})
-- String type can stay valid until extant use-cases are checked-for and
-- updated, but we'll coerce them to table for now
if type(redirect) == 'string' then redirect = {redirect} end
checkType('_redirect', 2, data, 'table', true)
checkType('_redirect', 3, options, 'table', true)
data = data or {}
options = options or {}
currentTitle = currentTitle or mw.title.getCurrentTitle()
-- Generate the text.
-- Generate the text.
local text = {}
local formattedRedirect = {}
local formattedRedirect = {}
for k,v in pairs(redirect) do
for k,v in pairs(redirect) do
formattedRedirect[k] = '"' .. v .. '"'
formattedRedirect[k] = '"' .. v .. '"'
end
end
text[#text + 1] = mw.text.listToText(formattedRedirect) .. ' ' .. (#redirect == 1 and 'redirects' or 'redirect') .. ' here.'
local text = {
text[#text + 1] = formatUseTable(data[1] or {}, true, redirect)
mHatList.andList(formattedRedirect) .. ' ' .. (#redirect == 1 and 'redirects' or 'redirect') .. ' here.',
if data[1] and data[1].use then
mHatList._forSee(args, #redirect + 1, {title = redirect[1], extratext = args.text})
if data[1].use ~= 'other uses' then
}
for i = 2, #data do
text[#text + 1] = formatUseTable(data[i] or {}, false, redirect)
end
else
text[#text] = text[#text] .. '[[Category:Hatnote templates using unusual parameters]]'
end
end
text = table.concat(text, ' ')
text = table.concat(text, ' ')
-- Functionality for adding categories
local categoryTable = {}
local categoryTable = {}
--add categories to a table by index, so we don't get duplicates
local function addCategory(cat)
function addCategory(cat)
if cat and cat ~= '' then
if cat and cat ~= '' then
-- Add by index to avoid duplicates
categoryTable[string.format('[[Category:%s]]', cat)] = true
categoryTable[string.format('[[Category:%s]]', cat)] = true
end
end
end
end
 
--Generate tracking categories
local mhOptions = {}
local mhOptions = {}
local redirTitle
for k,v in pairs(redirect) do
for k,v in pairs(redirect) do
-- Generate the tracking category.
-- We don't need a tracking category if the template invocation has been
-- 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.
-- copied directly from the docs, or if we aren't in main- or category-space.
Line 157: Line 83:
and currentTitle.namespace == 0 or currentTitle.namespace == 14
and currentTitle.namespace == 0 or currentTitle.namespace == 14
then
then
redirectTitle = redirectTitle or getTitle(v)
redirTitle = redirectTitle or getTitle(v)
if not redirectTitle or not redirectTitle.exists then
if not redirTitle or not redirTitle.exists then
addCategory('Missing redirects')
addCategory('Missing redirects')
elseif not redirectTitle.isRedirect then
elseif not redirTitle.isRedirect then
addCategory('Articles with redirect hatnotes needing review')
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
else
local mRedirect = require('Module:Redirect')
local target = targetTitle or redirTitle.redirectTarget
local target = mRedirect.getTarget(redirectTitle)
if target and target ~= currentTitle then
targetTitle = targetTitle or target and getTitle(target)
if targetTitle and targetTitle ~= currentTitle then
addCategory('Articles with redirect hatnotes needing review')
addCategory('Articles with redirect hatnotes needing review')
end
end
Line 174: Line 102:
-- Generate the options to pass to [[Module:Hatnote]].
-- Generate the options to pass to [[Module:Hatnote]].
if currentTitle.namespace == 0 and not mhOptions.selfref
if currentTitle.namespace == 0 and not mhOptions.selfref
and redirectTitle and redirectTitle.namespace ~= 0
and redirTitle and redirTitle.namespace ~= 0
then
then
-- We are on a mainspace page, and the hatnote starts with something
-- We are on a mainspace page, and the hatnote starts with something

Latest revision as of 00:47, 15 June 2021

Documentation for this module may be created at Module:Redirect hatnote/doc

--[[
-- 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 = {}

local function getTitle(...)
	local success, titleObj = pcall(mw.title.new, ...)
	if success then
		return titleObj
	else
		return nil
	end
end

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] = '"' .. 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