Module:pine-pron: Difference between revisions

From Linguifex
Jump to navigation Jump to search
(Undo revision 478954 by Sware (talk))
No edit summary
 
(5 intermediate revisions by the same user not shown)
Line 12: Line 12:
local m_IPA = require("Module:IPA")
local m_IPA = require("Module:IPA")


local vowels_spelling = "aeiouyůảẻỉỏủỷv"
local vowels_spelling = "aeiouyůảẻỉỏủỷ"
local vowels = "[aɑæɔoʊuʏyɛœøiɪe]"
local vowels = "[aɑæɔoʊuʏyɛœøiɪe]"
local lazy_consonants = "[^" .. vowels_spelling .."]"
local lazy_consonants = "[^" .. vowels_spelling .."]"
Line 20: Line 20:
["y"] = "ʏ", ["i"] = "ɪ", ["e"] = "ɛ",
["y"] = "ʏ", ["i"] = "ɪ", ["e"] = "ɛ",
["u"] = "ʊ", ["o"] = "ɔ", ["a"] = "ɑ",
["u"] = "ʊ", ["o"] = "ɔ", ["a"] = "ɑ",
["ů"] = "œ"
}
}


local long_vowels = {
local long_vowels = {
["a"] = "æː", ["e"] = "eː", ["i"] = "iː",
["o"] = "oː", ["u"] = "uː", ["y"] = "yː",
["ả"] = "æː", ["ẻ"] = "eː", ["ỉ"] = "iː",
["ả"] = "æː", ["ẻ"] = "eː", ["ỉ"] = "iː",
["ỏ"] = "oː", ["ủ"] = "uː", ["ỷ"] = "yː",
["ỏ"] = "oː", ["ủ"] = "uː", ["ỷ"] = "yː",
Line 46: Line 45:
end
end
end
end


local export = {}
local export = {}


local word_internal_clusters = require("Module:table").listToSet({
function export.vowel_harmony(term)
"m·pp", "m·p", "m·b", "n·tt", "n·t", "n·d", "n·dv",
local polarity = {
"n·ts", "n·tsv", "n·tsġ", "n·tsġv", "n·ttṡ", "n·tṡ",
["au"] = "back", ["[ei]?u[oa]?"] = "back", ["o[ai]?"] = "back", ["[ủỏ]"] = "back",
"n·tṡv", "n·ƛƛ", "n·ƛ", "n·ƛv", "n·kk", "n·kkv", "n·k", "n·kv",
["a[iy]"] = "front", ["ey"] = "front", ["ů[aei]?"] = "front", ["[ei]ů"] = "front", ["[ủỷả]"] = "front"
"p·ṃ",
}
})
for pat, harmony in pairs(polarity) do
if find(term, pat) then return harmony end
end
return "neutral"
end


--[[m ṃ p b v
-- exportable to be used by [[Module:pine-noun]]
t d ḍ s ṡ ts tṡ r ṛ l ḷ ƛ lį ḷį n ṇ nį ṇį dn ng kn
function export.syllabify_from_spelling(term, is_ipa)
k g ġ h hį ḥ kṇ tġ]]
 
function export.syllabify_from_spelling(term)
local vowels = "[" .. vowels_spelling .. "]"
local vowels = "[" .. vowels_spelling .. "]"
local consonants = consonants_spelling --lazy_consonants
local consonants = consonants_spelling --lazy_consonants
Line 73: Line 74:
word = gsub(word, "·(" .. consonants .. ")(" .. consonants .. "+)", "%1·%2")
word = gsub(word, "·(" .. consonants .. ")(" .. consonants .. "+)", "%1·%2")
word = gsub(word, "(" .. consonants .. ")·%1", "·%1%1")
word = gsub(word, "(" .. consonants .. ")·%1", "·%1%1")
word = gsub(word, "(" .. vowels .. ")(" .. consonants .. ")·v(" .. vowels .. ")", "%1·%2v%3")
word = gsub(word, "(" .. vowels .. ")t·([ʦʧ])(" .. vowels .. ")", "%1·t%2%3")
words[i] = word
words[i] = word
end
end
return table.concat(words, " ")
term = table.concat(words, " ")
if not is_ipa then
term = gsub(term, "([ʦʧ])", {["ʦ"] = "ts", ["ʧ"] = "tṡ"})
end
return term
end
end


function export.crux(term)
function export.crux(term)
term = export.syllabify_from_spelling(term)
term = export.syllabify_from_spelling(term, true)
local debug_syllables = true
if debug_syllables then
return term
end
-- default to short lax vowels
-- default to short lax vowels
term = gsub(term, "[aeiouy]", laxen); term = gsub(term, "ů", "œ")
term = gsub(term, "[aeiouyů]", laxen)
-- long vowels
-- long vowels
local nfd_term = mw.ustring.toNFD(term)
term = gsub(term, "([ảẻỉỏủỷ])", long_vowels)
nfd_term = gsub(nfd_term, "([aeiouy])" .. c.hook, function(v)
return long_vowels[v] or long_vowels[v .. c.hook]
end)
term = mw.ustring.toNFC(nfd_term)
term = gsub(term, "ɔɑ", "ɑː"); term = gsub(term, "ɛœ", "øː")
term = gsub(term, "ɔɑ", "ɑː"); term = gsub(term, "ɛœ", "øː")
-- diphthongized vowels
-- diphthongized vowels
Line 112: Line 112:
term = gsub(term, "(.)%1", "%1ː"); term = gsub(term, "ng", "ŋː")
term = gsub(term, "(.)%1", "%1ː"); term = gsub(term, "ng", "ŋː")
-- final substitutions
local final_subs = {
local final_subs = {
["ʧ"] = "t͡ʃ",
["ʧ"] = "t͡ʃ",
Line 121: Line 120:
["ṇ"] = "n" .. c.ringbelow,
["ṇ"] = "n" .. c.ringbelow,
["ṛ"] = "r" .. c.ringbelow,
["ṛ"] = "r" .. c.ringbelow,
["·"] = ".",
}
}
term = gsub(term, "[ʧʦgƛṃṇṛ]", final_subs)
term = gsub(term, "[ʧʦgƛṃṇṛ·]", final_subs)
return term
return term

Latest revision as of 13:22, 27 November 2025



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 split = mw.text.split
local gsplit = mw.text.gsplit

local lang = require("Module:languages").getByCode("pine")
local c = require("Module:languages/data").chars
local m_IPA = require("Module:IPA")

local vowels_spelling = "aeiouyůảẻỉỏủỷ"
local vowels = "[aɑæɔoʊuʏyɛœøiɪe]"
local lazy_consonants = "[^" .. vowels_spelling .."]"
local consonants_spelling = "[rṛtįpsṡdḍgġhḥkḳlḷƛvbnṇmṃʧʦ]"

local laxen = {
	["y"] = "ʏ", ["i"] = "ɪ", ["e"] = "ɛ",
	["u"] = "ʊ", ["o"] = "ɔ", ["a"] = "ɑ",
	["ů"] = "œ"
}

local long_vowels = {
	["ả"] = "æː", ["ẻ"] = "eː", ["ỉ"] = "iː",
	["ỏ"] = "oː", ["ủ"] = "uː", ["ỷ"] = "yː",
}

-- version of gsub() that returns a 2nd argument boolean indicating whether
-- a substitution was made.
local function gsubb(term, foo, bar)
	local retval, nsubs = gsub(term, foo, bar)
	return retval, nsubs > 0
end

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

local export = {}

function export.vowel_harmony(term)
	local polarity = {
		["au"] = "back", ["[ei]?u[oa]?"] = "back", ["o[ai]?"] = "back", ["[ủỏ]"] = "back",
		["a[iy]"] = "front", ["ey"] = "front", ["ů[aei]?"] = "front", ["[ei]ů"] = "front", ["[ủỷả]"] = "front"
	}
	
	for pat, harmony in pairs(polarity) do
		if find(term, pat) then return harmony end
	end
	
	return "neutral"
end

-- exportable to be used by [[Module:pine-noun]]
function export.syllabify_from_spelling(term, is_ipa)
	local vowels = "[" .. vowels_spelling .. "]"
	local consonants = consonants_spelling --lazy_consonants
	
	term = gsub(term, "(t[sṡ])", {["ts"] = "ʦ", ["tṡ"] = "ʧ"})
	
	local words = split(term, "%s")
	for i, word in ipairs(words) do
		word = gsub(word, "(" .. consonants .. "*)(" .. vowels .. "+)(" .. consonants .. "*)", "%1%2·%3")
		word = gsub(word, "·(" .. consonants .. "?)$", "%1")
		word = gsub(word, "·(" .. consonants .. ")(" .. consonants .. "+)", "%1·%2")
		word = gsub(word, "(" .. consonants .. ")·%1", "·%1%1")
		word = gsub(word, "(" .. vowels .. ")(" .. consonants .. ")·v(" .. vowels .. ")", "%1·%2v%3")
		word = gsub(word, "(" .. vowels .. ")t·([ʦʧ])(" .. vowels .. ")", "%1·t%2%3")
		words[i] = word
	end
	
	term = table.concat(words, " ")
	
	if not is_ipa then
		term = gsub(term, "([ʦʧ])", {["ʦ"] = "ts", ["ʧ"] = "tṡ"})
	end
	
	return term
end

function export.crux(term)
	term = export.syllabify_from_spelling(term, true)
	
	-- default to short lax vowels
	term = gsub(term, "[aeiouyů]", laxen)
	-- long vowels
	term = gsub(term, "([ảẻỉỏủỷ])", long_vowels)
	term = gsub(term, "ɔɑ", "ɑː"); term = gsub(term, "ɛœ", "øː")
	-- diphthongized vowels
	term = gsub(term, "ʊɔ", "ʊu"); term = gsub(term, "œɑ", "øy"); term = gsub(term, "œɛ", "ʏy")
	-- labiodiphthongized vowels
	term = gsub(term, "vʏy", "ᶣy"); term = gsub(term, "vøy", "ᶣø"); term = gsub(term, "vʊu", "ʷu") -- different in eastern
	term = gsub(term, "^ᶣ", "ɥ"); term = gsub(term, "^ʷ", "w")
	-- diphthongs
	term = gsub(term, "([ɛɑ])ʏ", "%1y"); term = gsub(term, "ɑy", "æy")
	term = gsub(term, "([ɛɑɪ]ʊ)", "%1u"); term = gsub(term, "ɪœ", "ɪy")
	
	-- simple consonant subtitutions
	term = gsub(term, "ṡ", "ʃ")
	term = gsub(term, "ḷ", "ɬ"); term = gsub(term, "ḥ", "ʔ"); 
	
		-- geminate consonants
	term = gsub(term, "(.)%1", "%1ː"); term = gsub(term, "ng", "ŋː")
	
	local final_subs = {
		["ʧ"] = "t͡ʃ",
		["ʦ"] = "t͡s",
		["g"] = "ɡ",
		["ƛ"] = "t͡ɬ",
		["ṃ"] = "m" .. c.ringbelow,
		["ṇ"] = "n" .. c.ringbelow,
		["ṛ"] = "r" .. c.ringbelow,
		["·"] = ".",
	}
	
	term = gsub(term, "[ʧʦgƛṃṇṛ·]", final_subs)
	
	return term
end

function export.show(frame)
	local parent_args = frame:getParent().args
	local params = {
		[1] = { default = mw.title.getCurrentTitle().nsText == 'Template' and "Niṡkullit" or mw.title.getCurrentTitle().text },
	}
	local args = require("Module:parameters").process(parent_args, params)
	local term = mw.ustring.lower(args[1])
	
	local pronunciations = {
		{pron = "[" .. export.crux(term) .. "]"}
	}

	return "* " .. m_IPA.format_IPA_full{lang = lang, items = pronunciations}
end

return export