Difference between revisions of "Module:Redirect"
From MINR.ORG WIKI
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 |
Revision as of 11:52, 24 July 2013
Documentation for this module may be created at Module:Redirect/doc
-- 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 p = {} function p.main(frame) -- If called via #invoke, use the args passed into the invoking -- 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 type(rname) ~= "string" or not mw.ustring.match(rname, "%S") then return end bracket = bracket and "[[%s]]" or "%s" rname = mw.ustring.match(rname, "%[%[(.+)%]%]") or rname -- 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 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 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 return mw.ustring.format('<span class="error">[[Module:redirect]] error: could not parse redirect - [[%s]]</span>', rname) end end return p