Editing Module:Redirect

From MINR.ORG WIKI

Warning: You are not logged in. Your IP address will be publicly visible if you make any edits. If you log in or create an account, your edits will be attributed to your username, along with other benefits.

The edit can be undone. Please check the comparison below to verify that this is what you want to do, and then save the changes below to finish undoing the edit.
Latest revision Your text
Line 1: Line 1:
-- This module provides functions for getting the target of a redirect page.
+
---- This module accepts the name of a single page.  It determines if the page is a redirect; if so it looks up the page,
 +
---- extracts the target, and returns the target name as text. Its usage is {{#invoke:redirect|main|redirect-page-name}}.
 +
---- The template neither takes nor gives square brackets, so to show the result as a link use
 +
---- [[{{#invoke:redirect|main|redirect-page-name}}]].  An error is produced if the redirect does not exist,
 +
---- but for versatility no error is given if the file is not a redirect (returns the original text)
 +
---- or if the file name is blank (returns blank).
  
local p = {}
+
p={}
  
-- Gets a mw.title object, using pcall to avoid generating script errors if we
 
-- are over the expensive function count limit (among other possible causes).
 
local function getTitle(...)
 
local success, titleObj = pcall(mw.title.new, ...)
 
if success then
 
return titleObj
 
else
 
return nil
 
end
 
end
 
 
-- Gets the name of a page that a redirect leads to, or nil if it isn't a
 
-- redirect.
 
function p.getTargetFromText(text)
 
return string.match(
 
text,
 
"^%s*#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*:?%s*%[%[([^%[%]|]-)%]%]"
 
) or string.match(
 
text,
 
"^%s*#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*:?%s*%[%[([^%[%]|]-)|[^%[%]]-%]%]"
 
)
 
end
 
 
-- Gets the target of a redirect. If the page specified is not a redirect,
 
-- returns nil.
 
function p.getTarget(page, fulltext)
 
-- Get the title object. Both page names and title objects are allowed
 
-- as input.
 
local titleObj
 
if type(page) == 'string' or type(page) == 'number' then
 
titleObj = getTitle(page)
 
elseif type(page) == 'table' and type(page.getContent) == 'function' then
 
titleObj = page
 
else
 
error(string.format(
 
"bad argument #1 to 'getTarget'"
 
.. " (string, number, or title object expected, got %s)",
 
type(page)
 
), 2)
 
end
 
if not titleObj or not titleObj.isRedirect then
 
return nil
 
end
 
 
-- Find the target by using string matching on the page content.
 
local target = p.getTargetFromText(titleObj:getContent() or "")
 
if target then
 
local targetTitle = getTitle(target)
 
if targetTitle then
 
if fulltext then
 
return targetTitle.fullText
 
else
 
return targetTitle.prefixedText
 
end
 
else
 
return nil
 
end
 
else
 
-- The page is a redirect, but matching failed. This indicates a bug in
 
-- the redirect matching pattern, so throw an error.
 
error(string.format(
 
'could not parse redirect on page "%s"',
 
fulltext and titleObj.fullText or titleObj.prefixedText
 
))
 
end
 
end
 
 
--[[
 
-- 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.
 
--]]
 
function p.luaMain(rname, bracket, fulltext)
 
if type(rname) ~= "string" or not rname:find("%S") then
 
return nil
 
end
 
bracket = bracket and "[[%s]]" or "%s"
 
rname = rname:match("%[%[(.+)%]%]") or rname
 
local target = p.getTarget(rname, fulltext)
 
local ret = target or rname
 
ret = getTitle(ret)
 
if ret then
 
if fulltext then
 
ret = ret.fullText
 
else
 
ret = ret.prefixedText
 
end
 
return bracket:format(ret)
 
else
 
return nil
 
end
 
end
 
 
-- Provides access to the luaMain function from wikitext.
 
 
function p.main(frame)
 
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {frameOnly = true})
+
    local args, pargs = frame.args, (frame:getParent() or {}).args or {}
return p.luaMain(args[1], args.bracket, args.fulltext) or ''
+
    local rname, bracket = args[1] or pargs[1], args.bracket or pargs.bracket
end
+
   
 
+
    if not rname or not mw.ustring.match(rname, "%S") then return "" end
-- Returns true if the specified page is a redirect, and false otherwise.
+
    bracket = bracket and "[[%s]]" or "%s"
function p.luaIsRedirect(page)
+
    rname = mw.ustring.match(rname,"%[%[(.+)%]%]") or rname
local titleObj = getTitle(page)
+
   
if not titleObj then
+
    local rpage, err = mw.title.new(rname)
return false
+
   
end
+
    -- avoid expensive operation when nothing to do
if titleObj.isRedirect then
+
    if not rpage then
return true
+
        err = "File not found (mw.title.new failed)"
else
+
    elseif rpage.id == 0 then
return false
+
        err = "File not found (id=0):"
end
+
    elseif not rpage.isRedirect then
end
+
        return mw.ustring.format(bracket, rname) -- not a redirect so use passed page name (for some general-purpose template use)
 
+
    else
-- Provides access to the luaIsRedirect function from wikitext, returning 'yes'
+
        local redirect = mw.ustring.match( rpage:getContent() or "", "^#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*%[%[(.-)%]%]" )
-- if the specified page is a redirect, and the blank string otherwise.
+
       
function p.isRedirect(frame)
+
        if redirect then
local args = require('Module:Arguments').getArgs(frame, {frameOnly = true})
+
            return mw.ustring.format(bracket, redirect)
if p.luaIsRedirect(args[1]) then
+
        end
return 'yes'
+
       
else
+
        err = "failed to understand"
return ''
+
    end
end
+
   
 +
    return '<span style="text-color:red;">[[Module:redirect]] error: ' .. err .. ' - [[' .. rname .. ']]</span>'
 
end
 
end
  
 
return p
 
return p

Please note that all contributions to MINR.ORG WIKI may be edited, altered, or removed by other contributors. If you do not want your writing to be edited mercilessly, then do not submit it here.
You are also promising us that you wrote this yourself, or copied it from a public domain or similar free resource (see MINR.ORG WIKI:Copyrights for details). Do not submit copyrighted work without permission!

Cancel Editing help (opens in new window)