Jump to content

Module:km-pron

From Wiktionary, the free dictionary

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 = "[" .. kmChar .. "]+"
local recessive = "[ŋɲñnmjyrlʋv]"

local cCapt, cUncapt = "([" .. c .. "][" .. cMod .. "]?)", "[" .. c .. "][" .. cMod .. "]?"
local cOptCapt = "([" .. c .. "]?[" .. cMod .. "]?)"
local cCaptClus = {
	"([" .. c .. "][" .. cMod .. "]?)",
	"([" .. c .. "][" .. cMod .. "]?" .. j .. cUncapt .. ")",
	"([" .. c .. "][" .. cMod .. "]?" .. j .. cUncapt .. j .. cUncapt .. ")",
	"([" .. c .. "][" .. cMod .. "]?" .. j .. cUncapt .. j .. cUncapt .. j .. cUncapt .. ")"
}
local vCapt, vCaptB, vCaptM = "([" .. vDiac .. "])", "([" .. vDiac .. j .. "])", "([" .. vDiac .. "]*)"
local cvCapt = "([" .. c .. cMod .. vDiac .. "])"
local vPostCapt = "([" .. vPost .. "]?)"

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

local consonants = {
	["ក"] = { class = 1, ["ipa"] = { "k", "k" }, ["tc"] = { "k", "k" } },
	["ខ"] = { class = 1, ["ipa"] = { "kʰ", "k" }, ["tc"] = { "kh", "k" } },
	["គ"] = { class = 2, ["ipa"] = { "k", "k" }, ["tc"] = { "k", "k" } },
	["ឃ"] = { class = 2, ["ipa"] = { "kʰ", "k" }, ["tc"] = { "kh", "k" } },
	["ង"] = { class = 2, ["ipa"] = { "ŋ", "ŋ" }, ["tc"] = { "ng", "ng" } },
	["ង៉"] = { class = 1, ["ipa"] = { "ŋ", "ŋ" }, ["tc"] = { "ng", "ng" } },
	["ច"] = { class = 1, ["ipa"] = { "c", "c" }, ["tc"] = { "c", "c" } },
	["ឆ"] = { class = 1, ["ipa"] = { "cʰ", "c" }, ["tc"] = { "ch", "c" } },
	["ជ"] = { class = 2, ["ipa"] = { "c", "c" }, ["tc"] = { "c", "c" } },
	["ឈ"] = { class = 2, ["ipa"] = { "cʰ", "c" }, ["tc"] = { "ch", "c" } },
	["ញ"] = { class = 2, ["ipa"] = { "ɲ", "ɲ" }, ["tc"] = { "ñ", "ñ" } },
	["ញ៉"] = { class = 1, ["ipa"] = { "ɲ", "ɲ" }, ["tc"] = { "ñ", "ñ" } },
	["ដ"] = { class = 1, ["ipa"] = { "ɗ", "t" }, ["tc"] = { "d", "t" } },
	["ឋ"] = { class = 1, ["ipa"] = { "tʰ", "t" }, ["tc"] = { "th", "t" } },
	["ឌ"] = { class = 2, ["ipa"] = { "ɗ", "t" }, ["tc"] = { "d", "t" } },
	["ឍ"] = { class = 2, ["ipa"] = { "tʰ", "t" }, ["tc"] = { "th", "t" } },
	["ណ"] = { class = 1, ["ipa"] = { "n", "n" }, ["tc"] = { "n", "n" } },
	["ត"] = { class = 1, ["ipa"] = { "t", "t" }, ["tc"] = { "t", "t" } },
	["ថ"] = { class = 1, ["ipa"] = { "tʰ", "t" }, ["tc"] = { "th", "t" } },
	["ទ"] = { class = 2, ["ipa"] = { "t", "t" }, ["tc"] = { "t", "t" } },
	["ធ"] = { class = 2, ["ipa"] = { "tʰ", "t" }, ["tc"] = { "th", "t" } },
	["ន"] = { class = 2, ["ipa"] = { "n", "n" }, ["tc"] = { "n", "n" } },
	["ន៉"] = { class = 1, ["ipa"] = { "n", "n" }, ["tc"] = { "n", "n" } },
	["ប"] = { class = 1, ["ipa"] = { "ɓ", "p" }, ["tc"] = { "b", "p" } },
	["ប៉"] = { class = 1, ["ipa"] = { "p", "p" }, ["tc"] = { "p", "p" } },
	["ប៊"] = { class = 2, ["ipa"] = { "ɓ", "p" }, ["tc"] = { "b", "p" } },
	["ផ"] = { class = 1, ["ipa"] = { "pʰ", "p" }, ["tc"] = { "ph", "p" } },
	["ព"] = { class = 2, ["ipa"] = { "p", "p" }, ["tc"] = { "p", "p" } },
	["ភ"] = { class = 2, ["ipa"] = { "pʰ", "p" }, ["tc"] = { "ph", "p" } },
	["ម"] = { class = 2, ["ipa"] = { "m", "m" }, ["tc"] = { "m", "m" } },
	["ម៉"] = { class = 1, ["ipa"] = { "m", "m" }, ["tc"] = { "m", "m" } },
	["យ"] = { class = 2, ["ipa"] = { "j", "j" }, ["tc"] = { "y", "y" } },
	["យ៉"] = { class = 1, ["ipa"] = { "j", "j" }, ["tc"] = { "y", "y" } },
	["រ"] = { class = 2, ["ipa"] = { "r", "" }, ["tc"] = { "r", "" } },
	["រ៉"] = { class = 1, ["ipa"] = { "r", "" }, ["tc"] = { "r", "" } },
	["ល"] = { class = 2, ["ipa"] = { "l", "l" }, ["tc"] = { "l", "l" } },
	["ល៉"] = { class = 1, ["ipa"] = { "l", "l" }, ["tc"] = { "l", "l" } },
	["វ"] = { class = 2, ["ipa"] = { "ʋ", "w" }, ["tc"] = { "v", "w" } },
	["វ៉"] = { class = 1, ["ipa"] = { "ʋ", "w" }, ["tc"] = { "v", "w" } },
	["ឝ"] = { class = 1, ["ipa"] = { "s", "h" }, ["tc"] = { "s", "h" } },
	["ឞ"] = { class = 1, ["ipa"] = { "s", "h" }, ["tc"] = { "s", "h" } },
	["ស"] = { class = 1, ["ipa"] = { "s", "h" }, ["tc"] = { "s", "h" } },
	["ស៊"] = { class = 2, ["ipa"] = { "s", "h" }, ["tc"] = { "s", "h" } },
	["ហ"] = { class = 1, ["ipa"] = { "h", "h" }, ["tc"] = { "h", "h" } },
	["ហ៊"] = { class = 2, ["ipa"] = { "h", "h" }, ["tc"] = { "h", "h" } },
	["ឡ"] = { class = 1, ["ipa"] = { "l", "l" }, ["tc"] = { "l", "l" } },
	["អ"] = { class = 1, ["ipa"] = { "ʔ", "" }, ["tc"] = { "ʼ", "ʼ" } },
	["អ៊"] = { class = 2, ["ipa"] = { "ʔ", "" }, ["tc"] = { "ʼ", "ʼ" } },
	
	["ហក"] = { class = 1, ["ipa"] = { "ɡ", "k" }, ["tc"] = { "g", "k" } },
	["ហគ"] = { class = 2, ["ipa"] = { "ɡ", "k" }, ["tc"] = { "g", "k" } },
    ["ហគ៊"] = { class = 2, ["ipa"] = { "ɡ", "k" }, ["tc"] = { "g", "k" } },
	["ហន"] = { class = 1, ["ipa"] = { "n", "" }, ["tc"] = { "n", "n" } },
	["ហម"] = { class = 1, ["ipa"] = { "m", "" }, ["tc"] = { "m", "m" } },
	["ហល"] = { class = 1, ["ipa"] = { "l", "" }, ["tc"] = { "l", "l" } },
	["ហវ"] = { class = 1, ["ipa"] = { "f", "f" }, ["tc"] = { "f", "f" } },
	["ហវ៊"] = { class = 2, ["ipa"] = { "f", "f" }, ["tc"] = { "f", "f" } },
	["ហស"] = { class = 1, ["ipa"] = { "z", "z" }, ["tc"] = { "z", "z" } },
	["ហស៊"] = { class = 2, ["ipa"] = { "z", "z" }, ["tc"] = { "z", "z" } },
	
	[""] = { class = 1, ["ipa"] = { "", "" }, ["tc"] = { "", "" } },
}

local vowels = {
	[""] = { ["ipa"] = { "ɑː", "ɔː" }, ["tc"] = { "ɑɑ", "ɔɔ" } },
    ["៏"] = { ["ipa"] = { "ɑ", "ɔ" }, ["tc"] = { "ɑ", "ɔ" } },
	["់"] = { ["ipa"] = { "ɑ", "ŭə" }, ["tc"] = { "ɑ", "ŭə" } },
	["់2"] = { ["ipa"] = { "ɑ", "u" }, ["tc"] = { "ɑ", "u" } }, --before labial finals
	["័"] = { ["ipa"] = { "a", "ŏə" }, ["tc"] = { "a", "ŏə" } },
	["័2"] = { ["ipa"] = { "a", "ĕə" }, ["tc"] = { "a", "ĕə" } }, --before velar finals
	["័យ"] = { ["ipa"] = { "aj", "ɨj" }, ["tc"] = { "ay", "ɨy" } },
	["័រ"] = { ["ipa"] = { "aə", "ŏə" }, ["tc"] = { "", "ɔə" } },
	["ា"] = { ["ipa"] = { "aː", "iə" }, ["tc"] = { "aa", "iə" } },
	["ា់"] = { ["ipa"] = { "a", "ŏə" }, ["tc"] = { "a", "ŏə" } },
	["ា់2"] = { ["ipa"] = { "a", "ĕə" }, ["tc"] = { "a", "ĕə" } }, --before velar finals
	["ិ"] = { ["ipa"] = { "eʔ", "iʔ" }, ["tc"] = { "eʼ", "iʼ" } }, --glottal coda only in stressed syllables
	["ិ2"] = { ["ipa"] = { "ə", "ɨ" }, ["tc"] = { "ə", "ɨ" } }, --with non-glottal coda
	["ិយ"] = { ["ipa"] = { "əj", "iː" }, ["tc"] = { "əy", "ii" } },
	["ិះ"] = { ["ipa"] = { "eh", "ih" }, ["tc"] = { "eh", "ih" } }, --["tc"] inferred
	["ី"] = { ["ipa"] = { "əj", "iː" }, ["tc"] = { "əy", "ii" } },
	["ឹ"] = { ["ipa"] = { "ə", "ɨ" }, ["tc"] = { "ə", "ɨ" } },
	["ឹះ"] = { ["ipa"] = { "əh", "ɨh" }, ["tc"] = { "əh", "ɨh" } },
	["ឺ"] = { ["ipa"] = { "əɨ", "ɨː" }, ["tc"] = { "əɨ", "ɨɨ" } },
	["ុ"] = { ["ipa"] = { "oʔ", "uʔ" }, ["tc"] = { "oʼ", "uʼ" } }, --glottal coda only in stressed syllables
	["ុ2"] = { ["ipa"] = { "o", "u" }, ["tc"] = { "o", "u"  }}, --with non-glottal coda
	["ុះ"] = { ["ipa"] = { "oh", "uh" }, ["tc"] = { "oh", "uh" } },
	["ូ"] = { ["ipa"] = { "ou", "uː" }, ["tc"] = { "ou", "uu" } },
	["ូវ"] = { ["ipa"] = { "əw", "ɨw" }, ["tc"] = { "əw", "ɨw" } },
	["ួ"] = { ["ipa"] = { "uə", "uə" }, ["tc"] = { "uə", "uə" } },
	["ើ"] = { ["ipa"] = { "aə", "əː" }, ["tc"] = { "aə", "əə" } },
	["ើះ"] = { ["ipa"] = { "aəh", "əh" }, ["tc"] = { "əh", "" } },
	["ឿ"] = { ["ipa"] = { "ɨə", "ɨə" }, ["tc"] = { "ɨə", "ɨə" } },
	["ៀ"] = { ["ipa"] = { "iə", "iə" }, ["tc"] = { "iə", "iə" } },
	["េ"] = { ["ipa"] = { "eː", "ei" }, ["tc"] = { "ee", "ei" } },
	["េ2"] = { ["ipa"] = { "ə", "ɨ" }, ["tc"] = { "ə", "ɨ" } }, --before palatals
	["េះ"] = { ["ipa"] = { "eh", "ih" }, ["tc"] = { "eh", "ih" } },
	["ែ"] = { ["ipa"] = { "ae", "ɛː" }, ["tc"] = { "ae", "ɛɛ" } },
	["ែះ"] = { ["ipa"] = { "aeh", "ɛh" }, ["tc"] = { "eh", "" } },
	["ៃ"] = { ["ipa"] = { "aj", "ɨj" }, ["tc"] = { "ay", "ɨy" } },
	["ោ"] = { ["ipa"] = { "ao", "oː" }, ["tc"] = { "ao", "oo" } },
	["ោះ"] = { ["ipa"] = { "ɑh", "ŭəh" }, ["tc"] = { "ɑh", "ŭəh" } },
	["ៅ"] = { ["ipa"] = { "aw", "ɨw" }, ["tc"] = { "aw", "ɨw" } },
	["ុំ"] = { ["ipa"] = { "om", "um" }, ["tc"] = { "om", "um" } },
	["ំ"] = { ["ipa"] = { "ɑm", "um" }, ["tc"] = { "ɑm", "um" } },
	["ាំ"] = { ["ipa"] = { "am", "ŏəm" }, ["tc"] = { "am", "ŏəm" } },
	["ាំង"] = { ["ipa"] = { "aŋ", "ĕəŋ" }, ["tc"] = { "ang", "ĕəng" } },
	["ះ"] = { ["ipa"] = { "ah", "ĕəh" }, ["tc"] = { "ah", "ĕəh" } },
	["ៈ"] = { ["ipa"] = { "aʔ", "ĕəʔ" }, ["tc"] = { "aʼ", "ĕəʼ" } },
	["'"] = { ["ipa"] = { "ə", "ə" }, ["tc"] = { "ə", "ə" } },
}

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 = {
	["a"] = 1, ["aː"] = 1, ["ɑ"] = 1, ["ɑː"] = 1, ["ɔ"] = 1, ["ɔː"] = 1,
	["ĕə"] = 1, ["ŭə"] = 1, ["iə"] = 1, ["ɨə"] = 1, ["uə"] = 1
}

local err = {
	["័"] = 1, ["័រ"] = 1,
}

local ambig = {
	["k%-h"] = "k​h", ["c%-h"] = "c​h", ["t%-h"] = "t​h", ["p%-h"] = "p​h",
	["n%-g"] = "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[ind] .. postInit .. "$") then
			return match(syllable, "^" .. cCaptClus[ind] .. postInit .. "$")
		end
	end
	return nil
end

local function sylRedist(text, block)
	for word in mw.ustring.gmatch(text, "[" .. kmChar .. "%-]+") do
		local originalWord = word
		local allSyl, syls, newWord = {}, mw.text.split(word, "%-"), {}
		for sylId = 1, #syls do
			if syls[sylId] == "" then table.insert(allSyl, {})
			else
				local set = export.syl_analysis(syls[sylId])
				if not set or set == "" then return nil end
				table.insert(allSyl, { export.syl_analysis(syls[sylId]) })
				if sylId ~= 1 and allSyl[sylId - 1][3] == "" and find(allSyl[sylId][1], j) and not block then
					allSyl[sylId - 1][3], allSyl[sylId][1] =
						match(allSyl[sylId][1], "^([^" .. j .. "]+)"),
						match(allSyl[sylId][1], "^[^" .. j .. "]+" .. j .. "(.+)")
				end
				if #syls == 2 and sylId == 2 and allSyl[sylId - 1][2] .. allSyl[sylId - 1][4] == "" then
					allSyl[sylId - 1][4] = vPost
				end
			end
		end
		for sylId = 1, #syls do
			table.insert(newWord, table.concat(allSyl[sylId]))
		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[conss] 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[c1] then
		local cData = consonants[c1]
		c1, fittest = cData[mode][pos], 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[ch]
			fittest = (not find(cData[mode][pos], recessive) and not find(cData[mode][pos], "ng")
				or (fittest == "" and seq == #consSet)) 
				and cData.class or fittest
			table.insert(init, cData[mode][pos])
		end
		c1 = table.concat(init)
	end
	
	c1 = gsub(c1, "[ɓb](.)", "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, "[ɗd](.)", "t%1")
	if mode == "ipa" then
		c1 = gsub(c1, "p([knŋcɲdtnjls])", "pʰ%1")
		c1 = gsub(c1, "pʰ([^knŋcɲdtnjls])", "p%1")
		c1 = gsub(c1, "t([kŋnmjlʋ])", "tʰ%1")
		c1 = gsub(c1, "tʰ([^kŋnmjlʋ])", "t%1")
		c1 = gsub(c1, "k([ctnbmlʋs])", "kʰ%1")
		c1 = gsub(c1, "kʰ([^ctnbmlʋs])", "k%1")
		c1 = gsub(c1, "c([kŋnmlʋʔ])", "cʰ%1")
		c1 = gsub(c1, "cʰ([^kŋnmlʋʔ])", "c%1")
	end
	return c1, fittest
end

local function rime(v1, c2, fittest, red, mode)
	if red == apos then v1 = red end
	if vowels[v1 .. c2] then return vowels[v1 .. c2][mode][fittest] end
	c2 = consonants[c2][mode][2] or c2
	if ((v1 == "័" or v1 == "ា់") and (find(c2, "[kŋ]") or c2 == "ng")) or
		(v1 == "េ" and (find(c2, "[cɲ]") or c2 == "ñ")) or
		(v1 == "់" and find(c2, "[mp]")) or
		((v1 == "ិ" or v1 == "ុ") and c2 ~= "") then
		v1 = v1 .. "2"
	end
	v1 = vowels[v1] and vowels[v1][mode][fittest] or v1
	if (glottify[v1] 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[v1..c2] or err[v1]) 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, "ʔ([ptkhlɲŋmnjw])", "%1")
	text = gsub(text, "ŭə%.", "ɔ.")
	text = gsub(text, "([eiou])[ʔʼ]%.", "%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[\128-\162])៌","៌%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 = {
		[1] = { list = true },
		["a"] = {},
		["audio"] = { alias_of = "a" },
		["word"] = { 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[1] == 0 then args[1] = { args.word } end
	for _, param in ipairs(args[1]) 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 "''[[w:Khmer alphabet|Orthographic]]''"
			or "''[[w:Khmer alphabet|Orthographic and Phonemic]]''", 
		textFormat(args.word) .. "<br>" .. textFormat(gsub(gsub(repha(args.word), ".", tl), "ʰ̥", "̥ʰ"), "IPA")
	) ..
	
	(separate
		and row("''[[w:Khmer alphabet|Phonemic]]''", 
			textFormat(respelling) .. "<br>" ..
			textFormat(gsub(gsub(respelling, ".", tl), "ʰ̥", "̥ʰ"), "IPA"))
		or "") ..
	
	row("''[[Wiktionary:Khmer romanization|WT romanisation]]''",
		textFormat(table.concat(transcriptions, ", "), "IPA", "100%")
	) ..
	
	row(
		"(''[[w:Khmer language|standard]]'') [[Wiktionary:International Phonetic Alphabet|IPA]]" .. 
		"<sup>([[Wiktionary:Khmer romanization|key]])</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|}" .. "[[Category:Khmer terms with IPA pronunciation]]")
	
	return table.concat(output_text)
end

return export