Editing Module:Redirect

Jump to navigation Jump to search
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 publish the changes below to finish undoing the edit.

Latest revision Your text
Line 12: Line 12:
return nil
return nil
end
end
end
local function case_insensitive_pattern(pattern)
  -- find an optional '%' (group 1) followed by any character (group 2)
  local p = mw.ustring.gsub(pattern, "(%%?)(.)", function(percent, letter)
    if percent ~= "" or not mw.ustring.match(letter, "%a") then
      -- if the '%' matched, or `letter` is not a letter, return "as is"
      return percent .. letter
    else
      -- else, return a case-insensitive character class of the matched letter
      return string.format("[%s%s]", mw.ustring.lower(letter), mw.ustring.upper(letter))
    end
  end)
  return p
end
end


Line 31: Line 17:
-- redirect.
-- redirect.
function p.getTargetFromText(text)
function p.getTargetFromText(text)
local en_redirect = case_insensitive_pattern("redirect");
local target = string.match(
local ru_redirect = case_insensitive_pattern("перенаправление");
local result = string.match(
text,
text,
"^%s*#".. en_redirect .. "%s*:?%s*%[%[([^%[%]|]-)%]%]"
"^%s*#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*:?%s*%[%[([^%[%]|]-)%]%]"
) or string.match(
) or string.match(
text,
text,
"^%s*#".. en_redirect .. "%s*:?%s*%[%[([^%[%]|]-)|[^%[%]]-%]%]"
"^%s*#[Rr][Ee][Dd][Ii][Rr][Ee][Cc][Tt]%s*:?%s*%[%[([^%[%]|]-)|[^%[%]]-%]%]"
) or mw.ustring.match(
text,
"^%s*#" .. ru_redirect .. "%s*:?%s*%[%[([^%[%]|]-)%]%]"
) or mw.ustring.match(
text,
"^%s*#" .. ru_redirect .. " %s*:?%s*%[%[([^%[%]|]-)|[^%[%]]-%]%]"
)
)
return result and mw.uri.decode(result, 'WIKI')
return target and mw.uri.decode(target, 'PATH')
end
end


-- Gets the target of a redirect. If the page specified is not a redirect,
-- Gets the target of a redirect. If the page specified is not a redirect,
-- returns nil.
-- returns nil.
function p.getTarget(page)
function p.getTarget(page, fulltext)
-- Get the title object. Both page names and title objects are allowed
-- Get the title object. Both page names and title objects are allowed
-- as input.
-- as input.
Line 66: Line 44:
), 2)
), 2)
end
end
if not titleObj or not titleObj.isRedirect then
if not titleObj then
return nil
return nil
end
end
local targetTitle = titleObj.redirectTarget
-- Find the target by using string matching on the page content.
if targetTitle then
local target = p.getTargetFromText(titleObj:getContent() or "")
if fulltext then
if target then
return targetTitle.fullText
local targetTitle = getTitle(target)
else
if targetTitle then
return targetTitle.prefixedText
return targetTitle.prefixedText
else
return nil
end
end
else
else
-- The page is a redirect, but matching failed. This indicates a bug in
return nil
-- the redirect matching pattern, so throw an error.
error(string.format(
'could not parse redirect on page "%s"',
titleObj.prefixedText
))
end
end
end
end
Line 93: Line 63:
-- target page name, or the passed page name when not a redirect. The passed
-- 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.
-- 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
-- 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
-- page link. Returns an error message when page does not exist or the redirect
-- target cannot be determined for some reason.
-- target cannot be determined for some reason.
--]]
--]]
function p.luaMain(rname, bracket)
function p.luaMain(rname, bracket, fulltext)
if type(rname) ~= "string" or not rname:find("%S") then
if type(rname) ~= "string" or not rname:find("%S") then
return nil
return nil
Line 104: Line 74:
bracket = bracket and "[[%s]]" or "%s"
bracket = bracket and "[[%s]]" or "%s"
rname = rname:match("%[%[(.+)%]%]") or rname
rname = rname:match("%[%[(.+)%]%]") or rname
local target = p.getTarget(rname)
local target = p.getTarget(rname, fulltext)
local ret = target or rname
local ret = target or rname
ret = getTitle(ret)
ret = getTitle(ret)
if ret then
if ret then
ret = ret.prefixedText
if fulltext then
ret = ret.fullText
else
ret = ret.prefixedText
end
return bracket:format(ret)
return bracket:format(ret)
else
else
Line 118: Line 92:
function p.main(frame)
function p.main(frame)
local args = require('Module:Arguments').getArgs(frame, {frameOnly = true})
local args = require('Module:Arguments').getArgs(frame, {frameOnly = true})
return p.luaMain(args[1], args.bracket) or ''
return p.luaMain(args[1], args.bracket, args.fulltext) or ''
end
end


Cancel Editing help (opens in new window)

  [] · [[]] · [[|]] · {{}} · · “” ‘’ «» ‹› „“ ‚‘ · ~ | °   · ± × ÷ ² ³ ½ · §
     [[Category:]] · [[:File:]] · [[Special:MyLanguage/]] · Special:MyLanguage/ · <code></code> · <nowiki></nowiki> <code><nowiki></nowiki></code> · <syntaxhighlight lang="php"></syntaxhighlight> · <includeonly></includeonly> · <noinclude></noinclude> · #REDIRECT[[]] · <translate></translate> · <languages/> · {{#translation:}} · <tvar name=1></tvar> · {{DEFAULTSORT:}} · <s></s>

Template used on this page: