Module:km-pron

Hello, you have come here looking for the meaning of the word Module:km-pron. In DICTIOUS you will not only get to know all the dictionary meanings for the word Module:km-pron, but we will also tell you about its etymology, its characteristics and you will know how to say Module:km-pron in singular and plural. Everything you need to know about the word Module:km-pron you have here. The definition of the word Module:km-pron will help you to be more precise and correct when speaking or writing your texts. Knowing the definition ofModule:km-pron, as well as those of other words, enriches your vocabulary and provides you with more and better linguistic resources.

Khmer pronunciation module. See {{km-IPA}}.

Testcases

Module:km-pron/testcases:

Module:km-pron/testcases/data stores the testcase data.

12 of 195 tests failed. (refresh)

TextExpectedActualDiffers at
test_ipa:
Passedក្បាលkɓaːlkɓaːl
Passedស្អែកsʔaeksʔaek
Failedផ្សេងpʰseiŋpʰseːŋ23
Passedល្មមlmɔːmlmɔːm
Passedភ្ជុំpʰcumpʰcum
Passedម្នាស់mnŏəhmnŏəh
Passedផ្ទះpʰtĕəhpʰtĕəh
Passedខ្ញុំkɲomkɲom
Passedប្ដីpɗəjpɗəj
Failedឆ្វេងcʰʋeiŋcʰʋeːŋ23
Passedហ្វឹកfəkfək
Passedឡានlaːnlaːn
Passedឃាត់kʰŏətkʰŏət
Passedខាត់kʰatkʰat
Passedញាំɲŏəmɲŏəm
Passedល្ហុងlhoŋlhoŋ
Passedសព្វ (respelling: សប់)sɑpsɑp
Passedអ្នក (respelling: នាក់)nĕəʔnĕəʔ
Passedលក់lŭəʔlŭəʔ
Passedសង្កាត់sɑŋ.ˈkatsɑŋ.ˈkat
Passedទម្ងន់tum.ˈŋŭəntum.ˈŋŭən
Passedម្ញ៉ិកម្ញ៉ក់mɲək.ˈmɲɑʔmɲək.ˈmɲɑʔ
Passedប្រយ័ត (respelling: ប្រយ៉ាត់)prɑ.ˈjatprɑ.ˈjat
Passedបារី (respelling: បារ៉ី)ɓaː.ˈrəjɓaː.ˈrəj
Passedកន្លែង (respelling: កន្ល៉ែង)kɑn.ˈlaeŋkɑn.ˈlaeŋ
Passedស្រលាញ់ (respelling: ស្រ-ល៉ាញ់, ស្រ'-ល៉ាញ់)srɑ.ˈlaɲ, srə.ˈlaɲsrɑ.ˈlaɲ, srə.ˈlaɲ
Passedគំនិតkum.ˈnɨtkum.ˈnɨt
Passedត្រជាក់trɑ.ˈcĕəʔtrɑ.ˈcĕəʔ
Passedជណ្ដើរcŭən.ˈɗaəcŭən.ˈɗaə
Passedទំហំ (respelling: ទំហ៊ំ)tum.ˈhumtum.ˈhum
Passedវិហារ (respelling: វិហ៊ា)ʋi.ˈhiəʋi.ˈhiə
Passedបវត្តិ (respelling: ប៉ៈវ័ត)paʔ.ˈʋŏətpaʔ.ˈʋŏət
Failedចេតនា (respelling: ចេតៈន៉ា)cei.taʔ.naːceː.taʔ.naː21
Failedវេទនា (respelling: វេទៈនា)ʋeː.tĕəʔ.niəʋei.tĕəʔ.niə21
Passedសំស្ក្រឹត (respelling: ស័ង-ស្ក្រិត, ស័ង-សៈក្រិត)saŋ.ˈskrət, saŋ.saʔ.krətsaŋ.ˈskrət, saŋ.saʔ.krət
Passedបន្តក់ɓɑn.ˈtɑʔɓɑn.ˈtɑʔ
Passedសាស្ត្រា (respelling: សាស-ស្ត្រា)saːh.ˈstraːsaːh.ˈstraː
Passedបដិសេធ (respelling: ប៉ៈដិសែត)paʔ.ɗe.saetpaʔ.ɗe.saet
Passedបរិយោសាន (respelling: ប៉ៈរ៉ិយ៉ោសាន)paʔ.re.jao.saːnpaʔ.re.jao.saːn
Passedភ្នែកមាន់ (respelling: ភ្នែក មាន់)pʰnɛːk ˈmŏənpʰnɛːk ˈmŏən
Failedផ្សេងៗ (respelling: ផ្សេងផ្សេង)pʰseiŋ.ˈpʰseiŋpʰseːŋ.ˈpʰseːŋ23
Passedកញ្ញា (respelling: ក័ញ្ញ៉ា)kaɲ.ˈɲaːkaɲ.ˈɲaː
Passedភ្នំពេញ (respelling: ភ្នំ ពេញ)pʰnum ˈpɨɲpʰnum ˈpɨɲ
Passedរុក្ខវិថី (respelling: រុកខៈ វិថី)ruk.kʰaʔ ʋi.tʰəjruk.kʰaʔ ʋi.tʰəj
Failedសហរដ្ឋអាមេរិក (respelling: សៈហៈ រ័ត អាមេរិក)saʔ.haʔ rŏət ʔaː.meː.rɨksaʔ.haʔ rŏət ʔaː.mei.rɨk38
Passedលលក (respelling: ល-លក)lɔ.ˈlɔːʔlɔ.ˈlɔːʔ
Passedរបស់ (respelling: រ-បស់, រ'-បស់)rɔ.ˈɓɑh, rə.ˈɓɑhrɔ.ˈɓɑh, rə.ˈɓɑh
Passedបរិភោគ (respelling: បរ៉ិភោក)ɓɑː.re.pʰoːkɓɑː.re.pʰoːk
Passedធំ (respelling: ថុំ)tʰomtʰom
Passedវចនានុក្រម (respelling: វៈ-ចៈ-ន៉ា-នុ-ក្រំ)ʋĕəʔ.caʔ.naː.nu.krɑmʋĕəʔ.caʔ.naː.nu.krɑm
Passedសាសន (respelling: សាសៈន៉ៈ)saː.saʔ.naʔsaː.saʔ.naʔ
Passedសាសនា (respelling: សា-ស្នា)saː.ˈsnaːsaː.ˈsnaː
Passedកិរិយា (respelling: កិរិយ៉ា)ke.ri.jaːke.ri.jaː
Passedល្អូកល្អិនlʔouk.ˈlʔənlʔouk.ˈlʔən
Passedឆ្ងាញ់cʰŋaɲcʰŋaɲ
Passedប្រធានាធិបតី (respelling: ប្រ់ធានាធិបប៉ៈដី)prɑ.tʰiə.niə.tʰɨp.paʔ.ɗəjprɑ.tʰiə.niə.tʰɨp.paʔ.ɗəj
Passedឧសភា (respelling: អុសៈភា, អ៊ុសៈភា)ʔo.saʔ.pʰiə, ʔu.saʔ.pʰiəʔo.saʔ.pʰiə, ʔu.saʔ.pʰiə
Passedហ្វៃហ្វា (respelling: វ៉ៃ-វ៉ា, ហ្វៃ-ហ្វា)ʋaj.ˈʋaː, faj.ˈfaːʋaj.ˈʋaː, faj.ˈfaː
Passedកម្មវិធី (respelling: ក័មវិធី, ក័ម្មៈវិធី, ក័ម្ម៉ៈវិធី)kam.ʋi.tʰiː, kam.mĕəʔ.ʋi.tʰiː, kam.maʔ.ʋi.tʰiːkam.ʋi.tʰiː, kam.mĕəʔ.ʋi.tʰiː, kam.maʔ.ʋi.tʰiː
Passedរថ (respelling: រត់)rŭətrŭət
Passedកម្ពុជា (respelling: ក័មពុជា)kam.pu.ciəkam.pu.ciə
Passedរុស្ស៊ី (respelling: រុស៊ី)ru.ˈsiːru.ˈsiː
Passedចក្រ (respelling: ច័ក, ច័ក-ក្រៈ-)caʔ, caʔ.kraʔ.caʔ, caʔ.kraʔ.
Passedអម្ពិល (respelling: អំពិល)ʔɑm.ˈpɨlʔɑm.ˈpɨl
Passedចក្រយាន (respelling: ច័ក-ក្រ់-យាន)caʔ.krɑ.jiəncaʔ.krɑ.jiən
TextExpectedActualDiffers at
test_syllabify:
Passedក្បាលក្បាលក្បាល
Passedស្អែកស្អែកស្អែក
Passedផ្សេងផ្សេងផ្សេង
Passedល្មមល្មមល្មម
Passedភ្ជុំភ្ជុំភ្ជុំ
Passedម្នាស់ម្នាស់ម្នាស់
Passedផ្ទះផ្ទះផ្ទះ
Passedខ្ញុំខ្ញុំខ្ញុំ
Passedប្ដីប្ដីប្ដី
Passedឆ្វេងឆ្វេងឆ្វេង
Passedហ្វឹកហ្វឹកហ្វឹក
Passedឡានឡានឡាន
Passedឃាត់ឃាត់ឃាត់
Passedខាត់ខាត់ខាត់
Passedញាំញាំញាំ
Passedល្ហុងល្ហុងល្ហុង
Passedសព្វ (respelling: សប់)សប់សប់
Passedអ្នក (respelling: នាក់)នាក់នាក់
Passedលក់លក់លក់
Passedសង្កាត់ស-ង្កាត់ស-ង្កាត់
Passedទម្ងន់ទ-ម្ងន់ទ-ម្ងន់
Passedម្ញ៉ិកម្ញ៉ក់ម្ញ៉ិក-ម្ញ៉ក់ម្ញ៉ិក-ម្ញ៉ក់
Passedប្រយ័ត (respelling: ប្រយ៉ាត់)ប្រ-យ៉ាត់ប្រ-យ៉ាត់
Passedបារី (respelling: បារ៉ី)បា-រ៉ីបា-រ៉ី
Passedកន្លែង (respelling: កន្ល៉ែង)ក-ន្ល៉ែងក-ន្ល៉ែង
Passedស្រលាញ់ (respelling: ស្រ-ល៉ាញ់, ស្រ'-ល៉ាញ់)ស្រ-ល៉ាញ់, ស្រ'-ល៉ាញ់ស្រ-ល៉ាញ់, ស្រ'-ល៉ាញ់
Passedគំនិតគំ-និតគំ-និត
Passedត្រជាក់ត្រ-ជាក់ត្រ-ជាក់
Passedជណ្ដើរជ-ណ្ដើរជ-ណ្ដើរ
Passedទំហំ (respelling: ទំហ៊ំ)ទំ-ហ៊ំទំ-ហ៊ំ
Passedវិហារ (respelling: វិហ៊ា)វិ-ហ៊ាវិ-ហ៊ា
Passedបវត្តិ (respelling: ប៉ៈវ័ត)ប៉ៈ-វ័តប៉ៈ-វ័ត
Passedចេតនា (respelling: ចេតៈន៉ា)ចេ-តៈ-ន៉ាចេ-តៈ-ន៉ា
Passedវេទនា (respelling: វេទៈនា)វេ-ទៈ-នាវេ-ទៈ-នា
Passedសំស្ក្រឹត (respelling: ស័ង-ស្ក្រិត, ស័ង-សៈក្រិត)ស័ង-ស្ក្រិត, ស័ង-សៈ-ក្រិតស័ង-ស្ក្រិត, ស័ង-សៈ-ក្រិត
Passedបន្តក់ប-ន្តក់ប-ន្តក់
Passedសាស្ត្រា (respelling: សាស-ស្ត្រា)សាស-ស្ត្រាសាស-ស្ត្រា
Passedបដិសេធ (respelling: ប៉ៈដិសែត)ប៉ៈ-ដិ-សែតប៉ៈ-ដិ-សែត
Passedបរិយោសាន (respelling: ប៉ៈរ៉ិយ៉ោសាន)ប៉ៈ-រ៉ិ-យ៉ោ-សានប៉ៈ-រ៉ិ-យ៉ោ-សាន
Passedភ្នែកមាន់ (respelling: ភ្នែក មាន់)ភ្នែក មាន់ភ្នែក មាន់
Passedផ្សេងៗ (respelling: ផ្សេងផ្សេង)ផ្សេង-ផ្សេងផ្សេង-ផ្សេង
Passedកញ្ញា (respelling: ក័ញ្ញ៉ា)ក័-ញ្ញ៉ាក័-ញ្ញ៉ា
Passedភ្នំពេញ (respelling: ភ្នំ ពេញ)ភ្នំ ពេញភ្នំ ពេញ
Passedរុក្ខវិថី (respelling: រុកខៈ វិថី)រុក-ខៈ វិ-ថីរុក-ខៈ វិ-ថី
Passedសហរដ្ឋអាមេរិក (respelling: សៈហៈ រ័ត អាមេរិក)សៈ-ហៈ រ័ត អា-មេ-រិកសៈ-ហៈ រ័ត អា-មេ-រិក
Passedលលក (respelling: ល-លក)ល-លកល-លក
Passedរបស់ (respelling: រ-បស់, រ'-បស់)រ-បស់, រ'-បស់រ-បស់, រ'-បស់
Passedបរិភោគ (respelling: បរ៉ិភោក)ប-រ៉ិ-ភោកប-រ៉ិ-ភោក
Passedធំ (respelling: ថុំ)ថុំថុំ
Passedវចនានុក្រម (respelling: វៈ-ចៈ-ន៉ា-នុ-ក្រំ)វៈ-ចៈ-ន៉ា-នុ-ក្រំវៈ-ចៈ-ន៉ា-នុ-ក្រំ
Passedសាសន (respelling: សាសៈន៉ៈ)សា-សៈ-ន៉ៈសា-សៈ-ន៉ៈ
Passedសាសនា (respelling: សា-ស្នា)សា-ស្នាសា-ស្នា
Passedកិរិយា (respelling: កិរិយ៉ា)កិ-រិ-យ៉ាកិ-រិ-យ៉ា
Passedល្អូកល្អិនល្អូក-ល្អិនល្អូក-ល្អិន
Passedឆ្ងាញ់ឆ្ងាញ់ឆ្ងាញ់
Passedប្រធានាធិបតី (respelling: ប្រ់ធានាធិបប៉ៈដី)ប្រ់-ធា-នា-ធិប-ប៉ៈ-ដីប្រ់-ធា-នា-ធិប-ប៉ៈ-ដី
Passedឧសភា (respelling: អុសៈភា, អ៊ុសៈភា)អុ-សៈ-ភា, អ៊ុ-សៈ-ភាអុ-សៈ-ភា, អ៊ុ-សៈ-ភា
Passedហ្វៃហ្វា (respelling: វ៉ៃ-វ៉ា, ហ្វៃ-ហ្វា)វ៉ៃ-វ៉ា, ហ្វៃ-ហ្វាវ៉ៃ-វ៉ា, ហ្វៃ-ហ្វា
Passedកម្មវិធី (respelling: ក័មវិធី, ក័ម្មៈវិធី, ក័ម្ម៉ៈវិធី)ក័ម-វិ-ធី, ក័-ម្មៈ-វិ-ធី, ក័-ម្ម៉ៈ-វិ-ធីក័ម-វិ-ធី, ក័-ម្មៈ-វិ-ធី, ក័-ម្ម៉ៈ-វិ-ធី
Passedរថ (respelling: រត់)រត់រត់
Passedកម្ពុជា (respelling: ក័មពុជា)ក័ម-ពុ-ជាក័ម-ពុ-ជា
Passedរុស្ស៊ី (respelling: រុស៊ី)រុ-ស៊ីរុ-ស៊ី
Passedចក្រ (respelling: ច័ក, ច័ក-ក្រៈ-)ច័ក, ច័ក-ក្រៈ-ច័ក, ច័ក-ក្រៈ-
Passedអម្ពិល (respelling: អំពិល)អំ-ពិលអំ-ពិល
Passedចក្រយាន (respelling: ច័ក-ក្រ់-យាន)ច័ក-ក្រ់-យានច័ក-ក្រ់-យាន
TextExpectedActualDiffers at
test_transcript:
Passedក្បាលkbaalkbaal
Passedស្អែកsʼaeksʼaek
Failedផ្សេងphseingphseeng23
Passedល្មមlmɔɔmlmɔɔm
Passedភ្ជុំphcumphcum
Passedម្នាស់mnŏəhmnŏəh
Passedផ្ទះphtĕəhphtĕəh
Passedខ្ញុំkhñomkhñom
Passedប្ដីpdəypdəy
Failedឆ្វេងchveingchveeng23
Passedហ្វឹកfəkfək
Passedឡានlaanlaan
Passedឃាត់khŏətkhŏət
Passedខាត់khatkhat
Passedញាំñŏəmñŏəm
Passedល្ហុងlhonglhong
Passedសព្វ (respelling: សប់)sɑpsɑp
Passedអ្នក (respelling: នាក់)nĕəknĕək
Passedលក់lŭəklŭək
Passedសង្កាត់sɑngkatsɑngkat
Passedទម្ងន់tumngŭəntumngŭən
Passedម្ញ៉ិកម្ញ៉ក់mñəkmñɑkmñəkmñɑk
Passedប្រយ័ត (respelling: ប្រយ៉ាត់)prɑyatprɑyat
Passedបារី (respelling: បារ៉ី)baarəybaarəy
Passedកន្លែង (respelling: កន្ល៉ែង)kɑnlaengkɑnlaeng
Passedស្រលាញ់ (respelling: ស្រ-ល៉ាញ់, ស្រ'-ល៉ាញ់)srɑlañ, srəlañsrɑlañ, srəlañ
Passedគំនិតkumnɨtkumnɨt
Passedត្រជាក់trɑcĕəktrɑcĕək
Passedជណ្ដើរcŭəndaəcŭəndaə
Passedទំហំ (respelling: ទំហ៊ំ)tumhumtumhum
Passedវិហារ (respelling: វិហ៊ា)vihiəvihiə
Passedបវត្តិ (respelling: ប៉ៈវ័ត)paʼvŏətpaʼvŏət
Failedចេតនា (respelling: ចេតៈន៉ា)ceitaʼnaaceetaʼnaa21
Failedវេទនា (respelling: វេទៈនា)veetĕəʼniəveitĕəʼniə21
Passedសំស្ក្រឹត (respelling: ស័ង-ស្ក្រិត, ស័ង-សៈក្រិត)sangskrət, sangsaʼkrətsangskrət, sangsaʼkrət
Passedបន្តក់bɑntɑkbɑntɑk
Passedសាស្ត្រា (respelling: សាស-ស្ត្រា)saahstraasaahstraa
Passedបដិសេធ (respelling: ប៉ៈដិសែត)paʼdesaetpaʼdesaet
Passedបរិយោសាន (respelling: ប៉ៈរ៉ិយ៉ោសាន)paʼreyaosaanpaʼreyaosaan
Passedភ្នែកមាន់ (respelling: ភ្នែក មាន់)phnɛɛk mŏənphnɛɛk mŏən
Failedផ្សេងៗ (respelling: ផ្សេងផ្សេង)phseingphseingphseengphseeng23
Passedកញ្ញា (respelling: ក័ញ្ញ៉ា)kaññaakaññaa
Passedភ្នំពេញ (respelling: ភ្នំ ពេញ)phnum pɨñphnum pɨñ
Passedរុក្ខវិថី (respelling: រុកខៈ វិថី)rukkhaʼ vithəyrukkhaʼ vithəy
Failedសហរដ្ឋអាមេរិក (respelling: សៈហៈ រ័ត អាមេរិក)saʼhaʼ rŏət ʼaameerɨksaʼhaʼ rŏət ʼaameirɨk36
Passedលលក (respelling: ល-លក)lɔlɔɔklɔlɔɔk
Passedរបស់ (respelling: រ-បស់, រ'-បស់)rɔbɑh, rəbɑhrɔbɑh, rəbɑh
Passedបរិភោគ (respelling: បរ៉ិភោក)bɑɑrephookbɑɑrephook
Passedធំ (respelling: ថុំ)thomthom
Passedវចនានុក្រម (respelling: វៈ-ចៈ-ន៉ា-នុ-ក្រំ)vĕəʼcaʼnaanukrɑmvĕəʼcaʼnaanukrɑm
Passedសាសន (respelling: សាសៈន៉ៈ)saasaʼnaʼsaasaʼnaʼ
Passedសាសនា (respelling: សា-ស្នា)saasnaasaasnaa
Passedកិរិយា (respelling: កិរិយ៉ា)keriyaakeriyaa
Passedល្អូកល្អិនlʼouklʼənlʼouklʼən
Passedឆ្ងាញ់chngañchngañ
Passedប្រធានាធិបតី (respelling: ប្រ់ធានាធិបប៉ៈដី)prɑthiəniəthɨppaʼdəyprɑthiəniəthɨppaʼdəy
Passedឧសភា (respelling: អុសៈភា, អ៊ុសៈភា)ʼosaʼphiə, ʼusaʼphiəʼosaʼphiə, ʼusaʼphiə
Passedហ្វៃហ្វា (respelling: វ៉ៃ-វ៉ា, ហ្វៃ-ហ្វា)vayvaa, fayfaavayvaa, fayfaa
Passedកម្មវិធី (respelling: ក័មវិធី, ក័ម្មៈវិធី, ក័ម្ម៉ៈវិធី)kamvithii, kammĕəʼvithii, kammaʼvithiikamvithii, kammĕəʼvithii, kammaʼvithii
Passedរថ (respelling: រត់)rŭətrŭət
Passedកម្ពុជា (respelling: ក័មពុជា)kampuciəkampuciə
Passedរុស្ស៊ី (respelling: រុស៊ី)rusiirusii
Passedចក្រ (respelling: ច័ក, ច័ក-ក្រៈ-)cak, cakkraʼcak, cakkraʼ
Passedអម្ពិល (respelling: អំពិល)ʼɑmpɨlʼɑmpɨl
Passedចក្រយាន (respelling: ច័ក-ក្រ់-យាន)cakkrɑyiəncakkrɑyiən

--- Reference: 'Khmer pronouncing dictionary: standard Khmer and Phnom Penh dialect'
--- https://unesdoc.unesco.org/ark:/48223/pf0000246360

local export = {}

local gsub = mw.ustring.gsub
local find = mw.ustring.find
local match = mw.ustring.match
local len = mw.ustring.len
local pagename = mw.title.getCurrentTitle().text

local j = "្"
local c = "កខគឃងចឆជឈញដឋឌឍណតថទធនបផពភមយរលវឝឞសហឡអ"
local cMod = "៉៊"
local vIndep = "ឣឤឥឦឧឨឩឪឫឬឭឮឯឰឱឲឳ"
local vDiac = "ាិីឹឺុូួើឿៀេែៃោៅំះៈ័៏"
local vPost = "់"
local apos = "'"

local kmChar = "ក-៹'"
local kmString = "+"
local recessive = ""

local cCapt, cUncapt = "(?)", "?"
local cOptCapt = "(??)"
local cCaptClus = {
	"(?)",
	"(?" .. j .. cUncapt .. ")",
	"(?" .. j .. cUncapt .. j .. cUncapt .. ")",
	"(?" .. j .. cUncapt .. j .. cUncapt .. j .. cUncapt .. ")"
}
local vCapt, vCaptB, vCaptM = "()", "()", "(*)"
local cvCapt = "()"
local vPostCapt = "(?)"

local postInit = vCaptM .. cOptCapt .. vPostCapt .. "(" .. apos .. "?)"

local consonants = {
	 = { class = 1,  = { "k", "k" },  = { "k", "k" } },
	 = { class = 1,  = { "kʰ", "k" },  = { "kh", "k" } },
	 = { class = 2,  = { "k", "k" },  = { "k", "k" } },
	 = { class = 2,  = { "kʰ", "k" },  = { "kh", "k" } },
	 = { class = 2,  = { "ŋ", "ŋ" },  = { "ng", "ng" } },
	 = { class = 1,  = { "ŋ", "ŋ" },  = { "ng", "ng" } },
	 = { class = 1,  = { "c", "c" },  = { "c", "c" } },
	 = { class = 1,  = { "cʰ", "c" },  = { "ch", "c" } },
	 = { class = 2,  = { "c", "c" },  = { "c", "c" } },
	 = { class = 2,  = { "cʰ", "c" },  = { "ch", "c" } },
	 = { class = 2,  = { "ɲ", "ɲ" },  = { "ñ", "ñ" } },
	 = { class = 1,  = { "ɲ", "ɲ" },  = { "ñ", "ñ" } },
	 = { class = 1,  = { "ɗ", "t" },  = { "d", "t" } },
	 = { class = 1,  = { "tʰ", "t" },  = { "th", "t" } },
	 = { class = 2,  = { "ɗ", "t" },  = { "d", "t" } },
	 = { class = 2,  = { "tʰ", "t" },  = { "th", "t" } },
	 = { class = 1,  = { "n", "n" },  = { "n", "n" } },
	 = { class = 1,  = { "t", "t" },  = { "t", "t" } },
	 = { class = 1,  = { "tʰ", "t" },  = { "th", "t" } },
	 = { class = 2,  = { "t", "t" },  = { "t", "t" } },
	 = { class = 2,  = { "tʰ", "t" },  = { "th", "t" } },
	 = { class = 2,  = { "n", "n" },  = { "n", "n" } },
	 = { class = 1,  = { "n", "n" },  = { "n", "n" } },
	 = { class = 1,  = { "ɓ", "p" },  = { "b", "p" } },
	 = { class = 1,  = { "p", "p" },  = { "p", "p" } },
	 = { class = 2,  = { "ɓ", "p" },  = { "b", "p" } },
	 = { class = 1,  = { "pʰ", "p" },  = { "ph", "p" } },
	 = { class = 2,  = { "p", "p" },  = { "p", "p" } },
	 = { class = 2,  = { "pʰ", "p" },  = { "ph", "p" } },
	 = { class = 2,  = { "m", "m" },  = { "m", "m" } },
	 = { class = 1,  = { "m", "m" },  = { "m", "m" } },
	 = { class = 2,  = { "j", "j" },  = { "y", "y" } },
	 = { class = 1,  = { "j", "j" },  = { "y", "y" } },
	 = { class = 2,  = { "r", "" },  = { "r", "" } },
	 = { class = 1,  = { "r", "" },  = { "r", "" } },
	 = { class = 2,  = { "l", "l" },  = { "l", "l" } },
	 = { class = 1,  = { "l", "l" },  = { "l", "l" } },
	 = { class = 2,  = { "ʋ", "w" },  = { "v", "w" } },
	 = { class = 1,  = { "ʋ", "w" },  = { "v", "w" } },
	 = { class = 1,  = { "s", "h" },  = { "s", "h" } },
	 = { class = 1,  = { "s", "h" },  = { "s", "h" } },
	 = { class = 1,  = { "s", "h" },  = { "s", "h" } },
	 = { class = 2,  = { "s", "h" },  = { "s", "h" } },
	 = { class = 1,  = { "h", "h" },  = { "h", "h" } },
	 = { class = 2,  = { "h", "h" },  = { "h", "h" } },
	 = { class = 1,  = { "l", "l" },  = { "l", "l" } },
	 = { class = 1,  = { "ʔ", "" },  = { "ʼ", "ʼ" } },
	 = { class = 2,  = { "ʔ", "" },  = { "ʼ", "ʼ" } },
	
	 = { class = 1,  = { "ɡ", "k" },  = { "g", "k" } },
	 = { class = 2,  = { "ɡ", "k" },  = { "g", "k" } },
     = { class = 2,  = { "ɡ", "k" },  = { "g", "k" } },
	 = { class = 1,  = { "n", "" },  = { "n", "n" } },
	 = { class = 1,  = { "m", "" },  = { "m", "m" } },
	 = { class = 1,  = { "l", "" },  = { "l", "l" } },
	 = { class = 1,  = { "f", "f" },  = { "f", "f" } },
	 = { class = 2,  = { "f", "f" },  = { "f", "f" } },
	 = { class = 1,  = { "z", "z" },  = { "z", "z" } },
	 = { class = 2,  = { "z", "z" },  = { "z", "z" } },
	
	 = { class = 1,  = { "", "" },  = { "", "" } },
}

local vowels = {
	 = {  = { "ɑː", "ɔː" },  = { "ɑɑ", "ɔɔ" } },
     = {  = { "ɑ", "ɔ" },  = { "ɑ", "ɔ" } },
	 = {  = { "ɑ", "ŭə" },  = { "ɑ", "ŭə" } },
	 = {  = { "ɑ", "u" },  = { "ɑ", "u" } }, --before labial finals
	 = {  = { "a", "ŏə" },  = { "a", "ŏə" } },
	 = {  = { "a", "ĕə" },  = { "a", "ĕə" } }, --before velar finals
	 = {  = { "aj", "ɨj" },  = { "ay", "ɨy" } },
	 = {  = { "aə", "ŏə" },  = { "", "ɔə" } },
	 = {  = { "aː", "iə" },  = { "aa", "iə" } },
	 = {  = { "a", "ŏə" },  = { "a", "ŏə" } },
	 = {  = { "a", "ĕə" },  = { "a", "ĕə" } }, --before velar finals
	 = {  = { "eʔ", "iʔ" },  = { "eʼ", "iʼ" } }, --glottal coda only in stressed syllables
	 = {  = { "ə", "ɨ" },  = { "ə", "ɨ" } }, --with non-glottal coda
	 = {  = { "əj", "iː" },  = { "əy", "ii" } },
	 = {  = { "eh", "ih" },  = { "eh", "ih" } }, -- inferred
	 = {  = { "əj", "iː" },  = { "əy", "ii" } },
	 = {  = { "ə", "ɨ" },  = { "ə", "ɨ" } },
	 = {  = { "əh", "ɨh" },  = { "əh", "ɨh" } },
	 = {  = { "əɨ", "ɨː" },  = { "əɨ", "ɨɨ" } },
	 = {  = { "oʔ", "uʔ" },  = { "oʼ", "uʼ" } }, --glottal coda only in stressed syllables
	 = {  = { "o", "u" },  = { "o", "u"  }}, --with non-glottal coda
	 = {  = { "oh", "uh" },  = { "oh", "uh" } },
	 = {  = { "ou", "uː" },  = { "ou", "uu" } },
	 = {  = { "əw", "ɨw" },  = { "əw", "ɨw" } },
	 = {  = { "uə", "uə" },  = { "uə", "uə" } },
	 = {  = { "aə", "əː" },  = { "aə", "əə" } },
	 = {  = { "aəh", "əh" },  = { "əh", "" } },
	 = {  = { "ɨə", "ɨə" },  = { "ɨə", "ɨə" } },
	 = {  = { "iə", "iə" },  = { "iə", "iə" } },
	 = {  = { "eː", "ei" },  = { "ee", "ei" } },
	 = {  = { "ə", "ɨ" },  = { "ə", "ɨ" } }, --before palatals
	 = {  = { "eh", "ih" },  = { "eh", "ih" } },
	 = {  = { "ae", "ɛː" },  = { "ae", "ɛɛ" } },
	 = {  = { "aeh", "ɛh" },  = { "eh", "" } },
	 = {  = { "aj", "ɨj" },  = { "ay", "ɨy" } },
	 = {  = { "ao", "oː" },  = { "ao", "oo" } },
	 = {  = { "ɑh", "ŭəh" },  = { "ɑh", "ŭəh" } },
	 = {  = { "aw", "ɨw" },  = { "aw", "ɨw" } },
	 = {  = { "om", "um" },  = { "om", "um" } },
	 = {  = { "ɑm", "um" },  = { "ɑm", "um" } },
	 = {  = { "am", "ŏəm" },  = { "am", "ŏəm" } },
	 = {  = { "aŋ", "ĕəŋ" },  = { "ang", "ĕəng" } },
	 = {  = { "ah", "ĕəh" },  = { "ah", "ĕəh" } },
	 = {  = { "aʔ", "ĕəʔ" },  = { "aʼ", "ĕəʼ" } },
	 = {  = { "ə", "ə" },  = { "ə", "ə" } },
}

local tl = {
	 = "k",  = "kʰ",  = "g",  = "gʰ",  = "ṅ", 
	 = "c",  = "cʰ",  = "j",  = "jʰ",  = "ñ", 
	 = "ṭ",  = "ṭʰ",  = "ḍ",  = "ḍʰ",  = "ṇ", 
	 = "t",  = "tʰ",  = "d",  = "dʰ",  = "n",
	 = "p",  = "pʰ",  = "b",  = "bʰ",  = "m",
	 = "y",  = "r",  = "l",  = "v",
	 = "ś",  = "ṣ",  = "s", 
	 = "h",  = "ḷ",  = "ʼ", 

	 = "a",  = "ā",  = "i",  = "ī", 
	 = "u",  = "uk",  = "ū",  = "uv", 
	 = "ṛ",  = "ṝ",  = "ḷ",  = "ḹ", 
	 = "e",  = "ai",  = "o",  = "o",  = "au",
	
	 = "ā",  = "i",  = "ī",  = "ẏ",  = "ȳ", 
	 = "u",  = "ū",  = "ua",
	 = "oe",  = "ẏa",  = "ia", 
	 = "e",  = "ae",  = "ai",  = "o",  = "au", 
	 = "ṃ",  = "ḥ",  = "`",
	
	 = "″",  = "′",  = "´",  = "ŕ",  = "̊", 
	 = "⸗",  = "ʿ",  = "˘",  = "̑",  = "̥",
	 = "🤷",  = "ǂ",  = "ǁ",  = "🤷",  = "«", 
	 = "🤷",  = "§",  = "»",  = "", 
	 = "🤷",  = "🤷",
	
	 = "0",  = "1",  = "2",  = "3",  = "4", 
	 = "5",  = "6",  = "7",  = "8",  = "9", 
	 = "🤷",  = "🤷",  = "🤷",  = "🤷",  = "🤷",
	 = "🤷",  = "🤷",  = "🤷",  = "🤷",  = "🤷",
}

local glottify = {
	 = 1,  = 1,  = 1,  = 1,  = 1,  = 1,
	 = 1,  = 1,  = 1,  = 1,  = 1
}

local err = {
	 = 1,  = 1,
}

local ambig = {
	 = "k​h",  = "c​h",  = "t​h",  = "p​h",
	 = "n​g",
}

function export.syllabify(text)
	text = gsub(text, "()()", "%1-%2")
	local seq1 = cvCapt .. cCapt .. vCaptB
	while find(text, seq1) do text = gsub(text, seq1, "%1-%2%3") end
	return text
end

function export.syl_analysis(syllable)
	for ind = 4, 1, -1 do
		if match(syllable, "^" .. cCaptClus .. postInit .. "$") then
			return match(syllable, "^" .. cCaptClus .. postInit .. "$")
		end
	end
	return nil
end

local function sylRedist(text, block)
	for word in mw.ustring.gmatch(text, "+") do
		local originalWord = word
		local allSyl, syls, newWord = {}, mw.text.split(word, "%-"), {}
		for sylId = 1, #syls do
			if syls == "" then table.insert(allSyl, {})
			else
				local set = export.syl_analysis(syls)
				if not set or set == "" then return nil end
				table.insert(allSyl, { export.syl_analysis(syls) })
				if sylId ~= 1 and allSyl == "" and find(allSyl, j) and not block then
					allSyl, allSyl =
						match(allSyl, "^(+)"),
						match(allSyl, "^+" .. j .. "(.+)")
				end
				if #syls == 2 and sylId == 2 and allSyl .. allSyl == "" then
					allSyl = vPost
				end
			end
		end
		for sylId = 1, #syls do
			table.insert(newWord, table.concat(allSyl))
		end
		text = gsub(text, (gsub(originalWord, "%-", "%-")), table.concat(newWord, "%-"), 1)
	end
	return text
end

local function getCons(c1Set)
	local c1l, i, consSet = #c1Set, 1, {}
	while i < c1l + 1 do
		for j = 3, 1, -1 do
			local conss = i + j - 1 > c1l and "a" or table.concat(c1Set, "", i, i + j - 1)
			if consonants then
				table.insert(consSet, conss)
				i = i + j
				break
			end
			if j == 1 then return nil end
		end
	end
	return consSet
end

local function initClus(c1, mode)
	local fittest, init, cData, pos = "", {}, {}, 1
	c1 = gsub(c1, j, "")
	if consonants then
		local cData = consonants
		c1, fittest = cData, cData.class
	else
		local consSet = getCons(mw.text.split(c1, ""))
		if not consSet then return error("Error handling initial " .. c1 .. ".") end
		for seq, ch in ipairs(consSet) do
			local cData = consonants
			fittest = (not find(cData, recessive) and not find(cData, "ng")
				or (fittest == "" and seq == #consSet)) 
				and cData.class or fittest
			table.insert(init, cData)
		end
		c1 = table.concat(init)
	end
	
	c1 = gsub(c1, "(.)", "p%1")
    --Very rare in native/Indic words, worst case can be respelt (ដ្បិត)​. Keep /d/ for borrowings from French / English (sodium, hydro-).
	--c1 = gsub(c1, "(.)", "t%1")
	if mode == "ipa" then
		c1 = gsub(c1, "p()", "pʰ%1")
		c1 = gsub(c1, "pʰ()", "p%1")
		c1 = gsub(c1, "t()", "tʰ%1")
		c1 = gsub(c1, "tʰ()", "t%1")
		c1 = gsub(c1, "k()", "kʰ%1")
		c1 = gsub(c1, "kʰ()", "k%1")
		c1 = gsub(c1, "c()", "cʰ%1")
		c1 = gsub(c1, "cʰ()", "c%1")
	end
	return c1, fittest
end

local function rime(v1, c2, fittest, red, mode)
	if red == apos then v1 = red end
	if vowels then return vowels end
	c2 = consonants or c2
	if ((v1 == "័" or v1 == "ា់") and (find(c2, "") or c2 == "ng")) or
		(v1 == "េ" and (find(c2, "") or c2 == "ñ")) or
		(v1 == "់" and find(c2, "")) or
		((v1 == "ិ" or v1 == "ុ") and c2 ~= "") then
		v1 = v1 .. "2"
	end
	v1 = vowels and vowels or v1
	if (glottify and mode == "ipa") and c2 == "k" then c2 = "ʡ" end --proxy
	return v1 .. c2
end

function export.convert(text, mode, source)
	local block = find(text, "%-")
	text = sylRedist(export.syllabify(text), block)
	if not text then return nil end
	
	for syllable in mw.ustring.gmatch(text, kmString) do
		local unchanged, sylStruc = syllable, {}
		local c1, v1, c2, bantak, red = export.syl_analysis(syllable)
		if not c1 then return nil end
		local fittest
		c1, fittest = initClus(c1, mode)
		if source == "temp" and (err or err) then
			require("Module:debug").track("km-pron/error-prone finals")
		end
		local v1c2 = rime(v1 .. bantak, c2, fittest, red, mode)
		if not v1c2 then return nil end
		text = gsub(text, unchanged, c1 .. v1c2, 1)
	end
	
	text = gsub(text, "(.%%%-.)", ambig)
	text = gsub(text, "%%", "")
	text = gsub(text, "%-", ".")
	text = gsub(text, "​", "-")
	text = gsub(text, "ʔ()", "%1")
	text = gsub(text, "ŭə%.", "ɔ.")
	text = gsub(text, "()%.", "%1.")
	text = gsub(text, "ʡ%.s", "k.s")
	text = gsub(text, "ʡ", "ʔ")
	if mode == "tc" then
		text = gsub(text, "%.%.%.", "…")
		text = gsub(text, "%.", "")
	else
		text = gsub(text, "%-", ".")
		local readings = {}
		for reading in mw.text.gsplit(text, ", ") do
			table.insert(readings, (gsub(reading, "^(+)%.(+)$", "%1.ˈ%2")))
		end
		text = table.concat(readings, ", ")
		text = gsub(text, "^(+) (+)$", "%1 ˈ%2")
	end
	return text
end

-- convert Cŕ to ŕC
local function repha(text)
	text = text:gsub("(\225\158)៌","៌%1")
	return text
end

local function return_error()
	return error("The entry title or respelling contains zero-space width character. Please remove it.")
end

function export.make(frame)
	local params = {
		 = { list = true },
		 = {},
		 = { alias_of = "a" },
		 = { default = pagename },
	}
	local args = require("Module:parameters").process(frame:getParent().args, params)
	local output_text, respellings, transcriptions, ipas = {}, {}, {}, {}
	
	if find(pagename, "​") then return_error() end
	if #args == 0 then args = { args.word } end
	for _, param in ipairs(args) do
		if find(param, "​") then return_error() end
		table.insert(respellings, export.syllabify(param))
		table.insert(transcriptions, export.convert(param, "tc", "temp"))
		table.insert(ipas, export.convert(param, "ipa"))
	end
	separate = (gsub(table.concat(respellings), "", "")) ~= args.word
	respelling = table.concat(respellings, " / ")
	
	local function row(a, b, class, lang, size)
		return "\n<tr>" .. 
			
		tostring( mw.html.create( "td" )
			:css( "padding-right", "0.8em" )
			:css( "padding-left", "0.7em" )
			:css( "font-size", "10.5pt" )
			:css( "color", "#555" )
			:css( "font-weight", "bold" )
			:css( "background-color", "#F8F9F8" )
			:wikitext(a)) .. "\n" ..
		
		tostring( mw.html.create( "td" )
			:css( "padding-left", "0.8em" )
			:css( "padding-right", "0.8em" )
			:css( "padding-top", ".4em" )
			:css( "padding-bottom", ".4em" )
			:wikitext(b)) ..
		
		"</tr>"
	end
	
	local function textFormat(text, class, size, lang)
		return tostring( mw.html.create( "span" )
			:attr( "class", class or "Khmr" )
			:css( "font-size", size or (class == "IPA" and "95%" or "130%") )
			:attr( "lang", lang or (class == "IPA" and nil or "km") )
			:wikitext(text))
	end
	
	table.insert(output_text, 
	[=[{| style="margin: 0 .4em .4em .4em"
	|
	<table cellpadding=1 style="border: 1px solid #DFDFDF; text-align: center; line-height: 25pt; padding: .1em .3em .1em .3em">]=] ..

	row(separate
			and "'']''"
			or "'']''", 
		textFormat(args.word) .. "<br>" .. textFormat(gsub(gsub(repha(args.word), ".", tl), "ʰ̥", "̥ʰ"), "IPA")
	) ..
	
	(separate
		and row("'']''", 
			textFormat(respelling) .. "<br>" ..
			textFormat(gsub(gsub(respelling, ".", tl), "ʰ̥", "̥ʰ"), "IPA"))
		or "") ..
	
	row("'']''",
		textFormat(table.concat(transcriptions, ", "), "IPA", "100%")
	) ..
	
	row(
		"('']'') ]" .. 
		"<sup>(])</sup>",
		textFormat("/" .. table.concat(ipas, "/ ~ /") .. "/", "IPA", "110%")
	) ..
	
	(args.a and row("Audio", require("Module:audio").format_audio {
		lang = require("Module:languages").getByCode("km"),
		file = args.a == "y" and "Km-" .. args.word .. ".ogg" or args.a
	}) or ""
	) ..

	"</table>\n|}" .. "]")
	
	return table.concat(output_text)
end

return export