Module:kilta-pron: Difference between revisions

From Linguifex
Jump to navigation Jump to search
No edit summary
No edit summary
 
(104 intermediate revisions by the same user not shown)
Line 5: Line 5:
local match = mw.ustring.match
local match = mw.ustring.match
local u = mw.ustring.char
local u = mw.ustring.char
local gsplit = mw.text.gsplit
local split = mw.text.split
local split = mw.text.split
local gsplit = mw.text.gsplit


local A = u(0x0301) -- COMBINING ACUTE
local A = u(0x0301) -- COMBINING ACUTE
Line 14: Line 14:
local m_IPA = require("Module:IPA")
local m_IPA = require("Module:IPA")


local consonants = "[pβmtsnɾlʧkxʷʞƕː]"
local consonants = "[pβmtsnɾlʧkxqhyʤɡbvdƕ]"
local vowels = "[aeiouəꜷꜽː]"
local vowels = "[aeiouáéíóúəïüëæ]"


local export = {}
local export = {}
Line 26: Line 26:


local phonemic_rules = {
local phonemic_rules = {
{"%-", ""}, {"hw", "ƕ"}, {"kw", "ʞ"}, {"ch", "ʧ"}, {"au", ""}, {"ai", ""},
{"%-$", ""}, {"%-", " "},
{"hw", "ƕ"}, {"kw", "q"}, {"ch", "ʧ"}, {"au", "ü"}, {"ai", "ï"}, {"h", "x"},  
{"v", "β"}, {"r", "ɾ"}, {"h", "x"},
{"v", "β"}, {"r", "ɾ"},  
{"ë", "ə"}, {"ëë+", "əː"}, {"([áéíóú])", function(v) return mw.ustring.toNFD(v):gsub(A, "ː") end},
{"ë", "ə"}, {"əə+", "əː"},
{"", "ʞː"}, {"(" .. consonants .. ")(" .. consonants .. ")",
{"kq", "qː"}, {"cʧ", "ʧː"}, {"(" .. consonants .. ")(" .. consonants .. ")",
function(c1,c2) return same(c1,c2) and c1 .. "ː" or c1 .. c2 end},
function(c1,c2) return same(c1,c2) and c1 .. "ː" or c1 .. c2 end},
}
}


local phonetic_rules = {
local phonetic_rules = {
{"á", "a"}, {"", ""}, {"", ""}, {"", ""},  
{"a(·?ˈ?)([nm])", "æ%1%2"}, {"á(·?ˈ?)([nm])", "æː%1%2"},
{"", ""}, {"", ""}, {"", ""}, {"", ""}, {"", ""},  
{"n(ː?·?ˈ?)([kxqƕ])", "ŋ%1%2"},
{"", ""}, {"", ""}, {"", ""}, {"", ""}, {"", ""},  
{"([nŋm]·?)k", "%1ɡ"}, {"([nŋm]·?)q", "%1y"}, {"([nŋm]·?)p", "%1b"}, {"([nŋm]·?)ʧ", "%1ʤ"},
{"", ""}, {"", ""}, {"", ""}, {"", ""}, {"", ""},  
{"([nŋm]·?)t", "%1d"},  
{"", ""}, {"", ""}, {"", ""}, {"", ""}, {"", ""},  
{"([nŋm])(ː?·?ˈ?)β", "%1%2b"},
{"", ""}, {"", ""}, {"", ""}, {"", ""}, {"", ""},  
{"β([iíeé])", "v%1"},
{"", ""}, {"", ""}, {"", ""}, {"", ""}, {"", ""},  
{"^(ˈ?)(" .. vowels .. ")", "%1ʔ%2"},
{"", ""}, {"", ""}, {"", ""}, {"", ""}, {"", ""},  
{"ü", "aʊ̯"},
{"", ""}, {"", ""}, {"", ""}, {"", ""}, {"", ""},
{"ï", "aɪ̯"},
{"", ""}, {"", ""}, {"", ""}, {"", ""}, {"", ""},  
}
 
local deacuter = {
["á"] = "a", ["é"] = "e", ["í"] = "i", ["ó"] = "o", ["ú"] = "u",  
}
}


local last_rules = {
local last_rules = {
{"ʞ", "kʷ"}, {"ƕ", "xʷ"}, {"ʧ", "t͡ʃ"},
{"q", "kʷ"}, {"ƕ", "xʷ"}, {"y", "ɡʷ"},
{"", "au"}, {"", "ai"},
{"ʧ", "t͡ʃ"},
{"ʤ", "d͡ʒ"},
{"ü", "au̯"},
{"ï", "ai̯"},
{"[·%.]ˈ", "ˈ"}, {"·", "."}, {"([áéíóú])", function(v) return deacuter[v] .. "ː" end},
}
 
local sandhi_rules = {
{"(" .. consonants .. ")u%sˈ?ʔ?(" .. vowels .. ")", "%1w%2"},
{"(" .. consonants .. ")i%sˈ?ʔ?(" .. vowels .. ")", "%1j%2"},
{"([mnŋ])(%sˈ?)βə", "%1%2bə"},
{"[mnŋ]%s(ˈ?[mpbβ])", "m %1"}, {"[mnŋ]%s(ˈ?v)", "ɱ %1"},
{"[mnŋ]%s(ˈ?[tdɾlsn])", "n %1"}, {"[mnŋ]%s(ˈ?[ʧʤ])", "n̠ %1"},
{"[mnŋ]%s(ˈ?[ŋkɡqƕy])", "ŋ %1"},
}
}


local function syllabify(term)
local function syllabify(term)
local syllable = "(" .. consonants .. "*" .. vowels .. "ː?" .. consonants .. "-)"
local first = term == "áxəpːi"
term = term:gsub("(" .. consonants .. ")ː", "%1.%1")
local last = (term == "kolán" or term == "türá")
term = term:gsub(syllable, ".%1.")
local syllable = "(" .. consonants .. "*)(" .. vowels .. "ː?)(" .. consonants .. "-)"
term = term:gsub("^%.", "")
term = term:gsub("%.$", "")
term = term:gsub("%.+", ".")
term = term:gsub("%.([nlɾs])([pβmtʧkxʷʞƕː])", "%1.%2")
term = gsub(term, syllable, "·%1%2%3·")
term = term:gsub("%.([tmnlɾs])$", "%1")
term = gsub(term, "", "")
term = term:gsub("%.(" .. consonants .. ")%.", "%1.")
term = gsub(term, "·$", "")
term = gsub(term, "··+", "·")
return term
term = gsub(term, "·(" .. consonants .. ")ː·", "%1·%1")
term = gsub(term, "q·q", "k·q")
term = gsub(term, "·(" .. consonants .. ")·", "%1·")
term = gsub(term, "·(" .. consonants .. ")(" .. consonants .. ")", "%1·%2")
term = gsub(term, "·([nslɾmt])$", "%1")
term = gsub(term, "·(" .. consonants .. ")ː·", "·%1")
local syllables = split(term, "·")
if first then
syllables[1] = "ˈ" .. syllables[1]
elseif last then
syllables[#syllables] = "ˈ" .. syllables[#syllables]
elseif #syllables > 1 then
syllables[#syllables - 1] = "ˈ" .. syllables[#syllables - 1] -- penultimate stress
end
return table.concat(syllables, "·")
end
end


Line 77: Line 109:
phonemic = syllabify(phonemic)
phonemic = syllabify(phonemic)
phonetic = phonemic
local phonetic = phonemic
--[[for _, rule in ipairs(phonetic_rules) do
phonetic = gsub(phonetic, rule[1], rule[2])
end]]
for _, rule in ipairs(last_rules) do
for _, rule in ipairs(phonetic_rules) do
phonemic = gsub(phonemic, rule[1], rule[2])
phonetic = gsub(phonetic, rule[1], rule[2])
phonetic = gsub(phonetic, rule[1], rule[2])
end
end
Line 100: Line 127:
end
end
return table.concat(phonemic, " "), table.concat(phonetic, " ")
local phonemicAll = table.concat(phonemic, " ")
local phoneticAll = table.concat(phonetic, " ")
for _, rule in ipairs(sandhi_rules) do
phoneticAll = gsub(phoneticAll, rule[1], rule[2])
end
for _, rule in ipairs(last_rules) do
phonemicAll = gsub(phonemicAll, rule[1], rule[2])
phoneticAll = gsub(phoneticAll, rule[1], rule[2])
end
return phonemicAll, phoneticAll
end
end


Line 112: Line 151:


local phonemic, phonetic = separate_word(term)
local phonemic, phonetic = separate_word(term)
local IPA_args = {{pron = '/' .. phonemic .. '/'}, {pron = '[' .. phonetic .. ']'}}
local IPA_args = {{pron = '[' .. phonetic .. ']'}}
if phonemic ~= phonetic then table.insert(IPA_args, 1, {pron = '/' .. phonemic .. '/'}) end


return "* " .. m_IPA.format_IPA_full(lang, IPA_args)
return "* " .. m_IPA.format_IPA_full({lang = lang, items = IPA_args})
end
end


return export
return export

Latest revision as of 18:07, 12 August 2024

Documentation for this module may be created at Module:kilta-pron/doc

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

local A = u(0x0301) -- COMBINING ACUTE
local D = u(0x0308) -- COMBINING DIAERESIS

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

local consonants = "[pβmtsnɾlʧkxqhyʤɡbvdƕ]"
local vowels = "[aeiouáéíóúəïüëæ]"

local export = {}

local function same(foo, bar)
	foo, bar = mw.ustring.toNFD(foo), mw.ustring.toNFD(bar) -- decompose diacritics
	foo, bar = match(foo, "^."), match(bar, "^.") -- sort out the letter
	return foo == bar and true or false
end

local phonemic_rules = {
	{"%-$", ""}, {"%-", " "},
	{"hw", "ƕ"}, {"kw", "q"}, {"ch", "ʧ"}, {"au", "ü"}, {"ai", "ï"}, {"h", "x"}, 
	
	{"v", "β"}, {"r", "ɾ"}, 
	{"ë", "ə"}, {"əə+", "əː"},
	
	{"kq", "qː"}, {"cʧ", "ʧː"}, {"(" .. consonants .. ")(" .. consonants .. ")",
		function(c1,c2) return same(c1,c2) and c1 .. "ː" or c1 .. c2 end},
}

local phonetic_rules = {
	{"a(·?ˈ?)([nm])", "æ%1%2"}, {"á(·?ˈ?)([nm])", "æː%1%2"},
	{"n(ː?·?ˈ?)([kxqƕ])", "ŋ%1%2"},
	{"([nŋm]·?)k", "%1ɡ"}, {"([nŋm]·?)q", "%1y"}, {"([nŋm]·?)p", "%1b"}, {"([nŋm]·?)ʧ", "%1ʤ"},
	{"([nŋm]·?)t", "%1d"}, 
	{"([nŋm])(ː?·?ˈ?)β", "%1%2b"},
	{"β([iíeé])", "v%1"},
	{"^(ˈ?)(" .. vowels .. ")", "%1ʔ%2"},
	{"ü", "aʊ̯"},
	{"ï", "aɪ̯"},
}

local deacuter = {
	["á"] = "a", ["é"] = "e", ["í"] = "i", ["ó"] = "o", ["ú"] = "u", 
}

local last_rules = {
	{"q", "kʷ"}, {"ƕ", "xʷ"}, {"y", "ɡʷ"},
	{"ʧ", "t͡ʃ"},
	{"ʤ", "d͡ʒ"},
	{"ü", "au̯"},
	{"ï", "ai̯"},
	{"[·%.]ˈ", "ˈ"}, {"·", "."}, {"([áéíóú])", function(v) return deacuter[v] .. "ː" end},
}

local sandhi_rules = {
	{"(" .. consonants .. ")u%sˈ?ʔ?(" .. vowels .. ")", "%1w%2"},
	{"(" .. consonants .. ")i%sˈ?ʔ?(" .. vowels .. ")", "%1j%2"},
	{"([mnŋ])(%sˈ?)βə", "%1%2bə"},
	{"[mnŋ]%s(ˈ?[mpbβ])", "m %1"}, {"[mnŋ]%s(ˈ?v)", "ɱ %1"},
	{"[mnŋ]%s(ˈ?[tdɾlsn])", "n %1"}, {"[mnŋ]%s(ˈ?[ʧʤ])", "n̠ %1"},
	{"[mnŋ]%s(ˈ?[ŋkɡqƕy])", "ŋ %1"},
}

local function syllabify(term)
	local first = term == "áxəpːi"
	local last = (term == "kolán" or term == "türá")
	local syllable = "(" .. consonants .. "*)(" .. vowels .. "ː?)(" .. consonants .. "-)"
	
	term = gsub(term, syllable, "·%1%2%3·")
	term = gsub(term, "^·", "")
	term = gsub(term, "·$", "")
	term = gsub(term, "··+", "·")
	
	term = gsub(term, "·(" .. consonants .. ")ː·", "%1·%1")
	term = gsub(term, "q·q", "k·q")
	term = gsub(term, "·(" .. consonants .. ")·", "%1·")
	term = gsub(term, "·(" .. consonants .. ")(" .. consonants .. ")", "%1·%2")
	term = gsub(term, "·([nslɾmt])$", "%1")
	term = gsub(term, "·(" .. consonants .. ")ː·", "·%1")
	
	local syllables = split(term, "·")
	
	if first then
		syllables[1] = "ˈ" .. syllables[1]
	elseif last then
		syllables[#syllables] = "ˈ" .. syllables[#syllables]
	elseif #syllables > 1 then
		syllables[#syllables - 1] = "ˈ" .. syllables[#syllables - 1] -- penultimate stress
	end
	
	return table.concat(syllables, "·")
end

function export.crux(term)
	term = mw.ustring.lower(term)
	local phonemic = term
	
	for _, rule in ipairs(phonemic_rules) do
		phonemic = gsub(phonemic, rule[1], rule[2])
	end
	
	phonemic = syllabify(phonemic)
	local phonetic = phonemic
	
	for _, rule in ipairs(phonetic_rules) do
		phonetic = gsub(phonetic, rule[1], rule[2])
	end
	
	return phonemic, phonetic
end

function separate_word(term)
	local phonemic, phonetic = {}, {}
	
	for word in gsplit(term, " ") do
		local phonemicEach, phoneticEach = export.crux(word)
		table.insert(phonemic, phonemicEach)
		table.insert(phonetic, phoneticEach)
	end
	
	local phonemicAll = table.concat(phonemic, " ")
	local phoneticAll = table.concat(phonetic, " ")
	
	for _, rule in ipairs(sandhi_rules) do
		phoneticAll = gsub(phoneticAll, rule[1], rule[2])
	end
	
	for _, rule in ipairs(last_rules) do
		phonemicAll = gsub(phonemicAll, rule[1], rule[2])
		phoneticAll = gsub(phoneticAll, rule[1], rule[2])
	end
	
	return phonemicAll, phoneticAll
end

function export.show(frame)
	local parent_args = frame:getParent().args
	local params = {
		[1] = { default = mw.title.getCurrentTitle().nsText == 'Template' and "kílta" or mw.title.getCurrentTitle().text },
	}
	local args = require("Module:parameters").process(parent_args, params)
	local term = args[1]

	local phonemic, phonetic = separate_word(term)
	
	local IPA_args = {{pron = '[' .. phonetic .. ']'}}
	
	if phonemic ~= phonetic then table.insert(IPA_args, 1, {pron = '/' .. phonemic .. '/'}) end

	return "* " .. m_IPA.format_IPA_full({lang = lang, items = IPA_args})
end

return export