Module:Redirect: Difference between revisions
From Zoophilia Wiki
Jump to navigationJump to search
meta>Mr. Stradivarius extend the pattern to match a colon after the "REDIRECT" text |
meta>Mr. Stradivarius handle apostrophes and other characters escaped by {{TALKPAGENAME}}, per protected edit request by User:Jackmcbarn |
||
Line 41: | Line 41: | ||
-- in case we are over the expensive function count limit. | -- in case we are over the expensive function count limit. | ||
local noError, rpage = pcall(mw.title.new, rname) | local noError, rpage = pcall(mw.title.new, rname) | ||
if not noError or | if not noError or not rpage then | ||
-- mw.title.new failed, so use the passed page name. | |||
return mw.ustring.format(bracket, | return mw.ustring.format(bracket, rname) | ||
elseif not rpage.isRedirect then | |||
-- the page is not a redirect, so use the normalized name of the page we | |||
-- were given. | |||
return mw.ustring.format(bracket, rpage.prefixedText) | |||
end | end | ||
Revision as of 06:25, 16 April 2014
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 not rpage then
-- mw.title.new failed, so use the passed page name.
return mw.ustring.format(bracket, rname)
elseif not rpage.isRedirect then
-- the page is not a redirect, so use the normalized name of the page we
-- were given.
return mw.ustring.format(bracket, rpage.prefixedText)
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('<span class="error">[[Module:redirect]] error: could not parse redirect - [[%s]]</span>', rname)
end
end
return p