Module:Redirect: Difference between revisions

    From Nonbinary 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 10: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