Module:Redirect
-- This module provides functions for getting the target of a redirect page.
 
 local p = {}
 
 -- Gets a mw.title object, using pcall to avoid generating script errors if we
 -- are over the expensive function count limit (among other possible causes).
 local function getTitle(...)
 	local success, titleObj = pcall(mw.title.new, ...)
 	if success then
 		return titleObj
 	else
 		return nil
 	end
 end
 
 -- Gets the name of a page that a redirect leads to, or nil if it isn't a
 -- redirect.
 function p.getTargetFromText(text)
 	return string.match(
 		text,
 		&quot;^%s*#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*:?%s*%[%[([^%[%]|]-)%]%]&quot;
 	) or string.match(
 		text,
 		&quot;^%s*#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*:?%s*%[%[([^%[%]|]-)|[^%[%]]-%]%]&quot;
 	) or string.match(
 		text,
 		&quot;வழிமாற்று&quot;)
 end
 
 -- Gets the target of a redirect. If the page specified is not a redirect,
 -- returns nil.
 function p.getTarget(page)
 	-- Get the title object. Both page names and title objects are allowed
 	-- as input.
 	local titleObj
 	if type(page) == 'string' or type(page) == 'number' then
 		titleObj = getTitle(page)
 	elseif type(page) == 'table' and type(page.getContent) == 'function' then
 		titleObj = page
 	else
 		error(string.format(
 			&quot;bad argument #1 to 'getTarget'&quot;
 				.. &quot; (string, number, or title object expected, got %s)&quot;,
 			type(page)
 		), 2)
 	end
 	if not titleObj or not titleObj.isRedirect then
 		return nil
 	end
 	
 	-- Find the target by using string matching on the page content.
 	local target = p.getTargetFromText(titleObj:getContent() or &quot;&quot;)
 	if target then
 		local targetTitle = getTitle(target)
 		if targetTitle then
 			return targetTitle.prefixedText
 		else
 			return nil
 		end
 	else
 		-- The page is a redirect, but matching failed. This indicates a bug in
 		-- the redirect matching pattern, so throw an error.
 		error(string.format(
 			'could not parse redirect on page &quot;%s&quot;',
 			titleObj.prefixedText
 		))
 	end
 end
 
 --[[
 -- Given a single page name determines what page it redirects to and returns the
 -- target page name, or the passed page name when not a redirect. The passed
 -- page name can be given as plain text or as a page link.
 -- 
 -- Returns page name as plain text, or when the bracket parameter is given, as a
 -- page link. Returns an error message when page does not exist or the redirect
 -- target cannot be determined for some reason.
 --]]
 function p.luaMain(rname, bracket)
 	if type(rname) ~= &quot;string&quot; or not rname:find(&quot;%S&quot;) then
 		return nil
 	end
 	bracket = bracket and &quot;[[%s]]&quot; or &quot;%s&quot;
 	rname = rname:match(&quot;%[%[(.+)%]%]&quot;) or rname
 	local target = p.getTarget(rname)
 	local ret = target or rname
 	ret = getTitle(ret)
 	if ret then
 		ret = ret.prefixedText
 		return bracket:format(ret)
 	else
 		return nil
 	end
 end
 
 -- Provides access to the luaMain function from wikitext.
 function p.main(frame)
 	local args = require('Module:Arguments').getArgs(frame, {frameOnly = true})
 	return p.luaMain(args[1], args.bracket) or ''
 end
 
 -- Returns true if the specified page is a redirect, and false otherwise.
 function p.luaIsRedirect(page)
 	local titleObj = getTitle(page)
 	if not titleObj then
 		return false
 	end
 	if titleObj.isRedirect then
 		return true
 	else
 		return false
 	end
 end
 
 -- Provides access to the luaIsRedirect function from wikitext, returning 'yes'
 -- if the specified page is a redirect, and the blank string otherwise.
 function p.isRedirect(frame)
 	local args = require('Module:Arguments').getArgs(frame, {frameOnly = true})
 	if p.luaIsRedirect(args[1]) then
 		return 'yes'
 	else
 		return ''
 	end
 end