Diff: Module:Redirect
Comparing revision #1 (2021-09-10 07:46:37) with revision #2 (2023-02-02 02:41:44).
| Old | New |
|---|---|
-- This module provides functions for getting the target of a redirect page. |
-- This module provides functions for getting the target of a redirect page. |
local p = {} |
local p = {} |
-- Gets a mw.title object, using pcall to avoid generating script errors if we |
-- 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). |
-- are over the expensive function count limit (among other possible causes). |
local function getTitle(...) |
local function getTitle(...) |
local success, titleObj = pcall(mw.title.new, ...) |
local success, titleObj = pcall(mw.title.new, ...) |
if success then |
if success then |
return titleObj |
return titleObj |
else |
else |
return nil |
return nil |
end |
end |
end |
end |
-- Gets the name of a page that a redirect leads to, or nil if it isn't a |
-- Gets the name of a page that a redirect leads to, or nil if it isn't a |
-- redirect. |
-- redirect. |
function p.getTargetFromText(text) |
function p.getTargetFromText(text) |
local target = string.match( |
local target = string.match( |
text, |
text, |
"^%s*#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*:?%s*%[%[([^%[%]|]-)%]%]" |
"^%s*#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*:?%s*%[%[([^%[%]|]-)%]%]" |
) or string.match( |
) or string.match( |
text, |
text, |
"^%s*#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*:?%s*%[%[([^%[%]|]-)|[^%[%]]-%]%]" |
"^%s*#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*:?%s*%[%[([^%[%]|]-)|[^%[%]]-%]%]" |
) |
) |
return target and mw.uri.decode(target, 'PATH') |
return target and mw.uri.decode(target, 'PATH') |
end |
end |
-- Gets the target of a redirect. If the page specified is not a redirect, |
-- Gets the target of a redirect. If the page specified is not a redirect, |
-- returns nil. |
-- returns nil. |
function p.getTarget(page, fulltext) |
function p.getTarget(page, fulltext) |
-- Get the title object. Both page names and title objects are allowed |
-- Get the title object. Both page names and title objects are allowed |
-- as input. |
-- as input. |
local titleObj |
local titleObj |
if type(page) == 'string' or type(page) == 'number' then |
if type(page) == 'string' or type(page) == 'number' then |
titleObj = getTitle(page) |
titleObj = getTitle(page) |
elseif type(page) == 'table' and type(page.getContent) == 'function' then |
elseif type(page) == 'table' and type(page.getContent) == 'function' then |
titleObj = page |
titleObj = page |
else |
else |
error(string.format( |
error(string.format( |
"bad argument #1 to 'getTarget'" |
"bad argument #1 to 'getTarget'" |
.. " (string, number, or title object expected, got %s)", |
.. " (string, number, or title object expected, got %s)", |
type(page) |
type(page) |
), 2) |
), 2) |
end |
end |
if not titleObj then |
if not titleObj then |
return nil |
return nil |
end |
end |
local targetTitle = titleObj.redirectTarget |
local targetTitle = titleObj.redirectTarget |
if targetTitle then |
if targetTitle then |
if fulltext then |
if fulltext then |
return targetTitle.fullText |
return targetTitle.fullText |
else |
else |
return targetTitle.prefixedText |
return targetTitle.prefixedText |
end |
end |
else |
else |
return nil |
return nil |
end |
end |
end |
end |
--[[ |
--[[ |
-- Given a single page name determines what page it redirects to and returns the |
-- 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 |
-- 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. |
-- 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 |
-- 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 |
-- page link. Returns an error message when page does not exist or the redirect |
-- target cannot be determined for some reason. |
-- target cannot be determined for some reason. |
--]] |
--]] |
function p.luaMain(rname, bracket, fulltext) |
function p.luaMain(rname, bracket, fulltext) |
if type(rname) ~= "string" or not rname:find("%S") then |
if type(rname) ~= "string" or not rname:find("%S") then |
return nil |
return nil |
end |
end |
bracket = bracket and "[[%s]]" or "%s" |
bracket = bracket and "[[%s]]" or "%s" |
rname = rname:match("%[%[(.+)%]%]") or rname |
rname = rname:match("%[%[(.+)%]%]") or rname |
local target = p.getTarget(rname, fulltext) |
local target = p.getTarget(rname, fulltext) |
local ret = target or rname |
local ret = target or rname |
ret = getTitle(ret) |
ret = getTitle(ret) |
if ret then |
if ret then |
if fulltext then |
if fulltext then |
ret = ret.fullText |
ret = ret.fullText |
else |
else |
ret = ret.prefixedText |
ret = ret.prefixedText |
end |
end |
return bracket:format(ret) |
return bracket:format(ret) |
else |
else |
return nil |
return nil |
end |
end |
end |
end |
-- Provides access to the luaMain function from wikitext. |
-- Provides access to the luaMain function from wikitext. |
function p.main(frame) |
function p.main(frame) |
local args = require('Module:Arguments').getArgs(frame, {frameOnly = true}) |
local args = require('Module:Arguments').getArgs(frame, {frameOnly = true}) |
return p.luaMain(args[1], args.bracket, args.fulltext) or '' |
return p.luaMain(args[1], args.bracket, args.fulltext) or '' |
end |
end |
-- Returns true if the specified page is a redirect, and false otherwise. |
-- Returns true if the specified page is a redirect, and false otherwise. |
function p.luaIsRedirect(page) |
function p.luaIsRedirect(page) |
local titleObj = getTitle(page) |
local titleObj = getTitle(page) |
if not titleObj then |
if not titleObj then |
return false |
return false |
end |
end |
if titleObj.isRedirect then |
if titleObj.isRedirect then |
return true |
return true |
else |
else |
return false |
return false |
end |
end |
end |
end |
-- Provides access to the luaIsRedirect function from wikitext, returning 'yes' |
-- Provides access to the luaIsRedirect function from wikitext, returning 'yes' |
-- if the specified page is a redirect, and the blank string otherwise. |
-- if the specified page is a redirect, and the blank string otherwise. |
function p.isRedirect(frame) |
function p.isRedirect(frame) |
local args = require('Module:Arguments').getArgs(frame, {frameOnly = true}) |
local args = require('Module:Arguments').getArgs(frame, {frameOnly = true}) |
if p.luaIsRedirect(args[1]) then |
if p.luaIsRedirect(args[1]) then |
return 'yes' |
return 'yes' |
else |
else |
return '' |
return '' |
end |
end |
end |
end |
return p |
return p |