This is a private module sandbox of Thadh, for their own experimentation. Items in this module may be added and removed at Thadh's discretion; do not rely on this module's stability.
local export = {}
local m_IPA = require("Module:IPA")
local lang = require("Module:languages").getByCode("et")
local A = mw.ustring.char(0x002A) -- halflength marker (asterisk)
local C = "" -- consonants
local D = mw.ustring.char(0x0308) -- centralisation marker (diaeresis)
local L = "" -- length markers
local R = mw.ustring.char(0x0325) -- voicelessness marker (ring below)
local S = mw.ustring.char(0x032F) -- diphthong marker
local T = mw.ustring.char(0x031E) -- lowering marker (downtack)
local V = "" -- vowels
local phon = {
-- consonants
="b̥", ="d̥", ="ɡ̊",
="p", ="t", ="k",
="v", ="ʒ",
="f", ="ʃ",
="ʲ",
-- vowels
="ɑ", ="e", ="i",
="o", ="u", ="æ",
="ɤ", ="ø", ="y",
}
local function phonemic(text)
-- general phonology
text = mw.ustring.gsub(text, '.', phon)
-- long consonants
text = mw.ustring.gsub(text, "()" .. A, "%1")
text = mw.ustring.gsub(text, "(" .. C .. ")" .. L .. "?%1", "%1ː")
text = mw.ustring.gsub(text, "(" .. C .. ")" .. L .. "?" .. A, "%1ˑ")
-- palatalised long consonants
text = mw.ustring.gsub(text, "(" .. C .. ")(" .. L .. ")ʲ", "%1ʲ%2")
-- long vowels
text = mw.ustring.gsub(text, "(" .. V .. ")%1", "%1ː")
text = mw.ustring.gsub(text, "(" .. V .. ")" .. A, "%1ˑ")
-- üüV
text = mw.ustring.gsub(text, "y" .. L .. "(" .. V .. ")", "yij%1")
-- diphthongs
text = mw.ustring.gsub(text, "()()", "%1%2" .. S)
text = mw.ustring.gsub(text, "æ()", "æ%1" .. S)
text = mw.ustring.gsub(text, "ø()", "ø%1" .. S)
text = mw.ustring.gsub(text, "y()", "y%1" .. S)
-- stress
if mw.ustring.find(text, "ˈ") == nil then
text = "ˈ" .. text
text = mw.ustring.gsub(text, "+", "ˌ")
end
text = mw.ustring.gsub(text, "(" .. L .. ")" .. L, "%1")
return text
end
local function phonetic(text)
-- palatalisation
text = mw.ustring.gsub(text, "()%f", "%1ʲ")
-- velar nasal
text = mw.ustring.gsub(text, "n%f", "ŋ")
-- glide insertion
text = mw.ustring.gsub(text, "(" .. V .. ")i(" .. V .. ")", "%1ij%2")
text = mw.ustring.gsub(text, "(" .. V .. ")u(" .. V .. ")", "%1uw%2")
-- flash forward to after phonemic transcription
text = phonemic(text)
-- optional initial h-
text = mw.ustring.gsub(text, "^ˈh", "ˈ(h)")
-- h-voicing
text = mw.ustring.gsub(text, "(" .. V .. S .. "?)h(" .. V .. ")", "%1ɦ%2")
-- short gemination
text = mw.ustring.gsub(text, "(" .. V .. S .. "?)(ʲ?)(" .. V .. ")", "%1%2ˑ%3")
text = mw.ustring.gsub(text, "(ʲ?)$", "%1ˑ")
text = mw.ustring.gsub(text, "(ʲ?)()", "%1ˑ%2")
text = mw.ustring.gsub(text, "(" .. R .. "?" .. L .. "?)(ʲ?)ˑ", "%1%2")
-- final devoicing
text = mw.ustring.gsub(text, "b̥$", "p")
text = mw.ustring.gsub(text, "d̥$", "t")
text = mw.ustring.gsub(text, "ɡ̊$", "k")
text = mw.ustring.gsub(text, "(ʲ?)()$", "%1ˑ%2" .. R)
-- vowel articulation
text = mw.ustring.gsub(text, "e$", "e" .. T)
text = mw.ustring.gsub(text, "jɑ", "jɑ" .. D)
text = mw.ustring.gsub(text, "ɑj", "ɑ" .. D .. "j")
text = mw.ustring.gsub(text, "ju", "ju" .. D)
text = mw.ustring.gsub(text, "uj", "u" .. D .. "j")
return text
end
function export.IPA(frame)
local emic = {}
local etic = {}
for _, word in ipairs(frame:getParent().args) do
table.insert(emic, word)
table.insert(etic, word)
end
if #emic == 0 then
emic = {mw.title.getCurrentTitle().text}
etic = {mw.title.getCurrentTitle().text}
end
for key, word in ipairs(emic) do
emic = phonemic(word)
etic = phonetic(word)
end
-- hardcoding this because I'm not that good at Lua
if #emic <= 1 then
return m_IPA.format_IPA_full {
lang = lang,
items = {
{ pron = "/" .. table.concat(emic) .. "/" },
{ pron = "" }
},
}
elseif #emic == 2 then
return m_IPA.format_IPA_full {
lang = lang,
items = {
{ pron = "/" .. emic .. "/" },
{ pron = " .. "]" },
{ pron = "/" .. emic .. "/" },
{ pron = " .. "]" },
},
}
end
end
return export