Module:User:Fenakhay/mt-IPA

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


local export = {}

local rfind = mw.ustring.find
local rsubn = mw.ustring.gsub

local m_q = require("Module:qualifier")
local m_IPA = require("Module:IPA")

local sc = require("Module:scripts").getByCode("Latn")
local lang = require("Module:languages").getByCode("mt")

function export.show(frame)
    local args = frame:getParent().args
    local pagetitle = mw.title.getCurrentTitle().text

    local p, results_archaic_rural = {}, {}

    if args[1] then
        for index, item in ipairs(args) do
            table.insert(p, (item ~= "") and item or nil)
        end
    else
        p = {pagetitle}
    end

    for _, word in ipairs(p) do
        table.insert(results_archaic_rural, {pron = "/" .. export.mt_archaic_rural_IPA(word) .. "/"})
    end

    return m_IPA.format_IPA_full(lang, results)
end

-- version of rsubn() that discards all but the first return value
local function rsub(term, foo, bar)
	local retval = rsubn(term, foo, bar)
	return retval
end

-- apply rsub() repeatedly until no change
local function rsub_repeatedly(term, foo, bar)
	while true do
		local new_term = rsub(term, foo, bar)
		if new_term == term then
			return term
		end
		term = new_term
	end
end

local vowels = "aeiyouâêîôû"
local vowel = "[" .. vowels .. "]"
local consonant = "[^" .. vowels .. "]"
local voiceless_consonant = "ptkqzċfsxħ"
local voiced_consonant = "bdgẓġvzžḡʕ"

local vowel_correspondences = {
    ["i"] = "ɪ",
    ["ì"] = "ɪ",
    ["î"] = "iː",
    ["y"] = "ɪː",
    ["o"] = "ɔ",
    ["ò"] = "ɔ",
    ["ô"] = "ɔː",
    ["e"] = "ɛ",
    ["è"] = "ɛ",
    ["ê"] = "ɛː",
    ["u"] = "u",
    ["ù"] = "u",
    ["û"] = "uː",
    ["a"] = "a",
    ["à"] = "a",
    ["â"] = "aː",
    ["é"] = "ɛˤː",
    ["á"] = "aˤː",
    ["ó"] = "ɔˤː",
    ["æ"] = "əˤ"
}

local devoicing = {
    ["b"] = "p",
    ["g"] = "k",
    ["v"] = "f",
    ["ġ"] = "ċ",
    ["ž"] = "x",
    ["d"] = "t",
    ["ʕ"] = "ħ",
    ["ḡ"] = "ħ",
    ["ẓ"] = "Z"
}

local voicing = {
    ["p"] = "b",
    ["k"] = "g",
    ["f"] = "v",
    ["ċ"] = "ġ",
    ["x"] = "ž",
    ["t"] = "d",
    ["Z"] = "ẓ",
}

local consonant_correspondences = {
    ["ġ"] = "d͡ʒ",
    ["g"] = "ɡ",
    ["x"] = "ʃ",
    ["ċ"] = "t͡ʃ",
    ["q"] = "ʔ",
    ["Z"] = "t͡s",
    ["ż"] = "z",
    ["ẓ"] = "d͡z",
    ["ʕ"] = "ʕ",
    ["ḡ"] = "ɣ",
    ["ž"] = "ʒ",
}

function export.mt_IPA(text, variant, do_debug)
	
	text = rsubn(text, "-", "")
	
	text = rsubn(text, " | ", "# | #")
	text = "##" .. rsubn(text, " ", "# #") .. "##"
	
	text = mw.ustring.lower(text)
	
    -- Replace ie with y
    text = rsubn(text, "ie", "y")
	-- Replace għ with ʕ
    text = rsubn(text, "għ", "ʕ")
	-- Replace ḡ with ʕ if archaic
    if variant == "archaic" then text = rsubn(text, "ḡ", "ʕ") end
    -- Replace final h with ħ
    text = rsubn(text, "h#", "ħ#")
	
    -- Replace z with Z (temp)
    text = rsubn(text, "z", "Z")
    
    local function epenthetic_vowel_add(cons1, cons2)
    	if rfind(cons1, "[nmrl]") or cons1 == cons2 then
	    	return "##(ɪ)" .. cons1 .. cons2
	    end
    end
    
    text = rsubn(text, "##(" .. consonant .. ")(" .. consonant .. ")", epenthetic_vowel_add)
    
	text = rsubn(text, "ZZ([aàâoòôuùû])", "ẓẓ%1")
    
    -- Simplify affricate geminates
    text = rsubn(text, "([ġẓ])%1", "d%1")
    text = rsubn(text, "([Zċ])%1", "t%1")

    -- Replace ʕh, ħh, hh with ħħ
    text = rsubn(text, "[ʕħh]h", "ħħ")

    -- Replace âho, aho with ô
    text = rsubn(text, "[aàâ]ho", "ô")
    -- Replace êhi, ehi with èj
    text = rsubn(text, "[eèê]hi", "èj")
    -- Replace ûho, ùho with ûwo
    text = rsubn(text, "[uùû]ho", "ûwo")
    -- Replace îħ with yħ
    text = rsubn(text, "[yî]([ħhq])", "y%1")
    -- Replace yha with yja
    text = rsubn(text, "yha", "yja")

    -- Replace eh, he with ê
    text = rsubn(text, "h[eèê]", "ê")
    text = rsubn(text, "[eèê]h", "ê")

    -- Replace ah, ha with â
    text = rsubn(text, "h[àâ]", "â")
    text = rsubn(text, "h[àâ]", "â")
    text = rsubn(text, "[âà]ha", "â")
    
    -- Replace ih, hi with î
    text = rsubn(text, "h[iìî]", "î")
    
    -- Replace vowel + għ + vowel with vowel + ˤː
    text = rsubn(text, "[eèê]ʕ[eèê]", "é")
    text = rsubn(text, "[aàâ]ʕ[aàâ]", "á")
    text = rsubn(text, "[oòô]ʕ[oòô]", "ó")
    -- Replace consonant + e + għ + consonant with consonant + ɛˤː + consonant
    text = rsubn(text, "(" .. consonant .. ")[eèê]ʕ(" .. consonant .. ")", "%1é%2")
    -- Replace consonant + a + għ + consonant with consonant + aˤː + consonant
	text = rsubn(text, "(" .. consonant .. ")[aàâ]ʕ(" .. consonant .. ")", "%1á%2")
    -- Replace consonant + ɔ + għ + consonant with consonant + ɔˤː + consonant
	text = rsubn(text, "(" .. consonant .. ")[oòô]ʕ(" .. consonant .. ")", "%1ó%2")
    -- Replace initial għ + î with əˤjː
    text = rsubn(text, "ʕî", "æj")
    -- Replace initial għ + e with əˤ
    text = rsubn(text, "ʕe", "æ")
    -- Replace initial għ + u,û with əˤwː
    text = rsubn(text, "ʕ[uû]", "æw")
    -- Replace initial għ + vowel with vowel + ˤː
    text = rsubn(text, "ʕ[èê]", "é")	
    text = rsubn(text, "ʕ[aàâ]", "á")
    text = rsubn(text, "ʕ[oòô]", "ó")
    
    text = rsubn(text, "a'#", "aˤ#")
    
    -- text = rsubn(text, "êî", "ejî")
    
    local function voice(sound, following)
		return voicing[sound] .. following
    end
    
    local function devoice(sound, following)
		return devoicing[sound] .. following
    end
    
    local function final_devoicing(sound)
		return devoicing[sound]
    end

	-- Final devoicing
	text = rsub_repeatedly(text, "([" .. voiced_consonant .. "])#", final_devoicing)
	
	text = rsub_repeatedly(text, "([" .. voiceless_consonant .. "])([" .. voiced_consonant .. "])", voice)
	text = rsub_repeatedly(text, "([" .. voiced_consonant .. "])([" .. voiceless_consonant .. "])", devoice)
	
    local function simplify_final_geminates(cons1, cons2)
    	if cons1 == cons2 and not rfind(cons1, "[nmrl]") then
	    	return cons2 .. "#"
	    end
    end
    
    text = rsubn(text, "(" .. consonant .. ")(" .. consonant .. ")#", simplify_final_geminates)
    
    -- Replace îħ with yħ
    text = rsubn(text, "[yî]([ħhq])", "y%1")
    
    -- Replace îħ with yħ
    text = rsubn(text, "ts", "Z")
    text = rsubn(text, "dz", "ẓ")
    
    -- Replace consonants
    text = rsubn(text, ".", consonant_correspondences)
    -- Replace vowels
    text = rsubn(text, ".", vowel_correspondences)
    
	text = rsubn(text, "h", "")
	text = rsubn(text, "#", "")

    return text
end

return export