มอดูล:ml-IPA
หน้าตา
- This มอดูล lacks a documentation subpage. Please create it.
- Useful links: subpage list • links • transclusions • testcases • sandbox
local export = {}
local lang = require("Module:languages").getByCode("ml")
local sc = require("Module:scripts").getByCode("Mlym")
local m_IPA = require("Module:IPA")
local gsub = mw.ustring.gsub
local consonants = {
['ക'] = 'k', ['ഖ'] = 'kʰ', ['ഗ'] = 'ɡ', ['ഘ'] = 'ɡʱ', ['ങ'] = 'ŋ',
['ച'] = 't͡ʃ', ['ഛ'] = 't͡ʃʰ', ['ജ'] = 'd͡ʒ', ['ഝ'] = 'd͡ʒʱ', ['ഞ'] = 'ɲ',
['ട'] = 'ʈ', ['ഠ'] = 'ʈʰ', ['ഡ'] = 'ɖ', ['ഢ'] = 'ɖʱ', ['ണ'] = 'ɳ',
['ത'] = 't̪', ['ഥ'] = 't̪ʰ', ['ദ'] = 'd̪', ['ധ'] = 'd̪ʱ', ['ന'] = 'n̪',
['പ'] = 'p', ['ഫ'] = 'f', ['ബ'] = 'b', ['ഭ'] = 'bʱ', ['മ'] = 'm',
['യ'] = 'j', ['ര'] = 'ɾ', ['ല'] = 'l', ['വ'] = 'ʋ',
['ശ'] = 'ʃ', ['ഷ'] = 'ʂ', ['സ'] = 's', ['ഹ'] = 'h',
['ള'] = 'ɭ', ['ഴ'] = 'ɻ', ['റ'] = 'r', ['ഩ'] = 'n', ['ഺ'] = 't',
['സ2'] = 'z', ['ഡ2'] = 'd', ['വ2'] = 'w',
}
local vowel_diacritics = {
['ാ'] = 'aː', ['ി'] = 'i', ['ീ'] = 'iː', ['ു'] = 'u', ['ൂ'] = 'uː', ['ൃ'] = 'ri', ['ൄ'] = 'riː', ['ൢ'] = 'li', ['ൣ'] = 'liː',
['െ'] = 'e', ['േ'] = 'eː', ['ൈ'] = 'ɐi̯', ['ൊ'] = 'o', ['ോ'] = 'oː', ['ൌ'] = 'ɐu̯', ['ൗ'] = 'ɐu̯',
['്'] = '', ['഻'] = '', ['഼'] = '', --virama, supresses the inherent vowel "a"
[''] = 'ɐ' -- no diacritic
}
local other = {
-- independent vowels
['അ'] = 'ɐ', ['ആ'] = 'aː', ['ഇ'] = 'i', ['ഈ'] = 'iː', ['ൟ'] = 'iː', ['ഉ'] = 'u', ['ഊ'] = 'uː', ['ഋ'] = 'ri', ['ൠ'] = 'riː', ['ഌ'] = 'li', ['ൡ'] = 'liː',
['എ'] = 'e', ['ഏ'] = 'eː', ['ഐ'] = 'ai̯', ['ഒ'] = 'o', ['ഓ'] = 'oː', ['ഔ'] = 'au̯',
-- Other symbols
['ർ'] = 'r', ['ൎ'] = 'r', ['ൽ'] = 'l', ['ൾ'] = 'ɭ', ['ൻ'] = 'n', ['ൺ'] = 'ɳ', ['ൿ'] = 'k', ['ൔ'] = 'm', ['ൕ'] = 'j', ['ൖ'] = 'ɻ',
['ം'] = 'm̃', ['ഀ'] = 'm̃',
['ഃ'] = 'h',
['ഁ'] = '̃', -- Chandrabindu
['ഽ'] = '', -- Avagraha
['ഄ'] = '', -- Vedic anusvara
}
local adjust1 = {
-- Assimilate the anusvara
['m̃([kɡŋ])'] = 'ŋ%1',
['m̃([td]͡[ʃʒ])'] = 'ɲ%1', ['m̃(ɲ)'] = 'ɲ%1',
['m̃([ʈɖɳ])'] = 'ɳ%1',
['m̃([td]̪)'] = 'n̪%1', ['m̃(n̪)'] = 'n̪%1',
['m̃([tdn])'] = 'n%1',
['m̃([pbmjɾlʋʃʂshɭɻr])'] = 'm%1',
['m̃([%s%p])'] = 'm%1', ['m̃$'] = 'm',
['ŋk'] = 'ŋɡ', ['ɲt͡ʃ'] = 'ɲd͡ʒ', ['ɳʈ'] = 'ɳɖ', ['rr'] = 'tt', ['n̪t̪'] = 'n̪d̪', ['mp'] = 'mb', ['n̪r'] = 'nt',
['ɾɾ'] = 'rr', ['rɾ'] = 'rr', ['ɾr'] = 'rr',
['([ɐaeioui̯u̯ə̆nɳɻjrl]ː?)k([ɐaeioui̯u̯ə̆])'] = '%1ɡ%2',
['([ɐaeioui̯u̯ə̆nɳj]ː?)t͡ʃ([ɐaeioui̯u̯ə̆])'] = '%1d͡ʒ%2',
['([ɐaeioui̯u̯ə̆nɳɻjrl]ː?)n̪([ɐaeioui̯u̯ə̆])'] = '%1n%2',
['([ɐaeioui̯u̯ə̆nɳj]ː?)ʈ([ɐaeioui̯u̯ə̆])'] = '%1ɖ%2',
['([ɐaeioui̯u̯ə̆nɳj]ː?)t̪([ɐaeioui̯u̯ə̆])'] = '%1d̪%2',
['([ɐaeioui̯u̯ə̆nɳj]ː?)p([ɐaeioui̯u̯ə̆])'] = '%1b%2',
['([pt̪tʈʃkbɖʒmn̪nɳŋfɾlʋɭʂshʰʱ)])ɾ'] = '%1r',
['([ptʃkbdɡmʋsh])n̪'] = '%1n',
['n̪([mpbkɡjlʋʃs])'] = 'n%1',
['hp'] = 'pp', ['hk'] = 'kk', ['hs'] = 'ss', ['hʃ'] = 'ʃʃ', ['hʂ'] = 'ʂʂ',
['([pbkɡfʋh])l'] = '%1ɭ',
['ʰ'] = '(ʰ)', ['ʱ'] = '(ʱ)',
['ː̃']='̃ː', ['n്r'] = 'nt',
['u്'] = 'ə̆', ['uː്'] = 'əː', ['ɐൗ'] = 'ɐu̯',
['s2'] = 'z', ['ɖ2'] = 'd', ['ʋ2'] = 'w', ['ɐ2'] = 'ə', ['aː2'] = 'æː', ['o2'] = 'ɔ', ['oː2'] = 'ɔː', -- English loans
}
local adjust2 = {
['d͡ʒɲ'] = 'ɟɲ',
['t̪([pbskɡ])'] = 'l%1', ['d̪([pbskɡ])'] = 'l%1', -- in free variation not universal change
['nt'] = 'nd',
['([pt̪tʈkbd̪dɖgmn̪nɳɲŋjlʋʃʒʂshʰʱ])ʋ'] = '%1ʋʷ',
['t͡ʃt͡ʃ'] = 't̚t͡ʃ', ['d͡ʒd͡ʒ'] = 'd̚d͡ʒ', ['ɲd͡ʒ'] = 'n̠ʲd͡ʒ',
}
function export.link(term)
return require("Module:links").full_link{ term = term, lang = lang, sc = sc }
end
function export.to_IPA(text)
local VIRAMA = '്'
-- final virama rules
text = gsub(text, VIRAMA .. "([%,%.%!%?%:%;]?)$", VIRAMA .. "ə̆%1")
text = gsub(text, VIRAMA .. "([%,%.%!%?%:%;]?) ", VIRAMA .. "ə̆%1 ")
text = mw.ustring.gsub(text, "ə̆ ([%,%.%!%?%:%;]?)([ ɐaeiou])", "‿ %1%2") -- ŭ is elided before vowels
text = gsub(
text,
'([ക-ഺ])(഻?)([ാ-്]?)',
function(c, n, d)
return ((consonants[c..n] or consonants[c]) or c) .. vowel_diacritics[d]
end)
text = gsub(text, '[ം-ൡ]', other)
for k, v in pairs(adjust1) do
text = gsub(text, k, v)
end
-- If an independent vowel is after another vowel, assume diphthong
text = gsub(text, "([ɐaeiou]ː?)•", "%1")
text = gsub(text, '.', other)
-- Phonetic transcription
text2 = text
for k, v in pairs(adjust2) do
text2 = gsub(text2, k, v)
end
return (text == text2 and { text } or { text, text2 })
end
function export.show(frame)
local args = frame:getParent().args
local page_title = mw.title.getCurrentTitle().text
local text = args[1] or page_title
local qualifier = args["q"] or nil
local transcriptions = export.to_IPA(text)
local IPA_text
if not transcriptions[2] then
IPA_text = m_IPA.format_IPA_full {
lang = lang,
items = {{ pron = "/" .. transcriptions[1] .. "/" }},
}
else
IPA_text = m_IPA.format_IPA_full {
lang = lang,
items = {{ pron = "/" .. transcriptions[1] .. "/" }, { pron = "[" .. transcriptions[2] .. "]" }},
}
end
return "* " .. (qualifier and require("Module:qualifier").format_qualifier{qualifier} .. " " or "")
.. IPA_text
end
return export