Module:User:Thadh/et-IPA

Hello, you have come here looking for the meaning of the word Module:User:Thadh/et-IPA. In DICTIOUS you will not only get to know all the dictionary meanings for the word Module:User:Thadh/et-IPA, but we will also tell you about its etymology, its characteristics and you will know how to say Module:User:Thadh/et-IPA in singular and plural. Everything you need to know about the word Module:User:Thadh/et-IPA you have here. The definition of the word Module:User:Thadh/et-IPA will help you to be more precise and correct when speaking or writing your texts. Knowing the definition ofModule:User:Thadh/et-IPA, as well as those of other words, enriches your vocabulary and provides you with more and better linguistic resources.

This is a private module sandbox of Thadh, for their own experimentation. Items in this module may be added and removed at Thadh's discretion; do not rely on this module's stability.


local export = {}

local m_IPA = require("Module:IPA")
local lang = require("Module:languages").getByCode("et")

local A = mw.ustring.char(0x002A) 		-- halflength marker (asterisk)
local C = ""			-- consonants
local D = mw.ustring.char(0x0308)		-- centralisation marker (diaeresis)
local L = "" 						-- length markers
local R = mw.ustring.char(0x0325)		-- voicelessness marker (ring below)
local S = mw.ustring.char(0x032F) 		-- diphthong marker
local T = mw.ustring.char(0x031E)		-- lowering marker (downtack)
local V = ""					-- vowels

local phon = {
	-- consonants
	="b̥",	="d̥",	="ɡ̊",
	="p", ="t", ="k",
	="v",	="ʒ",
	="f",	="ʃ",
	="ʲ",
	-- vowels
	="ɑ",	="e",	="i",
	="o",	="u",	="æ",
	="ɤ",	="ø",	="y",
}

local function phonemic(text)
	-- general phonology
	text = mw.ustring.gsub(text, '.', phon)
	-- long consonants
	text = mw.ustring.gsub(text, "()" .. A, "%1")
	text = mw.ustring.gsub(text, "(" .. C .. ")" .. L .. "?%1", "%1ː")
	text = mw.ustring.gsub(text, "(" .. C .. ")" .. L .. "?" .. A, "%1ˑ")
	-- palatalised long consonants
	text = mw.ustring.gsub(text, "(" .. C .. ")(" .. L .. ")ʲ", "%1ʲ%2")
	-- long vowels
	text = mw.ustring.gsub(text, "(" .. V .. ")%1", "%1ː")
	text = mw.ustring.gsub(text, "(" .. V .. ")" .. A, "%1ˑ")
	-- üüV
	text = mw.ustring.gsub(text, "y" .. L .. "(" .. V .. ")", "yij%1")
	-- diphthongs
	text = mw.ustring.gsub(text, "()()", "%1%2" .. S)
	text = mw.ustring.gsub(text, "æ()", "æ%1" .. S)
	text = mw.ustring.gsub(text, "ø()", "ø%1" .. S)
	text = mw.ustring.gsub(text, "y()", "y%1" .. S)
	-- stress
	if mw.ustring.find(text, "ˈ") == nil then
		text = "ˈ" .. text
		text = mw.ustring.gsub(text, "+", "ˌ")
	end
	text = mw.ustring.gsub(text, "(" .. L .. ")" .. L, "%1")
	
	return text
end

local function phonetic(text)
	-- palatalisation
	text = mw.ustring.gsub(text, "()%f", "%1ʲ")
	-- velar nasal
	text = mw.ustring.gsub(text, "n%f", "ŋ")
	-- glide insertion
	text = mw.ustring.gsub(text, "(" .. V .. ")i(" .. V .. ")", "%1ij%2")
	text = mw.ustring.gsub(text, "(" .. V .. ")u(" .. V .. ")", "%1uw%2")
	-- flash forward to after phonemic transcription
	text = phonemic(text)
	-- optional initial h-
	text = mw.ustring.gsub(text, "^ˈh", "ˈ(h)")
	-- h-voicing
	text = mw.ustring.gsub(text, "(" .. V .. S .. "?)h(" .. V .. ")", "%1ɦ%2")
	-- short gemination
	text = mw.ustring.gsub(text, "(" .. V .. S .. "?)(ʲ?)(" .. V .. ")", "%1%2ˑ%3")
	text = mw.ustring.gsub(text, "(ʲ?)$", "%1ˑ")
	text = mw.ustring.gsub(text, "(ʲ?)()", "%1ˑ%2")
	text = mw.ustring.gsub(text, "(" .. R .. "?" .. L .. "?)(ʲ?)ˑ", "%1%2")
	-- final devoicing
	text = mw.ustring.gsub(text, "b̥$", "p")
	text = mw.ustring.gsub(text, "d̥$", "t")
	text = mw.ustring.gsub(text, "ɡ̊$", "k")
	text = mw.ustring.gsub(text, "(ʲ?)()$", "%1ˑ%2" .. R)
	-- vowel articulation
	text = mw.ustring.gsub(text, "e$", "e" .. T)
	text = mw.ustring.gsub(text, "jɑ", "jɑ" .. D)
	text = mw.ustring.gsub(text, "ɑj", "ɑ" .. D .. "j")
	text = mw.ustring.gsub(text, "ju", "ju" .. D)
	text = mw.ustring.gsub(text, "uj", "u" .. D .. "j")
	return text
end

function export.IPA(frame)
	local emic = {}
	local etic = {}
	
	for _, word in ipairs(frame:getParent().args) do
		table.insert(emic, word)
		table.insert(etic, word)
	end
	
	if #emic == 0 then
		emic = {mw.title.getCurrentTitle().text}
		etic = {mw.title.getCurrentTitle().text}
	end
	
	for key, word in ipairs(emic) do
		emic = phonemic(word)
		etic = phonetic(word)
	end
	
	-- hardcoding this because I'm not that good at Lua
	if #emic <= 1 then
		return m_IPA.format_IPA_full {
			lang = lang,
			items = {
				{ pron = "/" .. table.concat(emic) .. "/" },
				{ pron = "" }
			},
		}
	elseif #emic == 2 then
		return m_IPA.format_IPA_full {
			lang = lang,
			items = {
				{ pron = "/" .. emic .. "/" },
				{ pron = " .. "]" },
				{ pron = "/" .. emic .. "/" },
				{ pron = " .. "]" },
			},
		}
	end
end

return export