Module:bn-IPA

local export = {}

local lang = require("Module:languages").getByCode("bn") local sc = require("Module:scripts").getByCode("Beng") local m_IPA = require("Module:IPA") local m_a = require("Module:accent qualifier")

local gsub = mw.ustring.gsub local gmatch = mw.ustring.gmatch local find = mw.ustring.find

local correspondences = { ["ṅ"] = "ŋ", ["g"] = "ɡ", ["c"] = "t͡ʃ", ["j"] = "d͡ʒ", ["ṭ"] = "ʈ", ["ḍ"] = "ɖ", ["t"] = "t̪", ["d"] = "d̪", ["y"] = "e̯", ["r"] = "ɾ", ["l"] = "l", ["ś"] = "ʃ", ["h"] = "h", ["ḥ"] = "h", ["ṛ"] = "ɽ",

["y"] = "e̯", ["w"] = "o̯",

["o"] = "ɔ", ["ô"] = "ɔ", ["ī"] = "i", ["ō"] = "o", ["ū"] = "u", ["ê"] = "æ",

["õ"] = "ɔ̃", ["ō̃"] = "õ", ["ī̃"] = "ĩ", ["ū̃"] = "ũ", ["ễ"] = "æ̃", }

local dhaka = { ["c"] = "ṯɕ",	["ch"] = "ṯɕʰ", ["j"] = "ḏʑ", ["jh"] = "ḏʑʱ", ["r"] = "ɹ", ["ṛ"] = "ɹ", ["ṛh"] = "ɹ",

["e"] = "e", ["ê"] = "ɛ", ["õ"] = "ɔ", ["ō̃"] = "o", ["ĩ"] = "i", ["ũ"] = "u", ["ẽ"] = "e", ["ễ"] = "ɛ", ["ã"] = "a", }

local vanga = { ["c"] = "ts", ["ch"] = "s", ["j"] = "dz", ["jh"] = "z", ["f"] = "ɸ", ["r"] = "ɾ", ["ṛ"] = "ɾ", ["ṛh"] = "ɾ",

["e"] = "ɛ", ["ê"] = "ɛ", ["õ"] = "ɔ", ["ō̃"] = "o", ["ĩ"] = "i", ["ũ"] = "u", ["ẽ"] = "ɛ", ["ễ"] = "ɛ", ["ã"] = "a", }

local eastern_vanga= { ["c"] = "s", ["ch"] = "s", ["j"] = "z", ["jh"] = "z", ["k"] = "x", ["kh"] = "x", ["p"] = "ɸ", ["f"] = "ɸ", ["r"] = "ɹ", ["ṛ"] = "ɹ", ["ṛh"] = "ɹ", }

local varendra = { ["c"] = "s", ["ch"] = "ts", ["j"] = "z", ["jh"] = "dz", ["ṛ"] = "ɾ", ["ṛh"] = "ɾ", }

local vowels = "aiuoōêɔɔ̃ɛeææ̃ãễẽĩõō̃ũ" local vowel = "[aiuoōêɔɔ̃ɛeææ̃ãễẽĩõō̃ũ]" local consonants = "[bcdd̪ḍɖfgjklmnṇprṛɾsṣśs̪ʃɕtt̪ṭʈzz̪ʑ]" local weak = "([gjdḍbṛʑ])" local aspirate = "([kctṭpɕ])"

local function find_consonants(text) local current = "" local cons = {} for cc in mw.ustring.gcodepoint(text .. " ") do		local ch = mw.ustring.char(cc) if find(current .. ch, "^[kgṅcjñṭḍṇṁtdnpbmyrlvśṣshṛz]$") or find(current .. ch, "^[kgcjṭḍṇtdpbṛ]h$") then current = current .. ch		else table.insert(cons, current) current = ch		end end return cons end

local identical = "knlsfz" for character in gmatch(identical, ".") do	correspondences[character] = character end

local function transliterate(text) return (lang:transliterate(text)) end

function export.link(term) return require("Module:links").full_link{ term = term, lang = lang, sc = sc } end

function export.toIPA(text, style) local translit = text if lang:findBestScript(text):isTransliterated then translit = transliterate(text) end if not translit then error('The term "' .. text .. '" could not be transliterated.') end

-- metathesis (Chatterji, 1921) translit = gsub(translit, "(" .. vowel .. ")hl", "%1lh") translit = gsub(translit, "(" .. vowel .. ")hm", "%1mh") translit = gsub(translit, "(" .. vowel .. ")hn", "%1nh")

-- suppressing the above metathesis translit = gsub(translit, "h'l", "hl") translit = gsub(translit, "h'm", "hm") translit = gsub(translit, "h'n", "hn")

-- some workarounds since Module:bn-translit is locked translit = gsub(translit, "ph", "f") translit = gsub(translit, "v", "bh") translit = gsub(translit, "ẏ", "y") translit = gsub(translit, "ẇ", "w")

-- vowel harmony translit = gsub(translit, "o([bd̪hlmnrṛɹt̪])([iu])", "ó%1%2") -- Chatterji, 1926 translit = gsub(translit, "o([bd̪hlnrṛɹt̪])o", "o%1ó") translit = gsub(translit, "ḍḍo", "ḍḍó") translit = gsub(translit, "ṭṭo", "ṭṭó") translit = gsub(translit, "ho$", "hó") translit = gsub(translit, "(" .. vowel .. ")h$", "%1") translit = gsub(translit, "(" .. vowel .. ")h ", "%1 ")

translit = gsub(translit, "oi", "ói") translit = gsub(translit, "ou", "óu")

translit = gsub(translit, "^(".. consonants .. ")o$", "%1ô") translit = gsub(translit, "o$", "ó") translit = gsub(translit, "õ$", "ó̃")

translit = gsub(translit, "pro", "pró") translit = gsub(translit, "(" .. vowel .. ")(" .. consonants .. "h?)om$", "%1%2óm") translit = gsub(translit, "bon$", "bón") translit = gsub(translit, "ron$", "rón")

translit = gsub(translit, "^(".. consonants .. ")o ", "%1ô ") translit = gsub(translit, " (".. consonants .. ")o$", " %1ô")

translit = gsub(translit, "o ", "ó ") translit = gsub(translit, "õ ", "ó̃ ")

translit = gsub(translit, "(" .. vowel .. ")(" .. consonants .. "h?)om ", "%1%2óm ") translit = gsub(translit, "bon ", "bón ") translit = gsub(translit, "ron ", "rón ")

translit = gsub(translit, "^o", "ô") translit = gsub(translit, " o", " ô")

translit = gsub(translit, "([lmn])ho", "%1hó")

if style == "formal" then translit = gsub(translit, "ó", "ō") end

if style == "desanskritized" then translit = gsub(translit, "ó", "ō") translit = gsub(translit, "ṛh", "ṛ") end

if style == "colloquial" then translit = gsub(translit, "ó", "ō") translit = gsub(translit, "lh", "ll") -- Chatterji translit = gsub(translit, "mh", "mm") -- Chatterji translit = gsub(translit, "nh", "nn") -- Chatterji translit = gsub(translit, "ṛ", "r") translit = gsub(translit, "ṛh", "r") translit = gsub(translit, "śt", "st") translit = gsub(translit, "sṭ", "śṭ") end

if style == "dhaka" then translit = gsub(translit, "ó", "ō") translit = gsub(translit, "([cjrṛ]h?)", dhaka) translit = gsub(translit, "(" .. vowel .. ")", dhaka) translit = gsub(translit, "ó̃", "ō") end

if style == "dhaka_colloquial" then translit = gsub(translit, "ó", "ō") translit = gsub(translit, "lh", "ll") translit = gsub(translit, "mh", "mm") translit = gsub(translit, "nh", "nn") translit = gsub(translit, "śt", "st") translit = gsub(translit, "sṭ", "śṭ")

translit = gsub(translit, "([cjprṛ]h?)", dhaka) translit = gsub(translit, "(" .. vowel .. ")", dhaka) translit = gsub(translit, "ō̃", "ō") end

if style == "vanga" then translit = gsub(translit, "ó", "ô") translit = gsub(translit, "([cfjprṛ]h?)", vanga) translit = gsub(translit, "(" .. vowel .. ")", vanga) translit = gsub(translit, "śt", "st") translit = gsub(translit, "sṭ", "śṭ") end

if style == "eastern_vanga" then translit = gsub(translit, "ó", "ô") translit = gsub(translit, "([cfjkprṛ]h?)", eastern_vanga) translit = gsub(translit, "(" .. vowel .. ")", vanga) translit = gsub(translit, "śt", "st") translit = gsub(translit, "sṭ", "śṭ") end

if style == "varendra" then translit = gsub(translit, "ó", "ô") translit = gsub(translit, "śt", "st") translit = gsub(translit, "sṭ", "śṭ") translit = gsub(translit, "([cjṛ]h?)", varendra) end

-- vowels translit = gsub(translit, "%-$", "") translit = gsub(translit, "^%-", "") translit = gsub(translit, ",", "") translit = gsub(translit, " ", "..") translit = gsub(translit, "%.ː", "ː.") translit = gsub(translit, "%.̃", "̃")

translit = gsub(translit, "ay([eiu])", "a%1") translit = gsub(translit, "ey([aioōu])", "e%1") translit = gsub(translit, "êy([aeioōu])", "ê%1") translit = gsub(translit, "iy([aeoōu])", "i%1") translit = gsub(translit, "ĩy([aeoōu])", "ĩ%1") translit = gsub(translit, "ito$", "itō") translit = gsub(translit, "oy([eiōu])", "o%1") translit = gsub(translit, "õy([eiōu])", "õ%1") translit = gsub(translit, "ōw([aeoōu])", "ō%1") translit = gsub(translit, "ō̃w([aeoōu])", "ō̃%1") translit = gsub(translit, "uy([aeioō])", "u%1") translit = gsub(translit, "ũy([aeioō])", "ũ%1")

local consonants_no_h = "[b-df-gj-np-tv-zśṣʃʒ]"

translit = gsub(translit, aspirate .. "h", '%1ʰ') translit = gsub(translit, weak .. "h", '%1ʱ')

translit = gsub(translit, "([kgcjṭḍtdpb])'h", "%1h")

if style == "colloquial" then translit = gsub(translit, aspirate .. "h", '%1ʰ') translit = gsub(translit, weak .. "h", '%1ʱ') end

local result = gsub(translit, ".", correspondences)

result = gsub(result, "%.?%-", ".")

result = gsub(result, "%.%.", "‿")

if style == "dhaka" then result = gsub(result, "ḏʑ", "dʑ") result = gsub(result, "ɖ", "d") -- Khan, 2010 result = gsub(result, "ṯɕ", "tɕ") result = gsub(result, "ʈ", "t") -- Khan, 2010 end

if style == "dhaka_colloquial" then result = gsub(result, "ḏʑ", "dʑ") result = gsub(result, "ɖ", "d") -- Khan, 2010 result = gsub(result, "ṯɕ", "tɕ") result = gsub(result, "ʈ", "t") -- Khan, 2010 end

if style == "vanga" then result = gsub(result, "ɖ", "d") result = gsub(result, "ʈ", "t") end

if style == "vanga_colloquial" then result = gsub(result, "ɖ", "d") result = gsub(result, "ʈ", "t") end

if style == "eastern_vanga" then result = gsub(result, "ɖ", "d") result = gsub(result, "ʈ", "t") end

if style == "eastern_vanga_colloquial" then result = gsub(result, "ɖ", "d") result = gsub(result, "ʈ", "t") end

-- formatting result = gsub(result, "ː̃", "̃ː") result = gsub(result, "ː%.̃", "̃ː.") result = gsub(result, "%.$", "")

result = gsub(result, "^ɾ", "r")

-- force final ɔe̯ result = gsub(result, "([ʒm])oe̯$", "%1ɔe̯")

result = gsub(result, "d̪ʑ", "dʑ") result = gsub(result, "t̪ɕ", "tɕ")

-- gemination result = gsub(result, "bb(ʱ?)", "b%1ː") result = gsub(result, "dd(ʱ?)", "d%1ː") result = gsub(result, "d͡d͡ʒʒ(ʱ?)", "d͡ʒ%1ː") result = gsub(result, "dʑdʑ(ʱ?)", "dʑ%1ː") result = gsub(result, "d̪d̪(ʱ?)", "d̪%1ː") result = gsub(result, "ɖɖ(ʱ?)", "ɖ%1ː")

result = gsub(result, "ff", "fː") result = gsub(result, "ɡɡ(ʱ?)", "ɡ%1ː")

result = gsub(result, "kk(ʰ?)", "k%1ː") result = gsub(result, "ll", "lː")

result = gsub(result, "mm", "mː") result = gsub(result, "nn", "nː")

result = gsub(result, "nd(ʱ?)ː", "nd%1") result = gsub(result, "nd͡ʒ(ʱ?)ː", "nd͡ʒ%1") result = gsub(result, "nd̪(ʱ?)ː", "nd̪%1") result = gsub(result, "nɖ(ʱ?)ː", "nɖ%1") result = gsub(result, "nt(ʰ?)ː", "nt%1") result = gsub(result, "nt͡ʃ(ʰ?)ː", "nt͡ʃ%1") result = gsub(result, "nt̪(ʰ?)ː", "nt̪%1") result = gsub(result, "nʈ(ʰ?)ː", "nʈ%1") result = gsub(result, "ŋɡ(ʱ?)ː", "ŋɡ%1") result = gsub(result, "ŋɡ$", "ŋ") result = gsub(result, "ŋɡ ", "ŋ ") result = gsub(result, "ŋk(ʰ?)ː", "ŋk%1")

result = gsub(result, "pp(ʰ?)", "p%1ː")

result = gsub(result, "ɾɾ", "ɾ") result = gsub(result, "ɹɹ", "ɹ")

result = gsub(result, "ʃʃ", "ʃː") result = gsub(result, "ss", "sː") result = gsub(result, "tt(ʰ?)", "t%1ː") result = gsub(result, "t͡ʃt͡ʃ(ʰ?)", "t͡ʃ%1ː") result = gsub(result, "tɕtɕ(ʰ?)", "tɕ%1ː") result = gsub(result, "t̪t̪(ʰ?)", "t̪%1ː") result = gsub(result, "ʈʈ(ʰ?)", "ʈ%1ː")

result = gsub(result, "a([eou])", "a%1̯") result = gsub(result, "iu", "iu̯") result = gsub(result, "i(" .. vowel .. ")", "i̯%1") result = gsub(result, "i̯u̯", "iu̯") result = gsub(result, "oa", "o̯a") result = gsub(result, "ɔe̯ɔ", "ɔe̯o") result = gsub(result, "ɔo", "ɔo̯") result = gsub(result, "o([iu])", "o%1̯") result = gsub(result, "u(" .. vowel .. ")", "u̯%1")

result = gsub(result, "([aeou])i", "%1i̯")

result = gsub(result, "^ui̯", "u̯i")

result = gsub(result, "([eiou])̯̯", "%1̯")

return result end

function export.narrow_IPA(ipa) local vowel = "[aiuoêɔɔ̃ɛeææ̃ãẽĩõũ]" local consonants = "[bβcdd̪ɖfɸgɦjklmnprṛɾsśs̪ʃɕtt̪ʈvzz̪ʑ]"

-- word-final deaspiration ipa = gsub(ipa, "bʱ$", "b") ipa = gsub(ipa, "ɖʱ$", "ɖ") ipa = gsub(ipa, "d͡ʒʱ$", "d͡ʒ") ipa = gsub(ipa, "dʑʱ$", "dʑ") ipa = gsub(ipa, "d̪ʱ$", "d̪") ipa = gsub(ipa, "ɡʱ$", "ɡ") ipa = gsub(ipa, "kʰ$", "k") ipa = gsub(ipa, "pʰ$", "p") ipa = gsub(ipa, "ʈʰ$", "ʈ") ipa = gsub(ipa, "t͡ʃʰ$", "t͡ʃ") ipa = gsub(ipa, "tɕʰ$", "tɕ") ipa = gsub(ipa, "t̪ʰ$", "t̪")

-- deaspiration before t̪	ipa = gsub(ipa, "kʰt̪", "kt̪") ipa = gsub(ipa, "pʰt̪", "pt̪")

-- regressive assimilation ipa = gsub(ipa, "kz", "ɡz") ipa = gsub(ipa, "kd͡ʒ", "ɡd͡ʒ") ipa = gsub(ipa, "kdʑ", "ɡdʑ")

ipa = gsub(ipa, "b‿p", "pː") ipa = gsub(ipa, "d‿t", "tː") ipa = gsub(ipa, "d͡ʒ‿t͡ʃ", "t͡ʃː") ipa = gsub(ipa, "d̪‿t̪", "t̪ː") ipa = gsub(ipa, "f‿b", "bː") ipa = gsub(ipa, "ɡ‿k", "kː") ipa = gsub(ipa, "k‿ɡ", "ɡː") ipa = gsub(ipa, "p‿b", "bː") ipa = gsub(ipa, "t‿d", "dː") ipa = gsub(ipa, "t͡ʃ‿d͡ʒ", "d͡ʒː") ipa = gsub(ipa, "t̪‿d̪", "d̪ː") ipa = gsub(ipa, "sː([t̪d̪])", "s̪%1")

ipa = gsub(ipa, "d͡ʒ(‿?)([d̪t̪])", "z̪%2") ipa = gsub(ipa, "d͡ʒʱ(‿?)([d̪t̪])", "z̪%2") ipa = gsub(ipa, "dʑ(‿?)([d̪t̪])", "z̪%2") ipa = gsub(ipa, "dʑʱ(‿?)([d̪t̪])", "z̪%2")

ipa = gsub(ipa, "^(" .. consonants .. ")ɾ(" .. vowel .. ")(" .. consonants .. ")ɾ", "%1ɾ%2%3ː") -- R syncope ipa = gsub(ipa, "([ɖd̪ʈt̪])([lɾɹ])", "%1ː%2")

-- intervocalic e̯ ipa = gsub(ipa, "(" .. vowel .. ")‿(" .. vowel .. ")", "%1e̯%2")

ipa = gsub(ipa, "‿", "")

-- long vowels ipa = gsub(ipa, "^(" .. vowel .. ")(" .. consonants .. ")$", "%1ː%2") ipa = gsub(ipa, "^(" .. consonants .. "ʰ?)(" .. vowel .. ")$", "%1%2ː") ipa = gsub(ipa, "^(" .. consonants .. "ʱ)(" .. vowel .. ")$", "%1%2ː") ipa = gsub(ipa, "^(" .. consonants .. ")(" .. consonants .. "ʰ?)(" .. vowel .. ")$", "%1%2%3ː") ipa = gsub(ipa, "^(" .. consonants .. ")(" .. consonants .. "ʱ)(" .. vowel .. ")$", "%1%2%3ː") ipa = gsub(ipa, "^(" .. consonants .. ")(" .. consonants .. ")(" .. consonants .. "ʰ?)(" .. vowel .. ")$", "%1%2%3%4ː") ipa = gsub(ipa, "^(" .. consonants .. ")(" .. consonants .. ")(" .. consonants .. "ʱ)(" .. vowel .. ")$", "%1%2%3%4ː") ipa = gsub(ipa, "^(" .. consonants .. "ʰ?)(" .. vowel .. ")(" .. consonants .. ")$", "%1%2ː%3") ipa = gsub(ipa, "^(" .. consonants .. "ʱ)(" .. vowel .. ")(" .. consonants .. ")$", "%1%2ː%3") ipa = gsub(ipa, "^(" .. consonants .. ")(" .. consonants .. "ʰ?)(" .. vowel .. ")(" .. consonants .. ")$", "%1%2%3ː%4")

-- half-long vowels ipa = gsub(ipa, "(" .. vowel .. ")$", "%1ˑ") ipa = gsub(ipa, "(" .. vowel .. ") ", "%1ˑ ")

-- dental and retroflex laterals ipa = gsub(ipa, "l([t̪d̪])", "l̪%1") ipa = gsub(ipa, "l([ʈɖ])", "ɭ%1")

-- dental and retroflex nasals ipa = gsub(ipa, "n([t̪d̪])", "n̪%1") ipa = gsub(ipa, "n̪([td])", "n%1") ipa = gsub(ipa, "n([ʈɖ])", "ɳ%1")

-- dental and retroflex sibilants ipa = gsub(ipa, "s([t̪d̪])", "s̪%1") ipa = gsub(ipa, "([t̪d̪])s", "%1s̪") ipa = gsub(ipa, "s̪([td])", "s%1") ipa = gsub(ipa, "([td])s̪", "%1s")

ipa = gsub(ipa, "z([t̪d̪])", "z̪%1") ipa = gsub(ipa, "([t̪d̪])z", "%1z̪") ipa = gsub(ipa, "z̪([td])", "z%1") ipa = gsub(ipa, "([td])z̪", "%1z") ipa = gsub(ipa, "ʃ([ʈɖ])", "ʂ%1")

-- initial stress ipa = gsub(ipa, "^(" .. vowel .. ")", "ˈ%1") ipa = gsub(ipa, "^(" .. consonants .. ")", "ˈ%1")

return ipa end

local function colloquial_narrow_IPA(ipa) local vowel = "[aiuoêɔɔ̃ɛeææ̃ãẽĩõũ]" local consonants = "[bβcdd̪ɖfɸgɦjklmnprṛɾsśs̪ʃɕtt̪ʈvzz̪ʑ]"

-- initial stress ipa = gsub(ipa, "^(" .. vowel .. ")", "ˈ%1") ipa = gsub(ipa, "^(" .. consonants .. ")", "ˈ%1")

ipa = gsub(ipa, "bʱ", "v") ipa = gsub(ipa, "^v", "bʱ") ipa = gsub(ipa, " v", " bʱ")

-- word-final deaspiration ipa = gsub(ipa, "ɖʱ$", "ɖ") ipa = gsub(ipa, "d͡ʒʱ$", "d͡ʒ") ipa = gsub(ipa, "dʑʱ$", "dʑ") ipa = gsub(ipa, "d̪ʱ$", "d̪") ipa = gsub(ipa, "ɡʱ$", "ɡ") ipa = gsub(ipa, "kʰ$", "x") ipa = gsub(ipa, "ʈʰ$", "ʈ") ipa = gsub(ipa, "t͡ʃʰ$", "t͡ʃ") ipa = gsub(ipa, "tɕʰ$", "tɕ") ipa = gsub(ipa, "t̪ʰ$", "t̪")

-- deaspiration before t̪	ipa = gsub(ipa, "kʰt̪", "xt̪")

-- regressive assimilation ipa = gsub(ipa, "kd͡ʒ", "ɡd͡ʒ") ipa = gsub(ipa, "kdʑ", "ɡdʑ")

ipa = gsub(ipa, "b‿p", "pː") ipa = gsub(ipa, "d([ʱ?])‿t", "tː") ipa = gsub(ipa, "d͡ʒ([ʱ?])‿t͡ʃ", "t͡ʃː") ipa = gsub(ipa, "d̪([ʱ?])‿t̪", "t̪ː") ipa = gsub(ipa, "f‿b", "bː") ipa = gsub(ipa, "ɡ([ʱ?])‿k", "kː") ipa = gsub(ipa, "k([ʰ?])‿ɡ", "ɡː") ipa = gsub(ipa, "p‿b", "bː") ipa = gsub(ipa, "t([ʰ?])‿d", "dː") ipa = gsub(ipa, "t͡ʃ([ʰ?])‿dʒ", "dʒː") ipa = gsub(ipa, "t̪([ʰ?])‿d̪", "d̪ː") ipa = gsub(ipa, "v‿p", "pː") ipa = gsub(ipa, "sː([t̪d̪])", "s̪%1")

ipa = gsub(ipa, "dʒ(‿?)([d̪t̪])", "z̪%2") ipa = gsub(ipa, "dʒʱ(‿?)([d̪t̪])", "z̪%2") ipa = gsub(ipa, "dʑ(‿?)([d̪t̪])", "z̪%2") ipa = gsub(ipa, "dʑʱ(‿?)([d̪t̪])", "z̪%2")

ipa = gsub(ipa, "^(" .. consonants .. ")ɾ(" .. vowel .. ")(" .. consonants .. ")ɾ", "%1ɾ%2%3ː") -- R syncope ipa = gsub(ipa, "([ɖd̪ʈt̪])([lɾɹ])", "%1ː%2")

-- intervocalic e̯ ipa = gsub(ipa, "(" .. vowel .. ")‿(" .. vowel .. ")", "%1e̯%2")

ipa = gsub(ipa, "‿", "")

-- long vowels ipa = gsub(ipa, "^(" .. vowel .. ")(" .. consonants .. ")$", "%1ː%2") ipa = gsub(ipa, "^(" .. consonants .. "ʰ?)(" .. vowel .. ")$", "%1%2ː") ipa = gsub(ipa, "^(" .. consonants .. "ʱ)(" .. vowel .. ")$", "%1%2ː") ipa = gsub(ipa, "^(" .. consonants .. ")(" .. consonants .. "ʰ?)(" .. vowel .. ")$", "%1%2%3ː") ipa = gsub(ipa, "^(" .. consonants .. ")(" .. consonants .. "ʱ)(" .. vowel .. ")$", "%1%2%3ː") ipa = gsub(ipa, "^(" .. consonants .. ")(" .. consonants .. ")(" .. consonants .. "ʰ?)(" .. vowel .. ")$", "%1%2%3%4ː") ipa = gsub(ipa, "^(" .. consonants .. ")(" .. consonants .. ")(" .. consonants .. "ʱ)(" .. vowel .. ")$", "%1%2%3%4ː") ipa = gsub(ipa, "^(" .. consonants .. "ʰ?)(" .. vowel .. ")(" .. consonants .. ")$", "%1%2ː%3") ipa = gsub(ipa, "^(" .. consonants .. "ʱ)(" .. vowel .. ")(" .. consonants .. ")$", "%1%2ː%3") ipa = gsub(ipa, "^(" .. consonants .. ")(" .. consonants .. "ʰ?)(" .. vowel .. ")(" .. consonants .. ")$", "%1%2%3ː%4")

-- half-long vowels ipa = gsub(ipa, "(" .. vowel .. ")$", "%1ˑ") ipa = gsub(ipa, "(" .. vowel .. ") ", "%1ˑ ")

-- dental and retroflex laterals ipa = gsub(ipa, "l([t̪d̪])", "l̪%1") ipa = gsub(ipa, "l([ʈɖ])", "ɭ%1")

-- dental and retroflex nasals ipa = gsub(ipa, "n([t̪d̪])", "n̪%1") ipa = gsub(ipa, "n̪([td])", "n%1") ipa = gsub(ipa, "n([ʈɖ])", "ɳ%1")

-- dental and retroflex sibilants ipa = gsub(ipa, "s([t̪d̪])", "s̪%1") ipa = gsub(ipa, "([t̪d̪])s", "%1s̪") ipa = gsub(ipa, "s̪([td])", "s%1") ipa = gsub(ipa, "([td])s̪", "%1s")

ipa = gsub(ipa, "z([t̪d̪])", "z̪%1") ipa = gsub(ipa, "([t̪d̪])z", "%1z̪") ipa = gsub(ipa, "z̪([td])", "z%1") ipa = gsub(ipa, "([td])z̪", "%1z")

ipa = gsub(ipa, "ʃ([td])", "s%1") ipa = gsub(ipa, "ʃ([ʈɖ])", "ʂ%1")

-- initial stress ipa = gsub(ipa, "^(" .. vowel .. ")", "ˈ%1") ipa = gsub(ipa, "^(" .. consonants .. ")", "ˈ%1")

return ipa end

local function vanga_narrow_IPA(ipa) local vowel = "[aiuoêɔɔ̃ɛeææ̃ãẽĩõũ]" local consonants = "[bβcdd̪ɸgɦjklmnprṛɾsśs̪ʃtt̪zz̪]" local implosives = { ["bʱ"] = "ɓ", ["d̪ʱ"] = "ɗ̪", ["dʱ"] = "ɗ", ["dʒʱ"] = "ɗʒ", ["ɡʱ"] = "ɠ", }

ipa = gsub(ipa, "bʱ", "β") ipa = gsub(ipa, "^β", "bʱ") ipa = gsub(ipa, " β", " bʱ")

-- lenition before dental ipa = gsub(ipa, "dʒ([d̪t̪])", "z̪%1") ipa = gsub(ipa, "dʒʱ([d̪t̪])", "z̪%1")

-- word-final deaspiration ipa = gsub(ipa, "bʱ$", "b") ipa = gsub(ipa, "ɖʱ$", "ɖ") ipa = gsub(ipa, "dʒʱ$", "dʒ") ipa = gsub(ipa, "dʑʱ$", "dʑ") ipa = gsub(ipa, "d̪ʱ$", "d̪") ipa = gsub(ipa, "ɡʱ$", "ɡ") ipa = gsub(ipa, "kʰ$", "k") ipa = gsub(ipa, "pʰ$", "p") ipa = gsub(ipa, "ʈʰ$", "ʈ") ipa = gsub(ipa, "t͡ʃʰ$", "t͡ʃ") ipa = gsub(ipa, "tɕʰ$", "tɕ") ipa = gsub(ipa, "t̪ʰ$", "t̪")

-- half-long vowels ipa = gsub(ipa, "(" .. vowel .. ")$", "%1ˑ") ipa = gsub(ipa, "(" .. vowel .. ") ", "%1ˑ ")

-- replacing voiced aspirates with implosives ipa = gsub(ipa, "([bd̪dʒɡ]ʱ)", implosives)

-- initial stress ipa = gsub(ipa, "^(" .. vowel .. ")", "ˈ%1") ipa = gsub(ipa, "^(" .. consonants .. ")", "ˈ%1")

return ipa end

local function eastern_vanga_narrow_IPA(ipa) local vowel = "[aiuoêɔɔ̃ɛeææ̃ãẽĩõũ]" local consonants = "[bβcdd̪fɸgɦjklmnprṛɾsśs̪ʃtt̪zz̪]"

ipa = gsub(ipa, "bʱ", "β") ipa = gsub(ipa, "^β", "bʱ") ipa = gsub(ipa, " β", " bʱ")

-- lenition before dental ipa = gsub(ipa, "dʒ([d̪t̪])", "z̪%1") ipa = gsub(ipa, "dʒʱ([d̪t̪])", "z̪%1")

-- half-long vowels ipa = gsub(ipa, "(" .. vowel .. ")$", "%1ˑ") ipa = gsub(ipa, "(" .. vowel .. ") ", "%1ˑ ")

-- replacing aspiration with tones ipa = gsub(ipa, "(" .. consonants .. ")ʰ(ː?)a", "%1%2á") ipa = gsub(ipa, "(" .. consonants .. ")ʰ(ː?)i", "%1%2í") ipa = gsub(ipa, "(" .. consonants .. ")ʰ(ː?)u", "%1%2ú") ipa = gsub(ipa, "(" .. consonants .. ")ʰ(ː?)o", "%1%2ó") ipa = gsub(ipa, "(" .. consonants .. ")ʰ(ː?)ɔ", "%1%2ɔ́") ipa = gsub(ipa, "(" .. consonants .. ")ʰ(ː?)ɛ", "%1%2έ") ipa = gsub(ipa, "(" .. consonants .. ")ʰ(ː?)e", "%1%2é")

ipa = gsub(ipa, "(" .. consonants .. ")ʱ(ː?)a", "%1%2á") ipa = gsub(ipa, "(" .. consonants .. ")ʱ(ː?)i", "%1%2í") ipa = gsub(ipa, "(" .. consonants .. ")ʱ(ː?)u", "%1%2ú") ipa = gsub(ipa, "(" .. consonants .. ")ʱ(ː?)o", "%1%2ó") ipa = gsub(ipa, "(" .. consonants .. ")ʱ(ː?)ɔ", "%1%2ɔ́") ipa = gsub(ipa, "(" .. consonants .. ")ʱ(ː?)ɛ", "%1%2έ") ipa = gsub(ipa, "(" .. consonants .. ")ʱ(ː?)e", "%1%2é")

-- initial stress ipa = gsub(ipa, "^(" .. vowel .. ")", "ˈ%1") ipa = gsub(ipa, "^(" .. consonants .. ")", "ˈ%1")

return ipa end

-- Rarh function export.make(frame) local args = frame:getParent.args local pagetitle = mw.title.getCurrentTitle.text

local p, results = {}, {}, {}

if args[1] then for index, item in ipairs(args) do			table.insert(p, (item ~= "") and item or nil) end else p = { pagetitle } end

for _, Bengali in ipairs(p) do		local formal = export.toIPA(Bengali, "formal") local desanskritized = export.toIPA(Bengali, "desanskritized") local colloquial = export.toIPA(Bengali, "colloquial") table.insert(results, { pron = "/" .. formal .. "/" }) local narrow = export.narrow_IPA(formal) table.insert(results, { pron = "[" .. narrow .. "]" }) -- desanskritized if colloquial ~= desanskritized then if formal ~= desanskritized then table.insert(results, { pron = "/" .. desanskritized .. "/" }) local desa_narrow = export.narrow_IPA(desanskritized) if desanskritized ~= desa_narrow then table.insert(results, { pron = "[" .. desa_narrow .. "]" }) end end end -- colloquial local col_narrow = colloquial_narrow_IPA(colloquial) if formal ~= colloquial then table.insert(results, { pron = "/" .. colloquial .. "/" }) if colloquial ~= col_narrow then table.insert(results, { pron = "[" .. col_narrow .. "]" }) end else if narrow ~= col_narrow then table.insert(results, { pron = "[" .. col_narrow .. "]" }) end end end

return "* " .. m_a.format_qualifiers(lang, {"Rarh"}) .. " " .. m_IPA.format_IPA_full { lang = lang, items = results } end

-- Dhaka function export.make_dhaka(frame) local args = frame:getParent.args local pagetitle = mw.title.getCurrentTitle.text

local p, results = {}, {}, {}

if args[1] then for index, item in ipairs(args) do			table.insert(p, (item ~= "") and item or nil) end else p = { pagetitle } end

for _, Bengali in ipairs(p) do		local dhaka = export.toIPA(Bengali, "dhaka") local colloquial = export.toIPA(Bengali, "dhaka_colloquial") table.insert(results, { pron = "/" .. dhaka .. "/" }) local narrow = export.narrow_IPA(dhaka) table.insert(results, { pron = "[" .. narrow .. "]" }) -- colloquial local col_narrow = colloquial_narrow_IPA(colloquial) if dhaka ~= colloquial then table.insert(results, { pron = "/" .. colloquial .. "/" }) if colloquial ~= col_narrow then table.insert(results, { pron = "[" .. col_narrow .. "]" }) end else if narrow ~= col_narrow then table.insert(results, { pron = "[" .. col_narrow .. "]" }) end end end

return m_a.format_qualifiers(lang, {"Dhaka"}) .. " " .. m_IPA.format_IPA_full { lang = lang, items = results } end

-- Vanga function export.make_vanga(frame) local args = frame:getParent.args local pagetitle = mw.title.getCurrentTitle.text

local p, results = {}, {}, {}

if args[1] then for index, item in ipairs(args) do			table.insert(p, (item ~= "") and item or nil) end else p = { pagetitle } end

for _, Bengali in ipairs(p) do		local vanga = export.toIPA(Bengali, "vanga") local eastern_vanga = export.toIPA(Bengali, "eastern_vanga") table.insert(results, { pron = "/" .. vanga .. "/" }) local narrow = vanga_narrow_IPA(vanga) table.insert(results, { pron = "[" .. narrow .. "]" }) local eastern_narrow = eastern_vanga_narrow_IPA(eastern_vanga) table.insert(results, { pron = "[" .. eastern_narrow .. "]" }) end

return m_a.format_qualifiers(lang, {"Vanga"}) .. " " .. m_IPA.format_IPA_full { lang = lang, items = results } end

-- Eastern Vanga function export.make_eastern_vanga(frame) local args = frame:getParent.args local pagetitle = mw.title.getCurrentTitle.text

local p, results = {}, {}, {}

if args[1] then for index, item in ipairs(args) do			table.insert(p, (item ~= "") and item or nil) end else p = { pagetitle } end

for _, Bengali in ipairs(p) do		local vanga = export.toIPA(Bengali, "vanga") local eastern_vanga = export.toIPA(Bengali, "eastern_vanga") table.insert(results, { pron = "/" .. vanga .. "/" }) local narrow = eastern_vanga_narrow_IPA(eastern_vanga) table.insert(results, { pron = "[" .. narrow .. "]" }) end

return m_a.format_qualifiers(lang, {"Eastern Vanga"}) .. " " .. m_IPA.format_IPA_full { lang = lang, items = results } end

-- Varendra function export.make_varendra(frame) local args = frame:getParent.args local pagetitle = mw.title.getCurrentTitle.text

local p, results = {}, {}, {}

if args[1] then for index, item in ipairs(args) do			table.insert(p, (item ~= "") and item or nil) end else p = { pagetitle } end

for _, Bengali in ipairs(p) do		local varendra = export.toIPA(Bengali, "varendra") table.insert(results, { pron = "/" .. varendra .. "/" }) local narrow = export.narrow_IPA(varendra) table.insert(results, { pron = "[" .. narrow .. "]" }) end

return m_a.format_qualifiers(lang, {"Varendra"}) .. " " .. m_IPA.format_IPA_full { lang = lang, items = results } end

return export