Module:Redirect: Difference between revisions
Suppress errors on non-existent pages - was causing an error to appear on MediaWiki:Protectedpagetext in some cases. Also use pcall for mw.title.new, and a few other tweaks.
m (Protected Module:Redirect: used in MediaWiki:Protectedpagetext ([Edit=Block all non-admin users] (indefinite) [Move=Block all non-admin users] (indefinite))) |
(Suppress errors on non-existent pages - was causing an error to appear on MediaWiki:Protectedpagetext in some cases. Also use pcall for mw.title.new, and a few other tweaks.) |
||
Line 7: | Line 7: | ||
-- [[{{#invoke:redirect|main|redirect-page-name}}]] and {{#invoke:redirect|main|redirect-page-name|bracket=yes}} | -- [[{{#invoke:redirect|main|redirect-page-name}}]] and {{#invoke:redirect|main|redirect-page-name|bracket=yes}} | ||
p={} | local p = {} | ||
function p.main(frame) | function p.main(frame) | ||
-- If called via #invoke, use the args passed into the invoking | |||
local rname, bracket = args | -- template, or the args passed to #invoke if any exist. Otherwise | ||
-- assume args are being passed directly in from the debug console | |||
-- or from another Lua module. | |||
local origArgs | |||
if frame == mw.getCurrentFrame() then | |||
origArgs = frame:getParent().args | |||
for k, v in pairs( frame.args ) do | |||
origArgs = frame.args | |||
break | |||
end | |||
else | |||
origArgs = frame | |||
end | |||
-- Trim whitespace and remove blank arguments. | |||
local args = {} | |||
for k, v in pairs( origArgs ) do | |||
v = mw.text.trim( v ) | |||
if v ~= '' then | |||
args[k] = v | |||
end | |||
end | |||
local rname, bracket = args[1], args.bracket | |||
if | if type(rname) ~= "string" or not mw.ustring.match(rname, "%S") then return end | ||
bracket = bracket and "[[%s]]" or "%s" | bracket = bracket and "[[%s]]" or "%s" | ||
rname = mw.ustring.match(rname,"%[%[(.+)%]%]") or rname | rname = mw.ustring.match(rname, "%[%[(.+)%]%]") or rname | ||
local rpage | -- Get the title object, passing the function through pcall | ||
-- in case we are over the expensive function count limit. | |||
local noError, rpage = pcall(mw.title.new, rname) | |||
if not rpage then | if not noError or noError and not rpage or not rpage.isRedirect then | ||
-- mw.title.new failed, or the page is not a redirect, so use the passed page name. | |||
return mw.ustring.format(bracket, rname) | |||
end | |||
return mw.ustring.format(bracket, | local redirect = mw.ustring.match(rpage:getContent() or "", "^%s*#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*%[%[([^%[%]]-)%]%]" ) | ||
if redirect then | |||
-- Decode html entities and percent encodings. | |||
redirect = mw.text.decode(redirect, true) | |||
redirect = mw.uri.decode(redirect, 'WIKI') | |||
return mw.ustring.format(bracket, redirect) | |||
else | else | ||
return mw.ustring.format('<span class="error">[[Module:redirect]] error: could not parse redirect - [[%s]]</span>', rname) | |||
end | end | ||
end | end | ||
return p | return p |