Module:ofs-IPA

From Wiktionary, the free dictionary
Jump to navigation Jump to search

local export = {}

local m_IPA = require("Module:IPA")
local lang = require("Module:languages").getByCode("ofs")
local m_a = require("Module:accent qualifier")
local rsub = mw.ustring.gsub
local rlower = mw.ustring.lower

local V = "[aeiou]ː?"
local Vs = "[aeioumnrlwj]ː?"

local phon = {
	-- vowels
	["a"]="a",	["e"]="e",	["i"]="i",	["o"]="o",	["u"]="u",
	["ê"]="εː",	["ô"]="ɔː",
	-- consonants
	["p"]="p",	["b"]="b",	["f"]="f",	["v"]="v",	["m"]="m",
	["t"]="t",	["d"]="d",	["s"]="s",	["n"]="n",	["z"]="dz",
	["k"]="k",	["g"]="ɡ",	["l"]="l",	["r"]="r",	["h"]="h",
}

local function phonetic(text)
	text = rlower(text)
	-- long vowels
	text = rsub(text, "ā", "aM")
	text = rsub(text, "ē", "eM")
	text = rsub(text, "ī", "iM")
	text = rsub(text, "ō", "oM")
	text = rsub(text, "ū", "uM")
	text = rsub(text, "(" .. V .. ")M", "%1ː")
	-- consonant digraphs
	text = rsub(text, "th", "θ")
	text = rsub(text, "ch", "χ")
	-- general phonology
	text = rsub(text, '.', phon)
	text = rsub(text, "([iu])ː", "%1%1")
	text = rsub(text, "(" .. V .. ")i(" .. V .. ")", "%1j%2")
	text = rsub(text, "(" .. V .. ")u(" .. V .. ")", "%1w%2")
	text = rsub(text, "([iu])%1", "%1ː")
	text = rsub(text, "([pbtdkɡfθsχmnlr])%1", "%1ː")
	text = rsub(text, "n([ɡkχ])", "ŋ%1")
	-- intervocalic consonants
	text = rsub(text, "(" .. Vs .. ")ɡ(" .. Vs .. ")", "%1ɣ%2")
	text = rsub(text, "(" .. Vs .. ")θ(" .. Vs .. ")", "%1ð%2")
	text = rsub(text, "(" .. Vs .. ")f(" .. Vs .. ")", "%1v%2")
	text = rsub(text, "(" .. Vs .. ")s(" .. Vs .. ")", "%1z%2")
	-- affricates
	text = rsub(text, "ts", "t͡s")
	text = rsub(text, "dz", "d͡z")
	-- diphthongs
	text = rsub(text, "i([auoe])ː", "j%1ː")
	text = rsub(text, "i([uo])", "j%1")
	text = rsub(text, "e(ː?)i", "e%1i̯")
	text = rsub(text, "a(ː?)u", "a%1u̯")
	
	return text
end

function export.IPA(frame)
	local words = {}
	
	for _, word in ipairs(frame:getParent().args) do
		table.insert(words, word)
	end
	
	if #words == 0 then
		words = {mw.title.getCurrentTitle().text}
	end
	
	local IPA_results = {}
	
	for _, word in ipairs(words) do
		table.insert(IPA_results, { pron = "[" .. phonetic(word) .. "]" })
	end
	
	return m_a.format_qualifiers(lang, {"13<sup>th</sup> CE"}) .. " " .. m_IPA.format_IPA_full { lang = lang, items = IPA_results }
end

return export