Module:Redirect

From Crews Genealogy Wiki: focusing on the Wiregrass south, and related families
Revision as of 20:06, 7 February 2014 by Wikiadmin (talk | contribs) (1 revision)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)
Jump to navigation Jump to search

-- 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: -- redirect-page-name and redirect-page-name

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*:?%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('Module:redirect error: could not parse redirect - %s', rname)
   end

end

return p