Pergi ke kandungan

Modul:egy-pron-Egyptological

Daripada Wikikamus
local export = {}

local m_IPA = require("Module:IPA")
local m_a = require("Module:accent qualifier")
local lang = require("Module:languages").getByCode("egy")

-- single characters that map to IPA sounds
local phonetic_chars_map = {
	["ꜣ"] = "ɑ",
	["j"] = "i",
	["y"] = "iː",
	["ꜥ"] = "ɑː",
	["w"] = "w",
	["u"] = "uː",
	["b"] = "b",
	["p"] = "p",
	["f"] = "f",
	["m"] = "m",
	["n"] = "n",
	["r"] = "r",
	["h"] = "h",
	["ḥ"] = "ħ",
	["ḫ"] = "x",
	["ẖ"] = "ç",
	["z"] = "z",
	["s"] = "s",
	["š"] = "ʃ",
	["q"] = "k",
	["k"] = "k",
	["g"] = "ɡ",
	["t"] = "t",
	["ṯ"] = "t͡ʃ",
	["d"] = "d",
	["ḏ"] = "d͡ʒ",
	["e"] = "ɛ"
}

-- single characters that map to letters in the standard anglicization
local ang_chars_map = {
	["ꜣ"] = "a",
	["j"] = "i",
	["y"] = "y",
	["ꜥ"] = "a",
	["w"] = "w",
	["u"] = "u",
	["b"] = "b",
	["p"] = "p",
	["f"] = "f",
	["m"] = "m",
	["n"] = "n",
	["r"] = "r",
	["h"] = "h",
	["ḥ"] = "h",
	["ḫ"] = "kh",
	["ẖ"] = "kh",
	["z"] = "z",
	["s"] = "s",
	["š"] = "sh",
	["q"] = "q",
	["k"] = "k",
	["g"] = "g",
	["t"] = "t",
	["ṯ"] = "tj",
	["d"] = "d",
	["ḏ"] = "dj",
	["e"] = "e"
}

function export.to_IPA(word)
	word = mw.ustring.lower(word)
	
	local phonetic = word
	
	phonetic = mw.ustring.gsub(phonetic, "^%-", "")
	phonetic = mw.ustring.gsub(phonetic, "%-$", "")
	phonetic = mw.ustring.gsub(phonetic, "%-", " ")
	phonetic = mw.ustring.gsub(phonetic, "_", " _ʔ")
	phonetic = mw.ustring.gsub(phonetic, "%f[%a]j%.", "j")
	phonetic = mw.ustring.gsub(phonetic, "%.", " ʔ")
	
	-- handle w/u
	phonetic = mw.ustring.gsub(phonetic, "w", "u")
	phonetic = mw.ustring.gsub(phonetic, "%f[%a]u", "w")
	phonetic = mw.ustring.gsub(phonetic, "s _ʔu", "s _ʔw")
	
	-- e-epenthesis
	phonetic = mw.ustring.gsub(phonetic, "%f[%a]([mnr])%f[%A]", "e%1")
	phonetic = mw.ustring.gsub(phonetic, "ʔ([bpfmnrhḥḫẖzsšqkgtṯdḏ])%f[%A]", "ʔe%1")
	phonetic = mw.ustring.gsub(phonetic, "%f[%a]([wbpfmnrhḥḫẖzsšqkgtṯdḏ])%f[%A]", "%1e")
	phonetic = mw.ustring.gsub(phonetic, "([ꜣjyꜥue])([bpfmnrhḥḫẖzsšqkgtṯdḏ])([bpfmnrhḥḫẖzsšqkgtṯdḏ])([ꜣjyꜥue])", "%1%2v%3%4")
	phonetic = mw.ustring.gsub(phonetic, "([wbpfmnrhḥḫẖzsšqkgtṯdḏ])([bpfmnrhḥḫẖzsšqkgtṯdḏ])", "%1e%2")
	phonetic = mw.ustring.gsub(phonetic, "([wbpfmnrhḥḫẖzsšqkgtṯdḏ])([bpfmnrhḥḫẖzsšqkgtṯdḏ])%f[%A]", "%1e%2")
	phonetic = mw.ustring.gsub(phonetic, "v", "")
	phonetic = mw.ustring.gsub(phonetic, "([ꜣjyꜥue])([bpfmnrhḥḫẖzsšqkgtṯdḏ])e([bpfmnrhḥḫẖzsšqkgtṯdḏ])e", "%1%2%3e")
	phonetic = mw.ustring.gsub(phonetic, "([wbpfmnrhḥḫẖzsšqkgtṯdḏ])%1", "%1e%1")
	
	phonetic = mw.ustring.gsub(phonetic, " _ʔ", "")
	phonetic = mw.ustring.gsub(phonetic, " ʔ", "ʔ")
	
	-- irregularity
	phonetic = mw.ustring.gsub(phonetic, "ꜥneḫ", "ꜥnḫ")
	
	-- glottal stop (~ hiatus) between vowels
	phonetic = mw.ustring.gsub(phonetic, "([ꜣꜥ])([ꜣꜥ])", "%1ʔ%2")
	phonetic = mw.ustring.gsub(phonetic, "([ꜣꜥ])([ꜣꜥ])%f[%A]", "%1ʔ%2")
	phonetic = mw.ustring.gsub(phonetic, "([jy])([jy])", "%1ʔ%2")
	phonetic = mw.ustring.gsub(phonetic, "([jy])([jy])%f[%A]", "%1ʔ%2")
	phonetic = mw.ustring.gsub(phonetic, "uu", "uʔu")
	
	-- to IPA
	phonetic = mw.ustring.gsub(phonetic, '.', phonetic_chars_map)
	
	return "/" .. phonetic .. "/"
end

function export.pronunciation(words)
	local items = {}
	for _, word in ipairs(words) do
		table.insert(items, { pron = export.to_IPA(word), note = nil })
	end
	return m_IPA.format_IPA_full(lang, items)
end

function export.to_anglicization(word)
	word = mw.ustring.lower(word)
	
	local ang = word
	
	ang = mw.ustring.gsub(ang, "%-", " - ")
	ang = mw.ustring.gsub(ang, "%f[%a]j%.", "j")
	ang = mw.ustring.gsub(ang, "%.", " ʔ")
	ang = mw.ustring.gsub(ang, "_", " _ʔ")
	
	-- handle w/u
	ang = mw.ustring.gsub(ang, "w", "u")
	ang = mw.ustring.gsub(ang, "%f[%a]u", "w")
	ang = mw.ustring.gsub(ang, "s _ʔu", "s _ʔw")
	ang = mw.ustring.gsub(ang, "uj%f[%A]", "wj")
	
	-- e-epenthesis
	ang = mw.ustring.gsub(ang, "%f[%a]([mnr])%f[%A]", "e%1")
	ang = mw.ustring.gsub(ang, "ʔ([wbpfmnrhḥḫẖzsšqkgtṯdḏ])%f[%A]", "ʔe%1")
	ang = mw.ustring.gsub(ang, "%f[%a]([wbpfmnrhḥḫẖzsšqkgtṯdḏ])%f[%A]", "%1e")
	ang = mw.ustring.gsub(ang, "([ꜣjyꜥue])([wbpfmnrhḥḫẖzsšqkgtṯdḏ])([wbpfmnrhḥḫẖzsšqkgtṯdḏ])([ꜣjyꜥue])", "%1%2v%3%4")
	ang = mw.ustring.gsub(ang, "([wbpfmnrhḥḫẖzsšqkgtṯdḏ])([wbpfmnrhḥḫẖzsšqkgtṯdḏ])", "%1e%2")
	ang = mw.ustring.gsub(ang, "([wbpfmnrhḥḫẖzsšqkgtṯdḏ])([wbpfmnrhḥḫẖzsšqkgtṯdḏ])%f[%A]", "%1e%2")
	ang = mw.ustring.gsub(ang, "v", "")
	ang = mw.ustring.gsub(ang, "([ꜣjyꜥue])([wbpfmnrhḥḫẖzsšqkgtṯdḏ])e([wbpfmnrhḥḫẖzsšqkgtṯdḏ])e", "%1%2%3e")
	ang = mw.ustring.gsub(ang, "([wbpfmnrhḥḫẖzsšqkgtṯdḏ])%1", "%1e%1")
	
	ang = mw.ustring.gsub(ang, " _ʔ", "")
	ang = mw.ustring.gsub(ang, " ʔ", ".")
	
	-- irregularities
	ang = mw.ustring.gsub(ang, "ꜥneḫ", "ꜥnḫ")
	ang = mw.ustring.gsub(ang, "neḫet", "naḫt")
	ang = mw.ustring.gsub(ang, "jmen", "ꜣmen")
	ang = mw.ustring.gsub(ang, "jten", "ꜣten")
	ang = mw.ustring.gsub(ang, "sebek", "sobek")
	ang = mw.ustring.gsub(ang, "peteḥ", "ptaḥ")
	
	ang = mw.ustring.gsub(ang, " %- ", "-")
	
	-- to standard anglicization
	ang = mw.ustring.gsub(ang, '.', ang_chars_map)
	
	return ang
end

function export.anglicization(words)
	local items = {}
	for _, word in ipairs(words) do
		table.insert(items, export.to_anglicization(word))
	end
	return table.concat(items, ', ')
end

function export.show(frame)
	local params = {
		[1] = { list = true, default = mw.title.getCurrentTitle().text },
		ang = { list = true, allow_holes = true },
	}
	local args = require("Module:parameters").process(frame:getParent().args, params)
	-- if there is not a user-specified anglicization of a given pronunciation input,
	-- copy the pronunciation input
	for i, word in ipairs(args[1]) do
		if not args.ang[i] then
			args.ang[i] = word
		end
	end
	
	local anglicization = '\n** Penginggerisan konvensional: <span class="use-with-mention">' .. export.anglicization(args.ang) .. '</span>'
	if args.ang[1] == '0' then
		anglicization = ''
	end
	
	return table.concat {
		'* ', m_a.show({ "Kaji purba Mesir" }), ' ', export.pronunciation(args[1]),
		anglicization
	}
end

return export