Module:yo-utilities


local export = {}

local U = mw.ustring.char
local acute, grave, macron, underdot = U(0x301), U(0x300), U(0x304),U(0x323)
local tone = "[" .. acute .. grave .. macron .. "]"
local Vn_pattern = "([aeiou])" .. tone .. "*(" .. underdot .. "?)" .. tone .. "*n"

local function can_be_nasal(vowel, possible_underdot)
	return vowel == "a" or vowel == "i" or vowel == "u"
		or ((vowel == "e" or vowel == "o") and possible_underdot == underdot)
end

-- Adégbé-n-ró for Adégbén̄ró not supported (considered multiword).
function export.is_multiword(term)
	-- Decompose so that diacritics are separate code points and can be matched.
	term = mw.ustring.toNFD(mw.ustring.lower(term))
	for start_pos, possible_break, end_pos in mw.ustring.gmatch(term, "()([%s%p])()") do
		if possible_break == "-" then
			local V1, underdot1 = mw.ustring.match(mw.ustring.sub(term, 1, start_pos - 1), Vn_pattern .. "$")
			local V2, underdot2 = mw.ustring.match(term, "^" .. Vn_pattern, end_pos)
			if not (can_be_nasal(V1, underdot1) and can_be_nasal(V2, underdot2) and V1 == V2) then
				return true
			end
		else
			return true
		end
	end
	return false
end

return export