Changes

Jump to navigation Jump to search
810 bytes added ,  00:46, 10 September 2021
restore p.getTargetFromText which is used by Module:RfD which is causing "Lua error in Module:RfD at line 87: attempt to call upvalue 'getTargetFromText' (a nil value)"
Line 1: Line 1: −
-- Given a single page name determines what page it redirects to and returns the target page name, or the
+
-- This module provides functions for getting the target of a redirect page.
-- 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:
+
local p = {}
-- [[{{#invoke:redirect|main|redirect-page-name}}]] and {{#invoke:redirect|main|redirect-page-name|bracket=yes}}
+
 
 +
-- 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)
 +
local target = 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*%[%[([^%[%]|]-)|[^%[%]]-%]%]"
 +
)
 +
return target and mw.uri.decode(target, 'PATH')
 +
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 then
 +
return nil
 +
end
 +
local targetTitle = titleObj.redirectTarget
 +
if targetTitle then
 +
if fulltext then
 +
return targetTitle.fullText
 +
else
 +
return targetTitle.prefixedText
 +
end
 +
else
 +
return nil
 +
end
 +
end
   −
local p = {}
+
--[[
 +
-- 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)
    -- If called via #invoke, use the args passed into the invoking
+
local args = require('Module:Arguments').getArgs(frame, {frameOnly = true})
    -- template, or the args passed to #invoke if any exist. Otherwise
+
return p.luaMain(args[1], args.bracket, args.fulltext) or ''
    -- assume args are being passed directly in from the debug console
+
end
    -- or from another Lua module.
+
 
    local origArgs
+
-- Returns true if the specified page is a redirect, and false otherwise.
    if frame == mw.getCurrentFrame() then
+
function p.luaIsRedirect(page)
        origArgs = frame:getParent().args
+
local titleObj = getTitle(page)
        for k, v in pairs( frame.args ) do
+
if not titleObj then
            origArgs = frame.args
+
return false
            break
+
end
        end
+
if titleObj.isRedirect then
    else
+
return true
        origArgs = frame
+
else
    end
+
return false
    -- Trim whitespace and remove blank arguments.
+
end
    local args = {}
+
end
    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*%[%[([^%[%]]-)%]%]" )
+
-- Provides access to the luaIsRedirect function from wikitext, returning 'yes'
    if redirect then
+
-- if the specified page is a redirect, and the blank string otherwise.
        -- Decode html entities and percent encodings.
+
function p.isRedirect(frame)
        redirect = mw.text.decode(redirect, true)
+
local args = require('Module:Arguments').getArgs(frame, {frameOnly = true})
        redirect = mw.uri.decode(redirect, 'WIKI')
+
if p.luaIsRedirect(args[1]) then
        return mw.ustring.format(bracket, redirect)
+
return 'yes'
    else
+
else
        return mw.ustring.format('<span class="error">[[Module:redirect]] error: could not parse redirect - [[%s]]</span>', rname)
+
return ''
    end
+
end
 
end
 
end
    
return p
 
return p
Anonymous user

Navigation menu