मोड्युल:ne-IPA
स्वरूप
Nepali IPA pronunciation module. See {{ne-IPA}}
.
local export = {}
local lang = require("मोड्युल:languages").getByCode("ne")
local sc = require("मोड्युल:scripts").getByCode("Deva")
local m_IPA = require("मोड्युल:IPA")
local gsub = mw.ustring.gsub
local gmatch = mw.ustring.gmatch
local find = mw.ustring.find
local correspondences = {
["ṅ"] = "ŋ", ["g"] = "ɡ",
["c"] = "t͡s", ["j"] = "d͡z", ["ċ"] = "t͡s", ["j̈"] = "d͡z", ["ñ"] = "n",
["ṭ"] = "ʈ", ["ḍ"] = "ɖ", ["ṇ"] = "ɳ",
["t"] = "t̪", ["d"] = "d̪",
["y"] = "j", ["v"] = "b", ["w"] = "w", ["l"] = "l",
["ś"] = "s", ["ṣ"] = "s", ["h"] = "ɦ",
["ṛ"] = "ɽ", ["n"] = "n", ["ž"] = "ʒ", ["z"] = "z", ["ġ"] = "ɣ", ["q"] = "q", ["x"] = "x", ["θ"] = "θ", ["ð"] = "ð", ["f"] = "f", ["ḻ"] = "ɭ", ["ṟ"] = "ɹ", ["r̥"] = "ri", ["ṃ"] = "̃", ["ॽ"] = "", ["'"] = "", [","] = ",", ["r"] = "r", ["ỹ"] = "j̃", ["V"] = "v",
["a"] = "ʌ", ["ā"] = "a", ["i"] = "i",
["ī"] = "i", ["o"] = "o", ["e"] = "e",
["u"] = "u", ["ū"] = "u", ["ai"] = "ʌi̯", ["au"] = "ʌu̯", ["ŏ"] = "ɒ", ["ĕ"] = "æ", ["āu"] = "āu̯", ["āi"] = "āi̯",
["ũ"] = "ũ", ["õ"] = "õ", ["ã"] = "ʌ̃", ["ā̃"] = "ã", ["ẽ"] = "ẽ",
["ḥ"] = "ɦʌ", [" "] = " ",
}
local vowels = "aāā̃ẽõiīuūi̯u̯e̞eī̃ū̃ĩoää̃ʌʌ̃ãũŏĕ̤"
local weak_h_c = "gjdḍd̪ṇɽbṛvrṟwy"
local primary_stress = "ˈ"
local secondary_stress = "ˌ"
local weak_h = "([" .. weak_h_c .. "])h"
local aspirate = "([kctṭt̪p])"
local syllabify_pattern = "([" .. vowels .. "]+)([^" .. vowels .. "%.]+)([" .. vowels .."]+)"
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ñṭḍṇɽtdnpbmɽ̃yrlɳwvɾjwśṣshqxġzžḻṛṟfθðṉ]$") or find(current .. ch, "^[kgcjṭḍṇtɽdɽ̃pbṛṟ]h$") then
current = current .. ch
else
table.insert(cons, current)
current = ch
end
end
return cons
end
local function syllabify(text)
for count = 1, 2 do
text = gsub(text, syllabify_pattern, function(a, b, c)
b_set = find_consonants(b)
table.insert(b_set, #b_set > 1 and 2 or 1, "")
return a .. table.concat(b_set) .. c
end)
end
return text
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("मोड्युल:links").full_link{ term = term, lang = lang, sc = sc }
end
function export.toIPA(text, phonetic)
local translit = transliterate(text)
if not translit then
error('The term "' .. Nepali .. '" could not be transliterated.')
end
if phonetic then
translit = gsub(translit, 'ā([iuĩũīū])', 'ä%1̯') -- syllabicity
translit = gsub(translit, 'ā', 'ä') -- narrower transcription of a
---translit = gsub(translit, 'ś', 's')
---translit = gsub(translit, 'ṣ', 's')
---translit = gsub(translit, 'ñ', 'n')
translit = gsub(translit, '([aäāiīuūeaioauŏĕ])([nl])([td])', '%1%2̪%3') -- dental assimilation
translit = gsub(translit, '([aäāiīuūeaioauŏĕ])ṇ([ṭyḍ])', '%1ɳ%2')
translit = gsub(translit, '([aäāiīuūeaioauŏĕ])n([ṭḍ])', '%1ɳ%2') -- retroflex assimilation 2nd
translit = gsub(translit, 'ṇ', 'ɽ̃')
translit = gsub(translit, 'ॽ', 'ʔ')
translit = gsub(translit, "'", "ʔ")
-- ɡlottal stop
translit = gsub(translit, '(h?)r̥', 'ɾi') -- hr̥ ligature initially
translit = gsub(translit, '([aäāiīuūr̥])kṣ', '%1k̚t͡sʰʲ') -- kṣ ligature
translit = gsub(translit, '()kṣ', 't͡sʰʲ') -- kṣ initially
translit = gsub(translit, '([a])h([iīĩī̃])', '%1%2̯') -- h dropping
translit = gsub(translit, '([a])h([āä])', '%2̆ɦ%2̤') -- breathy and vowel changes
translit = gsub(translit, '([äoāe])h([iīuūĩũī̃ū̃])', '%1%2̯') -- h dropping 2nd case
translit = gsub(translit, '([äā])h([a])', '%1ɦ%1̆') -- vowel change 2nd
translit = gsub(translit, '([ʌäaāiīuūe̞eo])([nmṅɳŋɲñṇ])', '%1̃%2')
translit = gsub(translit, '([ʌäaāiīuūe̞eo])h([nml])', '%1%2%2')
translit = gsub(translit, '([ʌäaāiīuūe̞eo])hr([ʌäaāiīuūe̞eo])', '%1ɾ%2')
translit = gsub(translit, '([ʌäaāiīuūe̞eo])hy([ʌäaāiīuūe̞eo])', '%1i̯y%2')
translit = gsub(translit, '([ñnl])([cj])', '%1̻%2')
translit = gsub(translit, '([śṣs])([ṭ])(h)', 's̠t̠ʰ')
translit = gsub(translit, '([śṣs])([ḍ])(h)', 's̠d̠ʱ')
translit = gsub(translit, '([śṣs])([ṭ])', 's̠t̠')
translit = gsub(translit, '([śṣs])([ḍ])', 's̠d̠')
translit = gsub(translit, '([l])([ṭʈɖḍ])', 'ɭ%2')
translit = gsub(translit, '([ṭḍʈɖ])(h?)([l])', '%1%2ɭ')
translit = gsub(translit, '([ṭʈḍ])(h?)([n])', '%1%2ɳ')
translit = gsub(translit, '([td])(h?)([n])', '%1%2%3̪')
translit = gsub(translit, '([n])([ʌäaā])([tdṭs])', '%1%2̃%3')
translit = gsub(translit, '([nmṅɳŋɲñṇ])([ʌäaā])([cj])', '%1%2̃%3')
translit = gsub(translit, '([nmṅɳŋɲñṇ])([iīuū])', '%1%2̃')
translit = gsub(translit, '([nmṅɳŋɲñṇ])([iīuū])([̃ṃ]?)([iīuū])([̃ṃ]?)', '%1%2̃%4̃')
translit = gsub(translit, '([ʌäaāsiīuūe̞eo])([p])([h])', '%1ɸ')
translit = gsub(translit, '([ʌäaāsiīuūe̞eo])([k])([h])', '%1k̞ʰ')
translit = gsub(translit, '([ʌäaāiīuūe̞ä̃eoe̤])([j])([h])', '%1j')
translit = gsub(translit, '([ʌäaāiīuūe̞eo])bh([ʌäaāiīuūe̞eo])', '%1β%2')
translit = gsub(translit, '([ʌäaāiīuūe̞eo])([d])([h])', '%1%2')
translit = gsub(translit, '([ʌäaāisīuūe̞eo])gh', '%1ɡ̞')
translit = gsub(translit, 'c(h?)c(h)', 't̚t͡sʰ')
translit = gsub(translit, 'cc', 't̚t͡s')
translit = gsub(translit, 'j(h?)j(h)', 'd̚d͡zʱ')
translit = gsub(translit, 'jj', 'd̚d͡z')
translit = gsub(translit, "([kɡtdʈṭpb])(̪?)([ʰʱ]?)([ %.ˈ]?)([kɡtdṭʈpb])([ʰʱ]?)", "%1%2%3̚%4%5%6") -- no audible release
translit = gsub(translit, '([iī])h([äāe])', '(%1)y%2') -- vowel change 3rd
translit = gsub(translit, '([aāäiīuā̃ũĩū̃ī̃ä̃ū])ya', '%1e̞') -- ya to e before vowel
translit = gsub(translit, '([e])ya', '%1yʌ') -- ya remains same
translit = gsub(translit, '([aāiīuūãä̃ĩī̃ũū̃ā̃õẽeoä])([grbtṭdmhncjvwṛṛ̃ṅɽśṣɳslkpḍ])([wv])a', '%1%2%2o') -- gemination of preceding consonant
translit = gsub(translit, '()([grbtṭdmhncjvwṇṅɽśṣɳslkpḍ])([wv])a', '%2o')
translit = gsub(translit, '([aāiīuūãä̃ĩī̃ũū̃ā̃õẽeoä])([grbtṭdmncjvwṇṅśṣɳslkp])ya', '%1%2%2e') -- gemination of preceding consonant
translit = gsub(translit, '()([grbtṭdmncjvwṅśṣɳslkpḍ])ya', '%2e') -- no gemination
translit = gsub(translit, '()ya', 'e') -- ya to e initially
translit = gsub(translit, '([ʌäaāiīuãä̃ĩī̃ũū̃ā̃õẽūeo])ḍ(h?)(y?)', '%1ɽ%3') -- postvocalic allophone of ḍ and ḍh
translit = gsub(translit, '([bdgjḍ])h([ʌäaāiīuūeeoo])', '%1ʱ%2̤') -- breathy voice
-- force final schwa
translit = gsub(translit, "a~$", "ʌ")
translit = gsub(translit, 'a$', 'ʌ') -- final schwa retention
translit = gsub(translit, '(...)a ', '%1ʌ ') -- final schwa retenti
translit = gsub(translit, '([ʌäaāiīuūəeeo ̤])r([ʌäaāiīəuūeeo ̤])', '%1ɾ%2') -- intervocalic allophone of r
translit = gsub(translit, "m̐", "ːm")
end
local result = gsub(translit, ".", correspondences)
translit = gsub(translit, "͠", "̃")
---translit = gmatch(translit, '^[^-]') and ('ˈ' .. gsub(translit, ' ', ' ˈ'))
translit = gsub(translit, "(...)*$", "%1ʌ") -- second person mid-respect verb form
translit = gsub(translit, "m̐", "m")
translit = gsub(translit, "rr̥", "ri")
translit = gsub(translit, '()([śsnlcjzkhptdgb])([vw])([aāäiīuūoe])([cspdtngkbrjyṇṣśṇɾṅñṃ])', '%2w%4%5')
--translit = gsub(translit, 'ā([iuĩũīū])', 'ā%1̯') -- syllabicity
translit = gsub(translit, "([aāäiīuūeoʌ])([̤]?)(̃?)([ṃ]?)([iīūu])(̃?)([ṃ]?)", "%1%2%3%4%5̯%6%7")
translit = gsub(translit, "%-", " ")
translit = gsub(translit, "r̥", "ri")
translit = syllabify(translit)
-- aspiration rules
translit = gsub(translit, aspirate .. "h", '%1ʰ')
translit = gsub(translit, weak_h, '%1ʱ')
translit = gsub(translit, '([' .. weak_h_c .. '])%.h', '.%1ʱ')
translit = gsub(translit, aspirate .. '%.h', '.%1ʰ')
translit = gsub(translit, "%.ː", "ː.")
local result = gsub(translit, ".", correspondences)
-- formatting
result = gsub(result, "ː̃", "̃ː")
result = gsub(result, "ː.̃", "̃ː.")
result = gsub(result, "([snmrfv])%1", "%1ː")
result = gsub(result, "t̪͡s", "t͡s")
result = gsub(result, "t̪̠", "t̠")
result = gsub(result, "d̪̠", "d̠")
result = gsub(result, "i̯̯", "i̯")
result = gsub(result, "u̯̯", "u̯")
result = gsub(result, "%. ", " ")
result = gsub(result, "%.$", " ")
result = gsub(result, "%.?%-", ".")
result = gsub(result, "t̪̚t͡s", "t̚t͡s")
result = gsub(result, "([ʌäaāiīuūe̞eo]̃)̃", "%1")
result = gsub(result, "ĩ̯̯̃", "ĩ̯")
result = gsub(result, "d̪̚d̪͡z", "d̚d͡z")
result = gsub(result, "ː%.̃", "̃ː.")
return result
end
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 _, Nepali in ipairs(p) do
table.insert(results, { pron = "/" .. export.toIPA(Nepali) .. "/" })
if export.toIPA(Nepali, true) ~= export.toIPA(Nepali) then
table.insert(results, { pron = "[" .. export.toIPA(Nepali, true) .. "]" })
end
end
return m_IPA.format_IPA_full(lang, results)
end
return export