Module:hsb-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("hsb")
local rsub = mw.ustring.gsub
local rlower = mw.ustring.lower

local C = "[bdfɡɦxjkβmnpʀʃstvɥzʒʲ]"
local V = "[aɛeiɔouɪ]"
local T = "[pfsxkpʃst]"
local D = "[bvβdɡɦzʒ]"

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 di = {
	["ch"]="x",
	["dź"]="dʒ",
	["tř"]="tS",
	["wj"]="ɥ",
}

local phon = {
	["a"]="a",
	["b"]="b",
	["c"]="ts",
	["č"]="tʃ",
	["ć"]="tʃ",
	["d"]="d",
	["e"]="ɛ",
	["ě"]="ɪ",
	["f"]="f",
	["g"]="ɡ",
	["h"]="ɦ",
	["i"]="i",
	["j"]="j",
	["k"]="k",
	["l"]="l",
	["ł"]="w",
	["m"]="m",
	["n"]="n",
	["ń"]="jn",
	["o"]="ɔ",
	["ó"]="ʊ",
	["p"]="p",
	["q"]="kʰ",
	["r"]="ʀ",
	["ř"]="ʃ",
	["s"]="s",
	["š"]="ʃ",
	["t"]="t",
	["u"]="u",
	["w"]="w",
	["v"]="v",
	["y"]="ɨ",
	["z"]="z",
	["ž"]="ʒ",
}

local devoicing = {
    ["b"] = "p",
    ["d"] = "t",
    ["ɡ"] = "k",
    ["z"] = "s",
    ["v"] = "f",
    ["ʒ"] = "ʃ",
}

local voicing = {
    ["p"] = "b",
    ["t"] = "d",
    ["k"] = "ɡ",
    ["s"] = "z",
    ["f"] = "v",
    ["ʃ"] = "ʒ",
}

local function phonemic(text)
	text = rlower(text)
	
	text = rsub(text, " | ", "# | #")
	text = "##" .. rsub(text, " ", "# #") .. "##"
	
	-- basic phonology
	text = rsub(text, "ts", "tss")
	text = rsub(text, "..", di)
	text = rsub("1" .. text, "..", di)
	text = rsub("1" .. text, "..", di)
	text = rsub(text, "1", "")
	text = rsub(text, ".", phon)
	-- 
	text = rsub(text, "#x", "#kʰ")
	--
	text = rsub(text, "X", "x")
	--
	text = rsub(text, "#sx", "skʰ")
	--
	text = rsub(text, "#zɦ", "z")
	-- palatalisation
	text = rsub(text, "jʲ", "j")
	-- h
	text = rsub(text, "ɦ#", "")
	text = rsub(text, "ɦ("..C..")", "%1")
	-- ł
	text = rsub(text, "("..C..")w$", "%1")
	text = rsub(text, "("..C..")w("..C..")", "%1%2")
	-- w
	text = rsub(text, "("..C..")v$", "%1")
	text = rsub(text, "("..C..")v("..C..")", "%1%2")
		
	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

	--v voicing
	text = rsub(text, "(" .. T .. ")v", "%1f")
	
	-- Final devoicing
	text = rsub_repeatedly(text, "(" .. D .. ")#", final_devoicing)
	
	text = rsub_repeatedly(text, "(" .. T .. ")(" .. D .. ")", voice)
	text = rsub_repeatedly(text, "(" .. D .. ")(" .. T .. ")", devoice)
	
	-- stress
	if mw.ustring.find(text, "'") == nil then
		text = "ˈ" .. text
	end
	text = rsub(text, "^(" .. C .. "+ʲ?)'", "'%1")
	text = rsub(text, " (" .. C .. "+ʲ?)'", " '%1")
	text = rsub(text, "(" .. C .. "ʲ?)'", "'%1")
	text = rsub(text, "t's", "'ts")
	text = rsub(text, "'", "ˈ")
	-- affricates
	text = rsub(text, "t([sʃ])", "t͡%1")
	text = rsub(text, "d([zʒ])", "d͡%1")
	-- suffixes
	text = rsub(text, "^ˈ%-", "")
	-- resolution
	text = rsub(text, "wʲ", "w")
	text = rsub(text, "jʲ", "j")
	-- tř
	text = rsub(text, "tS", "tʃ")
	
	text = rsub(text, "#", "")

	text = rsub(text, "-", "")
	
	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 = "/" .. phonemic(word) .. "/" })
	end
	
	return m_IPA.format_IPA_full { lang = lang, items = IPA_results }
end

return export