Module:siwa-pron: Difference between revisions

From Linguifex
Jump to navigation Jump to search
No edit summary
No edit summary
Line 83: Line 83:
},
},
{
{
["(" .. vowel .. ")đ$"] = "%1ʔ%1", -- -Vt becomes -VʔV (or -Vht, not considered)
["ƀƀ"] = "ʔp", ["pƀ"] = "ʔp",
["ƀƀ"] = "ʔp", ["pƀ"] = "ʔp",
["đđ"] = "ʔt", ["tđ"] = "ʔt",
["đđ"] = "ʔt", ["tđ"] = "ʔt",
Line 94: Line 93:
["(" .. vowel .. "*)(" .. consonant .. consonant .. ")"] = function(s1, s2) return open_to_closed(s1) .. s2 end,
["(" .. vowel .. "*)(" .. consonant .. consonant .. ")"] = function(s1, s2) return open_to_closed(s1) .. s2 end,
["(" .. vowel .. "*)(" .. consonant .. ")$"] = function(s1, s2) return open_to_closed(s1) .. s2 end,
["(" .. vowel .. "*)(" .. consonant .. ")$"] = function(s1, s2) return open_to_closed(s1) .. s2 end,
["(" .. vowel .. ")đ$"] = "%1ʔ%1", -- -Vt becomes -VʔV (or -Vht, not considered)
["ɑ$"] = "a",
["ɑ$"] = "a",
},
},

Revision as of 13:44, 6 January 2021



local export = {}
	
local m_IPA = require("Module:IPA")
local m_su = require("Module:string utilities")
local m_table = require("Module:table")
local m_sm = mw.loadData('Module:siwa-pron/data')

local sub = mw.ustring.sub
local find = mw.ustring.find
local gmatch = mw.ustring.gmatch
local gsub = mw.ustring.gsub
local u = mw.ustring.char
local split = mw.text.split

local UNRELEASED = u(0x031A) -- COMBINING LEFT ANGLE ABOVE. ̚
local NASALIZED = u(0x0303) -- COMBINING TILDE. ̃

--obsolete ligatures and L with stroke used to remove two-character hassle. will replace later
local consonant = "[mnɲŋpbtdcɟkɡʔvðsɕxɣhʨʥrlɬłʣjwʦʔ]" .. UNRELEASED .. "?"
local front_vowel = "iɪyeøɛœæa"
local back_vowel = "uɔ" .. NASALIZED .. "?ɑʊ"
local vowel = "[" .. front_vowel .. back_vowel .. "]"

local spat1 = "(·?ˈ[mnɲŋpbtdcɟkɡʔvðsɕxɣhʨʥrlɬłʣjwʦ⁽ʰ⁾ʔː]*"..UNRELEASED.."?[iɪyeøɛœæauɔɑʊ])(h)([^ː])"
local spat2 = "(·?ˈ[mnɲŋpbtdcɟkɡʔvðsɕxɣhʨʥrlɬłʣjwʦ⁽ʰ⁾ʔː]*"..UNRELEASED.."?[iɪyeøɛœæauɔɑʊ])(ꬶ)([^ː])"
local spat3 = "(·?ˈ[mnɲŋpbtdcɟkɡʔvðsɕxɣhʨʥrlɬłʣjwʦ⁽ʰ⁾ʔː]*"..UNRELEASED.."?[iɪyeøɛœæauɔɑʊ])(ƀ)([^ː])"
local spat4 = "(·?ˈ[mnɲŋpbtdcɟkɡʔvðsɕxɣhʨʥrlɬłʣjwʦ⁽ʰ⁾ʔː]*"..UNRELEASED.."?[iɪyeøɛœæauɔɑʊ])(đ)([^ː])"

local function open_to_closed(v)
	local otc = {}
	local switch = {["ɑ"] = "a", ["e"] = "ɛ", ["i"] = "ɪ", ["ɔ"] = "ɔ", ["u"] = "ʊ", ["y"] = "œ", ["ø"] = "œ",}
	
	for vc in gmatch(v, ".") do
		vc = gsub(vc, vc, switch[vc])
		table.insert(otc, vc)
	end
	return table.concat(otc)
end

local rules = {
	{ --ligatures and ł
		["tṡ"] = "ʨ", ["ṡ"] = "ɕ", ["į"] = "j", ["dj"] = "ʥ", 
		["ḍ"] = "ð", ["dl"] = "ł", ["kj"] = "c", ["ḥ"] = "ʔ",
		["nj"] = "ɲ", ["ġ"] = "x", ["ts"] = "ʦ", ["g"] = "ɡ", -- IPA g
	},
	{	--long consonants
		["mm"] = "mː", ["bb"] = "pː", ["vv"] = "wː", ["nn"] = "nː",
		["dʥ"] = "ʥː", ["dd"] = "tː", ["ðð"] = "ðː", ["ss"] = "sː",
		["ɕɕ"] = "ɕː", ["rr"] = "rː", ["ll"] = "lː", ["ɡɡ"] = "kː",
		["xx"] = "xː", ["nɡ"] = "ŋː", ["hh"] = "hː", ["ʔʔ"] = "ʔː",
		["nɲ"] = "ɲː", ["hl"] = "ɬː",
	},
	{	--[[default all consonants to unstressed. [] with stroke and ꬶ (U+AB36)
			to tell apart natural and stress-borne]]
		["p"] = "ƀ", ["d"] = "ꝺ", ["t"] = "đ", 
		["ɡ"] = "ɣ", ["k"] = "ꬶ",
	},
	{	--default all vowels as open (open-closed distinctions are computed later)
		["a"] = "ɑ", ["ả"] = "æː",
		["ę"] = "æ",
		["ẻ"] = "eː",
		["ỉ"] = "iː",
		["o"] = "ɔ", ["ỏ"] = "ʊː",
		["ủ"] = "uː",
		["ỷ"] = "yː",
		["ů"] = "ø", ["ẻu"] = "øː",
		["õ"] = "ɔ̃", ["õu"] = "ɔ̃ː̃",
	},
	{
		["^(ˈ)ꬶ([" .. front_vowel .. "])"] = "%1c%2", --word-initial [k] palatalizes before front-vowels
		["^(ˈ[ƀđꬶc])"] = "%1ʰ", --voiceless stops word-initially become aspirated
		["^(.*·ˈ[ƀđꬶc])"] = "%1⁽ʰ⁾",
		["^(ˈ)ɣj([" .. front_vowel .. "])"] = "%1ʣ%2", --<gį> word-initially and before front vowels is pronounced [d͡z]
		["^(ˈ)ɣj([" .. back_vowel .. "])"] = "%1ɟ%2",
		["^(ˈ)ɣ([" .. front_vowel .. "])"] = "%1ɟ%2",
	},
	{
		["ˈƀ"] = "ˈp", ["ˈđ"] = "ˈt", ["ˈꬶ"] = "ˈk", ["ˈꝺ"] = "ˈd",
		["đi"] = "ʨi", ["ði"] = "ʥi", ["ɣi"] = "ɉi", ["ɣj"] = "jː", ["ɣjː"] = "ɟː",
	},
	{
		[spat1] = "%1ʔ%3", [spat2] = "%1k%3", [spat3] = "%1p%3", [spat4] = "%1t%3"
	},
	{
		["ƀƀ"] = "ʔp", ["pƀ"] = "ʔp",
		["đđ"] = "ʔt", ["tđ"] = "ʔt",
		["ꬶꬶ"] = "ʔk", ["kꬶ"] = "ʔk",
		["bm"] = "ʔp̚m", ["ꝺn"] = "ʔt̚n", ["ꬶn"] = "ʔk̚ŋ",
		["mn"] = "mnː", ["mʔk"] = "m̥kː", ["mkː"] = "m̥kː",
		["ġl"] = "xɬ", ["dx"] = "ðx", ["ɡ(i)"] = "ɟ%1"
	},
	{
		["(" .. vowel .. "*)(" .. consonant .. consonant .. ")"] = function(s1, s2) return open_to_closed(s1) .. s2 end,
		["(" .. vowel .. "*)(" .. consonant .. ")$"] = function(s1, s2) return open_to_closed(s1) .. s2 end,
		["(" .. vowel .. ")đ$"] = "%1ʔ%1", -- -Vt becomes -VʔV (or -Vht, not considered)
		["ɑ$"] = "a",
	},
	{
		["į"] = "j", ["l(ʦx)v"] = "ɬ%1w",
	},
	{	--undo ligatures
		["ʨ"] = "t͡ɕ", ["ʥ"] = "d͡ʑ", ["ł"] = "tɬ", ["ʣ"] = "d͡z", ["ʦ"] = "t͡s",
		--["ƀ"] = "p", ["ð"] = "d", ["đ"] = "t", ["ꬶ"] = "k",
	},
	{
		["·"] = "", --remove morpheme separator	
	},
}

function export.morphemes(word)
	local pss = {}

	if gmatch(word,"·") then
		pss = split(word,"·")
	end
	
	for i, m in ipairs(pss) do
		if m_sm.suffix[m] and gmatch(table.concat(pss),"[ˈˌ]") then
		elseif m_sm.prefix[m] then
			pss[i] = "ˌ" .. pss[i]
		else
			pss[i] = "ˈ" .. pss[i]
		end
	end
	
	return table.concat(pss,"·")
end

function export.crux(term)
	local IPA = {}
	
	term=mw.ustring.lower(term)
	term=export.morphemes(term)
	
	for _, rule in ipairs(rules) do
		for regex, replacement in pairs(rule) do
			term = gsub(term, regex, replacement)
		end
	end
	
	table.insert(IPA, term)
	return table.concat(IPA)
end

function export.show(frame)
	local parent_args = frame:getParent().args
	local params = {
		[1] = { default = mw.title.getCurrentTitle().nsText == 'Template' and "uįo·sauṡṡi" or mw.title.getCurrentTitle().text },
	}
	local args = require("Module:parameters").process(parent_args, params)
	local term = args[1]
	
	local ipa = export.crux(term)
	
	local IPA_key = "IPA for Siwa"
	local key_link = "[[".. IPA_key .."|key]]"

	local prefix = "[[w:IPA chart|IPA]]<sup>(" .. key_link .. ")</sup>:&#32;"
	local accent="(\''Aingo\'') "
	
	ipa = "<span style=\"font-size:110%;font-family:Gentium,'DejaVu Sans','Segoe UI',sans-serif>[" .. ipa .. "]</span>"
	ipa = accent..prefix..ipa
	
	return ipa
end

return export