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)
(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 pages = useTable.pages 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]
useTable[#useTable + 1] = page
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)
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
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 use1 = useTable1.use or 'other uses'
useTable1[1] = useTable1[1] or redirect .. ' (disambiguation)'
local pages1 = mHatnote.formatPages(unpack(useTable1))
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
for i = 2, #data do
local useTable = data[i] or {}
text[#text + 1] = formatUseTable(data[i] or {}, false)
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
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 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