Module:Redirect/sandbox: Difference between revisions

Content deleted Content added
add two more functions for calling from Lua, getTarget and getTargetString (was an edit conflict from earlier, overwriting for now)
Trimmed redundancy
 
(25 intermediate revisions by 7 users not shown)
Line 1:
-- This module provides functions for getting the target of a redirect page.
-- 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.
 
-- Thus these are roughly the same:
-- [[{{#invoke:redirect|main|redirect-page-name}}]] and {{#invoke:redirect|main|redirect-page-name|bracket=yes}}
 
local mArguments -- lazily initialise [[Module:Arguments]]
 
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, ...)
Line 20 ⟶ 14:
end
 
-- Gets the name of a page that a redirect leads to, or nil if it isn't a
function p.main(frame)
-- redirect.
mArguments = require('Module:Arguments')
function p.getTargetFromText(text)
local args = mArguments.getArgs(frame)
local rname, brackettarget = args[1], argsstring.bracketmatch(
text,
return p._main(rname, bracket) or ''
"^%s*#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*:?%s*%[%[([^%[%]|]-)%]%]"
) or string.match(
text,
"^%s*#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*:?%s*%[%[([^%[%]|]-)|[^%[%]]-%]%]"
)
return target and mw.uri.decode(target, 'PATH')
end
 
-- Gets the target of a redirect. If the page specified is not a redirect,
function p._main(rname, bracket)
-- returns nil.
function p.getTarget(page, fulltext)
-- 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(
"bad argument #1 to 'getTarget'"
.. " (string, number, or title object expected, got %s)",
type(page)
), 2)
end
if not titleObj then
return nil
end
local targetTitle = titleObj.redirectTarget
if targetTitle then
if fulltext then
return targetTitle.fullText
else
return targetTitle.prefixedText
end
else
return nil
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, fulltext)
if type(rname) ~= "string" or not rname:find("%S") then
return nil
Line 33 ⟶ 74:
bracket = bracket and "[[%s]]" or "%s"
rname = rname:match("%[%[(.+)%]%]") or rname
local target = p.getTargetStringgetTarget(rname, fulltext)
iflocal ret = target thenor rname
ret = getTitle(ret)
return bracket:format(target)
if ret then
if fulltext then
ret = ret.fullText
else
ret = ret.prefixedText
end
return bracket:format(ret)
else
return bracket:format(rname)nil
end
end
 
-- Provides access to the luaMain function from wikitext.
function p.getTarget(page)
function p.main(frame)
return getTitle(p.getTargetString)
local args = require('Module:Arguments').getArgs(frame, {frameOnly = true})
return p.luaMain(args[1], args.bracket, args.fulltext) or ''
end
 
-- Returns true if the specified page is a redirect, and false otherwise.
function p.getTargetString(page)
function p.luaIsRedirect(page)
-- Get the title object. Both page names and title objects are allowed
local titleObj = getTitle(page)
-- as input.
localif not titleObj then
return false
if type(page) == 'string' then
titleObj = getTitle(page)
elseif type(page) == 'table' and type(page.getContent) == 'function' then
titleObj = page
else
local msg = 'invalid input to "getTarget":'
.. 'the first parameter must be a string or a title object'
error(msg, 2)
end
if not titleObj or notreturn titleObj.isRedirect then
end
return nil
 
end
-- Provides access to the luaIsRedirect function from wikitext, returning 'yes'
-- Findif the targetspecified bypage usingis stringa matchingredirect, onand the pageblank string contentotherwise.
function p.isRedirect(frame)
local target = string.match(
local args = require('Module:Arguments').getArgs(frame, {frameOnly = true})
titleObj:getContent() or "",
if p.luaIsRedirect(args[1]) then
"^%s*#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*:?%s*%[%[([^%[%]]-)%]%]"
return 'yes'
)
if target then
-- Decode html entities and percent encodings.
target = mw.text.decode(target, true)
target = mw.uri.decode(target, 'WIKI')
return target
else
return ''
-- The page is a redirect, but matching failed. This indicates a bug in
-- the redirect matching pattern, so throw an error.
local msg = 'could not parse redirect on page [[:'
.. titleObj.prefixedText
.. ']]'
error(msg)
end
end