Module:Bad title suggestion/sandbox
From Kenshi Wiki
More actions
This module implements title suggestions for the "Bad title" interface message at MediaWiki:Title-invalid-characters. When the user asks for a page with invalid characters, this module checks for a page with the given title up to the first invalid character. If it exists, {{Did you mean box}} is displayed.
Usage
{{#invoke:Bad title suggestion|main|invalid_char|bad_title_encoded}}
In the case of MediaWiki:Title-invalid-characters, this is:
{{#invoke:Bad title suggestion|main|$1|$2}}
Examples
- Foobar>: 
{{#invoke:Bad title suggestion|main|>|Foobar>}} 
- Wikipedia:Village pump}}: 
{{#invoke:Bad title suggestion|main|}|Wikipedia:Village pump}}}} 
- Main Page|title text!: 
{{#invoke:Bad title suggestion|main|||Main Page|title text!}} 
| Did you mean: Main Page? | 
- This page absolutely does not exist>: 
{{#invoke:Bad title suggestion|main|>|This page absolutely does not exist>}} 
(nothing displayed)
- Category:Contents>: 
{{#invoke:Bad title suggestion|main|>|Category:Contents>}} 
- <Foobar>: 
{{#invoke:Bad title suggestion|main|<|#60;Foobar#62;}} 
(nothing displayed)
- Solo [3]: 
{{#invoke:Bad title suggestion|main|[|Solo [3]}} 
- M>Train: 
{{#invoke:Bad title suggestion|main|>|M>Train}} 
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