require("strict")
local getArgs = require("Module:Arguments").getArgs
local p = {}
local function dedab(title)
return title:gsub(" ?%(.-%)","")
end
function p.main(frame)
local args = getArgs(frame)
-- The invalid character, e.g. ">" or "}"
local chr = args[1]
-- The escaped bad title, e.g. "Foobar>" or "Foobar|text"
local title = args[2]
-- A pipe (|) as the invalid character is a special case; it is not
-- escaped, so instead the module thinks it got two empty arguments
-- and the title as the third argument.
if chr == nil and title == nil then
chr = "|"
title = args[3]
end
if chr == nil or title == nil then
return ""
end
-- Determine the suggested title by taking a prefix of the bad title
-- up to the first invalid character. Only display the suggestion box
-- if the page exists.
local index = mw.ustring.find(title, mw.text.nowiki(chr), 1, true)
local truncate = ""
if index then
local page = mw.title.new(mw.ustring.sub(title, 1, index - 1))
if page and page.exists then
truncate = '<div class="mw-parser-output">' .. frame:expandTemplate{
title = "Did you mean box",
args = { page.fullText }
} .. '</div>'
end
end
return p._substitute(frame, title, chr)..truncate
end
function p._substitute(frame, title, chr)
-- Since the overrides page has a lower protection level than this one don't crash if it's invalid
local success, overrides = pcall(function() return mw.loadJsonData("Module:Bad title suggestion/override.json") end)
local spage
local substitute = ""
title = mw.text.decode(title):gsub("_", " ")
if success and overrides[title] then
spage = mw.title.new(overrides[title])
elseif success and overrides[title:lower()] then
spage = mw.title.new(overrides[title:lower()])
elseif success and overrides[dedab(title)] then
spage = mw.title.new(overrides[dedab(title)])
elseif not chr or chr == "[" or chr == "]" then
local replaced = title:gsub("%[","("):gsub("%]",")")
if replaced ~= title then
spage = mw.title.new(replaced)
end
end
if spage and spage.exists then
substitute = '<div class="mw-parser-output">' .. frame:expandTemplate{
title = "Did you mean box",
args = { spage.fullText }
} .. '</div>'
end
return substitute
end
function p.substitute(frame)
return p._substitute(frame, frame.args[1], nil)
end
return p