Module:TitleCase

local p = {} local getArgs = require('Module:Arguments').getArgs

function search(category, substrings) for k,v in pairs(substrings) do       if string.find(category, v) then return true end end return false end

-- From Lua-User Wiki: http://lua-users.org/wiki/SciteTitleCase function titlecase(str) local titleName = '' local buf = {} local inWord = false for i = 1, #str do		local c = string.sub(str, i, i)		if inWord then table.insert(buf, c)			if string.find(c, '%s') or string.find(c, '-') then inWord = false end elseif string.find(c, '%(') or string.find(c, '\'') then			table.insert(buf, c)			inWord = false		else			table.insert(buf, string.upper(c))			inWord = true		end	end	return table.concat(buf) end

function p.main(frame) local args        = getArgs(frame) local name        = args['1'] or '' local titleCase   = titlecase(name) return p.keepLowercase(titleCase) end

function p.keepLowercase(str) local small = {"A", "Al", "And", "An", "As", "At", "By", "En", "De", "Di", "For", "If", "In", "IQue", "IQueGBA", "N", "No", "Nor", "O", "Of", "On", "Or", "Only", "Over", "Per", "So", "Some", "That", "Than", "The", "To", "Upon", "Vs", "Versus", "Via", "Where", "When", "With", "Without", "Yet"} if search(str:gsub("^%l", string.upper), small) == true then for k,v in pairs(small) do if string.find(str, "%p" .. v .. "%p") then str = str:gsub("%p" .. v .. "%p", string.lower) elseif string.find(str, "%s" .. v .. "%s") then str = str:gsub("%s" .. v .. "%s", string.lower) elseif string.find(str, "%s" .. v .. "%p") then str = str:gsub("%s" .. v .. "%p", string.lower) end end end -- Special fixes if str == "Ultra no-Show Socks" then str = "Ultra No-Show Socks" elseif str == "Retro a-Line Dress" then str = "Retro A-Line Dress" elseif str == "Custom Fencing in A Flash" then str = "Custom Fencing in a Flash" elseif str == "Grand Q. a. Birdwing Model" then str = "Grand Q. A. Birdwing Model" end return str end

return p