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)
     local args, pargs = frame.args, (frame:getParent() or {}).args or {}
+
     -- If called via #invoke, use the args passed into the invoking
     local rname, bracket = args[1] or pargs[1], args.bracket or pargs.bracket
+
    -- 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 not rname or not mw.ustring.match(rname, "%S") then return "" end
+
     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, err = mw.title.new(rname)
+
    -- Get the title object, passing the function through pcall
   
+
    -- in case we are over the expensive function count limit.
    -- avoid expensive operation when nothing to do
+
     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
         err = "File not found (mw.title.new failed)"
+
         -- mw.title.new failed, or the page is not a redirect, so use the passed page name.
     elseif rpage.id == 0 then
+
        return mw.ustring.format(bracket, rname)
         err = "File not found (id=0):"
+
    end
    elseif not rpage.isRedirect then
+
 
         return mw.ustring.format(bracket, rname) -- not a redirect so use passed page name (for some general-purpose template use)
+
    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
         local redirect = mw.ustring.match( rpage:getContent() or "", "^#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*%[%[(.-)%]%]" )
+
         return mw.ustring.format('<span class="error">[[Module:redirect]] error: could not parse redirect - [[%s]]</span>', rname)
       
 
        if redirect then
 
            return mw.ustring.format(bracket, redirect)
 
        end
 
       
 
        err = "failed to understand"
 
 
     end
 
     end
   
 
    return '<span style="text-color:red;">[[Module:redirect]] error: ' .. err .. ' - [[' .. rname .. ']]</span>'
 
 
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