File Coverage

blib/lib/Lingua/ZH/PinyinConvert/ID.pm
Criterion Covered Total %
statement 103 116 88.7
branch 36 50 72.0
condition 3 9 33.3
subroutine 18 22 81.8
pod 10 10 100.0
total 170 207 82.1


line stmt bran cond sub pod time code
1             package Lingua::ZH::PinyinConvert::ID;
2              
3 1     1   21102 use 5.010001;
  1         4  
  1         43  
4 1     1   6 use strict;
  1         1  
  1         40  
5 1     1   6 use warnings;
  1         2  
  1         5464  
6              
7             our $VERSION = '0.04'; # VERSION
8              
9             # notes:
10              
11             # * for 'w' as alternative spelling to 'u'/'o', only those occuring
12             # after vowel is listed (e.g. taw, but not khwai), except kwa/kwe/kwi
13             # and hwaX (commonly encountered)
14              
15             my %hy2id = (
16             a => 'a',
17             ai => 'ai',
18             an => 'an',
19             ang => 'ang',
20             ao => ['au', 'ao', 'aw'],
21              
22             ba => 'pa',
23             bai => 'pai',
24             ban => 'pan',
25             bang => 'pang',
26             bao => ['pau', 'pao', 'paw'],
27             bei => 'pei',
28             ben => 'pen',
29             beng => 'peng',
30             bi => 'pi',
31             bian => 'pien',
32             biao => ['piau', 'piao', 'piaw'],
33             bie => 'pie',
34             bin => 'pin',
35             bing => 'ping',
36             bo => ['po', 'puo'], #pwo
37             bu => 'pu',
38              
39             ca => 'cha',
40             cai => 'chai',
41             can => 'chan',
42             cang => 'chang',
43             cao => ['chau', 'chao', 'chaw'],
44             ce => 'che',
45             cen => 'chen',
46             ceng => 'cheng',
47             cha => 'cha',
48             chai => 'chai',
49             chan => 'chan',
50             chang => 'chang',
51             chao => ['chau', 'chao', 'chaw'],
52             che => 'che',
53             chen => 'chen',
54             cheng => 'cheng',
55             chi => 'che',
56             chong => 'chung',
57             chou => ['chou', 'chow', 'cheu'], # chEw
58             chu => 'chu',
59             chuai => ['chuai'],# 'chwai'],
60             chuan => ['chuan'],# 'chwan'],
61             chuang => ['chuang'],# 'chwang'],
62             chui => ['chuei'],# 'chwei'],
63             chun => ['chuen'],# 'chwen'],
64             chuo => ['chuo'],# 'chwo'],
65             ci => 'che',
66             cong => 'chung',
67             cou => ['chou', 'chow', 'chew'], # chEw
68             cu => 'chu',
69             cuan => ['chuan'],# 'chwan'],
70             cui => ['chuei'],# 'chwei'],
71             cun => ['chuen'],# 'chwen'],
72             cuo => ['chuo'],# 'chwo'],
73              
74             da => 'ta',
75             dai => 'tai',
76             dan => 'tan',
77             dang => 'tang',
78             dao => ['tau', 'tao', 'taw'],
79             de => 'te',
80             dei => 'tei',
81             deng => 'teng',
82             di => 'ti',
83             dian => 'tien',
84             diao => ['tiau', 'tiao', 'tiaw'],
85             die => 'tie',
86             ding => 'ting',
87             diu => 'tiu',
88             dong => 'tung',
89             dou => ['tou', 'tow', 'teu', 'tew'],
90             du => 'tu',
91             duan => ['tuan'],# 'twan'],
92             dui => ['tuei'],# 'twei'],
93             dun => ['tuen'],# 'twen'],
94             duo => 'tuo', # two
95              
96             e => 'e',
97             en => 'en',
98             er => ['er', 'el'],
99              
100             fa => 'fa',
101             fan => 'fan',
102             fang => 'fang',
103             fei => 'fei',
104             fen => 'fen',
105             feng => 'feng',
106             fo => ['fo', 'fuo'], # fwo
107             fou => ['fou', 'fow'],
108             fu => 'fu',
109              
110             ga => 'ka',
111             gai => 'kai',
112             gan => 'kan',
113             gang => 'kang',
114             gao => ['kau', 'kao', 'kaw'],
115             ge => 'ke',
116             gei => 'kei',
117             gen => 'ken',
118             geng => 'keng',
119             gong => 'kung',
120             gou => ['kou', 'kow', 'keu'], # kEw
121             gu => 'ku',
122             gua => ['kua', 'kwa'],
123             guai => ['kuai', 'kwai'],
124             guan => ['kuan', 'kwan'],
125             guang => ['kuang', 'kwang'],
126             gui => ['kuei', 'kwei'],
127             gun => ['kuen'],# 'kwen'],
128             guo => ['kuo'],# 'kwo'],
129              
130             ha => 'ha',
131             hai => 'hai',
132             han => 'han',
133             hang => 'hang',
134             hao => ['hau', 'hao', 'haw'],
135             he => 'he',
136             hei => 'hei',
137             hen => 'hen',
138             heng => 'heng',
139             hong => 'hung',
140             hou => ['hou', 'how', 'heu'], # hEw
141             hu => 'hu',
142             hua => ['hua', 'hwa'],
143             huai => ['huai', 'hwai'],
144             huan => ['huan', 'hwan'],
145             huang => ['huang', 'hwang'],
146             hui => ['huei', 'hwei'],
147             hun => ['huen'],# 'hwen'],
148             huo => 'huo', # hwo
149              
150             ji => 'ci',
151             jia => 'cia',
152             jian => 'cien',
153             jiang => 'ciang',
154             jiao => ['ciau', 'ciao', 'ciaw'],
155             jie => 'cie',
156             jin => 'cin',
157             jing => 'cing',
158             jiong => 'ciung',
159             jiu => 'ciu',
160             ju => 'cu', #?
161             juan => 'cien', #?
162             jue => 'cue', #?
163             jun => ['cun', 'cin'], #?
164              
165             ka => 'kha',
166             kai => 'khai',
167             kan => 'khan',
168             kang => 'khang',
169             kao => ['khau', 'khao', 'khaw'],
170             ke => 'khe',
171             ken => 'khen',
172             keng => 'kheng',
173             kong => 'khung',
174             kou => ['khou', 'khow', 'kheu'], # khEw
175             ku => 'khu',
176             kua => ['khua'],# 'khwa'],
177             kuai => ['khuai'],# 'khwai'],
178             kuan => ['khuan'],# 'khwan'],
179             kuang => ['khuang'],# 'khwang'],
180             kui => ['khuei'],# 'khwei'],
181             kun => 'khuen', # khwen
182             kuo => 'khuo', # khwo
183              
184             la => 'la',
185             lai => 'lai',
186             lan => 'lan',
187             lang => 'lang',
188             lao => ['lau', 'lao'],
189             le => 'le',
190             lei => 'lei',
191             leng => 'leng',
192             li => 'li',
193             lia => 'lia',
194             lian => 'lien',
195             liang => 'liang',
196             liao => ['liau', 'liao', 'liaw'],
197             lie => 'lie',
198             lin => 'lin',
199             ling => 'ling',
200             liu => 'liu',
201             long => 'lung',
202             lou => ['lou', 'low', 'leu'],#, 'lEw']
203             lu => 'lu',
204             lv => ['li'], # lu
205             luan => ['luan'], # lwan
206             lve => ['lie'], #'lue'], # lwe
207             lun => ['luen'], # lwen
208             luo => ['luo'], # lwo
209              
210             ma => 'ma',
211             mai => 'mai',
212             man => 'man',
213             mang => 'mang',
214             mao => ['mau', 'mao', 'maw'],
215             me => 'me',
216             mei => 'mei',
217             men => 'men',
218             meng => 'meng',
219             mi => 'mi',
220             mian => 'mien',
221             miao => ['miau', 'miao', 'miaw'],
222             mie => 'mie',
223             min => 'min',
224             ming => 'ming',
225             miu => 'miu',
226             mo => ['mo', 'muo'], # mwo
227             mou => ['mou', 'mow'],
228             mu => 'mu',
229              
230             na => 'na',
231             nai => 'nai',
232             nan => 'nan',
233             nang => 'nang',
234             nao => ['nau', 'nao'],
235             ne => 'ne',
236             nei => 'nei',
237             nen => 'nen',
238             neng => 'neng',
239             ni => 'ni',
240             nian => 'nien',
241             niang => 'niang',
242             niao => ['niau', 'niao'],
243             nie => 'nie',
244             nin => 'nin',
245             ning => 'ning',
246             niu => 'niu',
247             nong => 'nung',
248             nou => ['nou'], # now
249             nu => 'nu',
250             nv => ['ni'], # nu
251             nuan => 'nuan',
252             nve => 'nie', #nue?
253             nuo => 'nuo',
254              
255             o => 'o',
256             ou => ['ou', 'ow'],
257              
258             pa => 'pha',
259             pai => 'phai',
260             pan => 'phan',
261             pang => 'phang',
262             pao => ['phau', 'phao', 'phaw'],
263             pei => 'phei',
264             pen => 'phen',
265             peng => 'pheng',
266             pi => 'phi',
267             pian => 'phien',
268             piao => ['phiau', 'phiao', 'phiaw'],
269             pie => 'phie',
270             pin => 'phin',
271             ping => 'phing',
272             po => ['pho', 'phuo'],
273             pou => ['phou', 'phow'],
274             pu => 'phu',
275              
276             qi => 'chi',
277             qia => 'chia',
278             qian => 'chien',
279             qiang => 'chiang',
280             qiao => ['chiau', 'chiao', 'chiaw'],
281             qie => 'chie',
282             qin => 'chin',
283             qing => 'ching',
284             qiong => 'chiung',
285             qiu => 'chiu',
286             qu => 'chi',
287             quan => 'chuen', #?
288             que => 'chue',
289             qun => 'chuen',
290              
291             ran => ['ran', 'jan'],
292             rang => ['rang', 'jang'],
293             rao => ['rau', 'rao', 'raw', 'jau', 'jao', 'jaw'],
294             re => ['re', 'je'],
295             ren => ['ren', 'jen'],
296             reng => ['reng', 'jeng'],
297             ri => ['re', 'je'],
298             rong => ['rung', 'jung'],
299             rou => ['rou', 'row', 'jou', 'jow', 'reu', 'jeu'], # rEw
300             ru => ['ru', 'ju'],
301             ruan => ['ruan', 'juan'],
302             rui => ['ruei', 'juei'],
303             run => ['ruen', 'juen'],
304             ruo => ['ruo', 'juo'],
305              
306             sa => 'sa',
307             sai => 'sai',
308             san => 'san',
309             sang => 'sang',
310             sao => ['sau', 'sao', 'saw'],
311             se => 'se',
312             sen => 'sen',
313             seng => 'seng',
314             sha => 'sha',
315             shai => 'shai',
316             shan => 'shan',
317             shang => 'shang',
318             shao => ['shau', 'shao', 'shaw'],
319             she => 'she',
320             shei => 'shei',
321             shen => 'shen',
322             sheng => 'sheng',
323             shi => 'she',
324             shou => ['shou', 'sheu'],# 'shEw', 'show'],
325             shu => 'shu',
326             shua => 'shua',
327             shuai => 'shuai',
328             shuan => 'shuan',
329             shuang => 'shuang',
330             shui => 'shuei',
331             shun => 'shuen',
332             shuo => 'shuo',
333             si => 'se',
334             song => 'sung',
335             sou => ['sou', 'sow', 'seu', 'sew'],
336             su => 'su',
337             suan => 'suan',
338             sui => 'suei',
339             sun => 'suen',
340             suo => 'suo',
341              
342             ta => 'tha',
343             tai => 'thai',
344             tan => 'than',
345             tang => 'thang',
346             tao => ['thau', 'thao', 'thaw'],
347             te => 'the',
348             teng => 'theng',
349             ti => 'thi',
350             tian => 'thien',
351             tiao => ['thiau', 'thiao', 'thiaw'],
352             tie => 'thie',
353             ting => 'thing',
354             tong => 'thung',
355             tou => ['thou', 'thow', 'theu', 'thew'],
356             tu => 'thu',
357             tuan => 'thuan',
358             tui => 'thuei',
359             tun => 'thuen',
360             tuo => 'thuo',
361              
362             wa => 'wa',
363             wai => 'wai',
364             wan => 'wan',
365             wang => 'wang',
366             wei => 'wei',
367             wen => 'wen',
368             weng => 'weng',
369             wo => 'wo',
370             wu => 'wu',
371              
372             xi => 'si',
373             xia => 'sia',
374             xian => 'sien',
375             xiang => 'siang',
376             xiao => ['siau', 'siao', 'siau'],
377             xie => 'sie',
378             xin => 'sin',
379             xing => 'sing',
380             xiong => 'siung',
381             xiu => 'siu',
382             xu => ['si', 'syu'],
383             xuan => ['suan', 'swan'],
384             xue => ['sie'],# 'sue'],
385             xun => 'suen',
386              
387             ya => 'ya',
388             yai => 'yai',
389             yan => 'yen',
390             yang => 'yang',
391             yao => ['yau', 'yao', 'yaw'],
392             ye => 'ye',
393             yi => ['i', 'yi'],
394             yin => ['in', 'yin'],
395             ying => ['ing', 'ying'],
396             yong => 'yung',
397             you => ['yu', 'you'],# 'yow'],
398             yu => ['yi', 'yu'],
399             yuan => 'yuen',
400             yue => ['yue', 'ye'],
401             yun => ['yun', 'yin'],
402              
403             za => 'ca',
404             zai => 'cai',
405             zan => 'can',
406             zang => 'cang',
407             zao => ['cau', 'cao', 'caw'],
408             ze => 'ce',
409             zei => 'cei',
410             zen => 'cen',
411             zeng => 'ceng',
412             zha => 'ca',
413             zhai => 'cai',
414             zhan => 'can',
415             zhang => 'cang',
416             zhao => ['cau', 'cao', 'caw'],
417             zhe => 'ce',
418             zhei => 'cei',
419             zhen => 'cen',
420             zheng => 'ceng',
421             zhi => 'ce',
422             zhong => 'cung',
423             zhou => ['cou', 'ceu', 'cew'], #cow
424             zhu => 'cu',
425             zhua => 'cua',
426             zhuai => 'cuai',
427             zhuan => 'cuan',
428             zhuang => 'cuang',
429             zhui => 'cuei',
430             zhun => 'cuen',
431             zhuo => 'cuo',
432             zi => 'ce',
433             zong => 'cung',
434             zou => ['cou', 'ceu', 'cew'], #cow
435             zu => 'cu',
436             zuan => 'cuan',
437             zui => 'cuei',
438             zun => 'cuen',
439             zuo => 'cuo',
440             );
441              
442             my %jy2id = (
443             aa => 'a',
444             aai => 'ai',
445             aak => ['ak', 'ngak'],
446             aam => 'am',
447             aan => ['an', 'ngan'],
448             aang => ['ang', 'ngang'],
449             aap => ['ap', 'ngap'],
450             aat => ['at', 'ngat'],
451             aau => ['au', 'ngau'],
452             ai => ['ai', 'ngai'],
453             ak => ['ak', 'ngak'],
454             am => 'am',
455             ang => ['ang', 'ngang'],
456             ap => 'ap',
457             au => 'au',
458              
459             baa => 'pa',
460             baai => 'pai',
461             baak => 'pak',
462             baan => 'pan',
463             baang => 'pang',
464             baat => 'pat',
465             baau => 'pau',
466             bai => 'pai',
467             bak => 'pak',
468             bam => 'pam',
469             ban => 'pan',
470             bang => 'pang',
471             bat => 'pat',
472             bau => 'pau',
473             be => 'pe',
474             bei => 'pei',
475             bek => 'pek',
476             beng => 'peng',
477             bik => 'pik',
478             bin => 'pin',
479             bing => 'ping',
480             bit => 'pit',
481             biu => 'piu',
482             bo => 'po',
483             bok => 'pok',
484             bong => 'pong',
485             bou => 'pou', # pow
486             bui => 'pui',
487             buk => 'puk',
488             bun => 'pun',
489             bung => 'pung',
490             but => 'put',
491              
492             caa => 'cha',
493             caai => 'chai',
494             caak => 'chak',
495             caam => 'cham',
496             caan => 'chan',
497             caang => 'chang',
498             caap => 'chap',
499             caat => 'chat',
500             caau => 'chau',
501             cai => 'chai',
502             cak => 'chak',
503             cam => 'cham',
504             can => 'chan',
505             cang => 'chang',
506             cap => 'chap',
507             cat => 'chat',
508             cau => 'chau',
509             ce => 'che',
510             cek => 'chek',
511             ceng => 'cheng',
512             ceoi => ['cheui', 'cheoi' ,
513             'cheuy', 'cheoy' ],
514             ceon => ['cheun', 'cheon' ],
515             ceot => ['cheut', 'cheot' ],
516             ci => 'chi',
517             cik => 'chik',
518             cim => 'chim',
519             cin => 'chin',
520             cing => 'ching',
521             cip => 'chip',
522             cit => 'chit',
523             ciu => 'chiu',
524             co => 'cho',
525             coek => ['cheuk', 'choek'],
526             coeng => ['cheung', 'choeng'],
527             coi => ['choi', 'choy'],
528             cok => 'chok',
529             cong => 'chong',
530             cou => ['chou', 'chow'],
531             cuk => 'chuk',
532             cung => 'chung',
533             cyu => ['chyu', 'chiu'],
534             cyun => ['chyun', 'chiun'],
535             cyut => ['chyut', 'chiut'],
536              
537             daa => 'ta',
538             daai => 'tai',
539             daak => 'tak',
540             daam => 'tam',
541             daan => 'tan',
542             daap => 'tap',
543             daat => 'tat',
544             dai => 'tai',
545             dak => 'tak',
546             dam => 'tam',
547             dan => 'tan',
548             dang => 'tang',
549             dap => 'tap',
550             dat => 'tat',
551             dau => 'tau',
552             de => 'te',
553             dei => 'tei',
554             dek => 'tek',
555             deng => 'teng',
556             deoi => ['teui', 'teoi',
557             'teuy', 'teoy'],
558             deon => ['teun', 'teon'],
559             deot => ['teut', 'teot'],
560             deu => ['teu','tew'],
561             dik => 'tik',
562             dim => 'tim',
563             din => 'tin',
564             ding => 'ting',
565             dip => 'tip',
566             dit => 'tit',
567             diu => 'tiu',
568             do => 'to',
569             doe => ['teu','toe'],
570             doek => ['teuk', 'toek'],
571             doi => ['toi', 'toy'],
572             dok => 'tok',
573             dong => 'tong',
574             dou => ['tou', 'tow'],
575             duk => 'tuk',
576             dung => 'tung',
577             dyun => ['tyun', 'tiun'],
578             dyut => ['tyut', 'tiut'],
579              
580             e => 'e',
581             ei => 'ei',
582              
583             faa => 'fa',
584             faai => 'fai',
585             faak => 'fak',
586             faan => 'fan',
587             faat => 'fat',
588             fai => 'fai',
589             fan => 'fan',
590             fang => 'fang',
591             fat => 'fat',
592             fau => 'fau',
593             fe => 'fe',
594             fei => 'fei',
595             fo => 'fo',
596             fok => 'fok',
597             fong => 'fong',
598             fu => 'fu',
599             fui => 'fui',
600             fuk => 'fuk',
601             fun => 'fun',
602             fung => 'fung',
603             fut => 'fut',
604              
605             # i think g is also a common indo transliteration for
606             # non-mandarin, for instance in names, e.g. kwik kian gee. but
607             # i'll default to k.
608             gaa => ['ka', 'ga'],
609             gaai => ['kai', 'gai'],
610             gaak => ['kak', 'gak'],
611             gaam => ['kam', 'gam'],
612             gaan => ['kan', 'gan'],
613             gaang => ['kang', 'gang'],
614             gaap => ['kap', 'gap'],
615             gaat => ['kat', 'gat'],
616             gaau => ['kau', 'gau'],
617             gai => ['kai', 'gai'],
618             gam => ['kam','gam'],
619             gan => ['kan','gan'],
620             gang => ['kang','gang'],
621             gap => ['kap','gap'],
622             gat => ['kat','gat'],
623             gau => ['kau','gau'],
624             ge => ['ke','ge'],
625             gei => ['kei','gei'],
626             geng => ['keng','geng'],
627             geoi => ['keui', 'geui', 'keoi', 'geoi',
628             'keuy', 'geuy', 'keoy', 'geoy'],
629             gep => ['kep','gep'],
630             gik => ['kik','gik'],
631             gim => ['kim','gim'],
632             gin => ['kin','gin'],
633             ging => ['king','ging'],
634             gip => ['kip','gip'],
635             git => ['kit','git'],
636             giu => ['kiu','giu'],
637             go => ['ko','go'],
638             goe => ['keu','geu','koe','goe'],
639             goek => ['keuk','geuk','koek','goek'],
640             goeng => ['keung','geung','koeng','goeng'],
641             goi => ['koi','goi',
642             'koy','goy'],
643             gok => ['kok','gok'],
644             gon => ['kon','gon'],
645             gong => ['kong','gong'],
646             got => ['kot','got'],
647             gou => ['kou', 'kow', 'gou', 'gow'],
648             gu => ['ku','gu'],
649             gui => ['kui','gui'],
650             guk => ['kuk','guk'],
651             gun => ['kun','gun'],
652             gung => ['kung','gung'],
653             gwaa => ['kwa','gwa', 'kua','gua'],
654             gwaai => ['kwai','gwai','kuai','guai'],
655             gwaak => ['kwak','gwak'],
656             gwaan => ['kwan','gwan'],
657             gwaang => ['kwang','gwang'],
658             gwaat => ['kwat','gwat'],
659             gwai => ['kwai','gwai'],
660             gwan => ['kwan','gwan'],
661             gwang => ['kwang','gwang'],
662             gwat => ['kwat','gwat'],
663             gwik => ['kwik','gwik'],
664             gwing => ['kwing','gwing'],
665             gwo => ['kwo','gwo'],
666             gwok => ['kwok','gwok'],
667             gwong => ['kwong','gwong'],
668             gyun => ['kyun','gyun','kiun','giun'],
669             gyut => ['kyut','gyut','kiut','kyut'],
670              
671             haa => 'ha',
672             haai => 'hai',
673             haak => 'hak',
674             haam => 'ham',
675             haan => 'han',
676             haang => 'hang',
677             haap => 'hap',
678             haau => 'hau',
679             hai => 'hai',
680             hak => 'hak',
681             ham => 'ham',
682             han => 'han',
683             hang => 'hang',
684             hap => 'hap',
685             hat => 'hat',
686             hau => 'hau',
687             hei => 'hei',
688             hek => 'hek',
689             heng => 'heng',
690             heoi => ['heoi',
691             'heoy'],
692             hik => 'hik',
693             him => 'him',
694             hin => 'hin',
695             hing => 'hing',
696             hip => 'hip',
697             hit => 'hit',
698             hiu => 'hiu',
699             hm => 'hm',
700             hng => 'hng',
701             ho => 'ho',
702             hoe => ['heu','hoe'],
703             hoeng => ['heung','hoeng'],
704             hoi => ['hoi','hoy'],
705             hok => 'hok',
706             hon => 'hon',
707             hong => 'hong',
708             hot => 'hot',
709             hou => ['hou','how'],
710             huk => 'huk',
711             hung => 'hung',
712             hyun => ['hiun','hyun'],
713             hyut => ['hyut','hiut'],
714              
715             jaa => 'ya',
716             jaai => 'yai',
717             jaak => 'yak',
718             jai => 'yai',
719             jam => 'yam',
720             jan => 'yan',
721             jap => 'yap',
722             jat => 'yat',
723             jau => 'yau',
724             je => 'ye',
725             jeng => 'yeng',
726             jeoi => ['yeui','yeoi',
727             'yeuy','yeoy'],
728             jeon => ['yeun','yeon'],
729             ji => 'yi',
730             jik => 'yik',
731             jim => 'yim',
732             jin => 'yin',
733             jing => 'ying',
734             jip => 'yip',
735             jit => 'yit',
736             jiu => 'yiu',
737             jo => 'yo',
738             joek => ['yeuk','yoek'],
739             joeng => ['yeung','yoeng'],
740             juk => 'yuk',
741             jung => 'yung',
742             jyu => ['yiu', 'yu'],
743             jyun => ['yiun', 'yun'],
744             jyut => ['yiut', 'yut'],
745              
746             kaa => 'kha',
747             kaai => 'khai',
748             kaak => 'khak',
749             kaat => 'khat',
750             kaau => 'khau',
751             kai => 'khai',
752             kam => 'kham',
753             kan => 'khan',
754             kang => 'khang',
755             kap => 'khap',
756             kat => 'khat',
757             kau => 'khau',
758             ke => 'khe',
759             kei => 'khei',
760             kek => 'khek',
761             keoi => ['kheui', 'kheoi',
762             'kheuy', 'kheoy'],
763             kik => 'khik',
764             kim => 'khim',
765             kin => 'khin',
766             king => 'khing',
767             kit => 'khit',
768             kiu => 'khiu',
769             ko => 'kho',
770             koe => ['kheu','khoe'],
771             koek => ['kheuk','khoek'],
772             koeng => ['kheung','khoeng'],
773             koi => ['khoi','khoy'],
774             kok => 'khok',
775             kong => 'khong',
776             ku => 'khu',
777             kui => 'khui',
778             kuk => 'khuk',
779             kung => 'khung',
780             kut => 'khut',
781             kwaa => 'khwa',
782             kwaai => 'khwai',
783             kwaang => 'khwang',
784             kwai => 'khwai',
785             kwan => 'khwan',
786             kwik => 'khwik',
787             kwok => 'khwok',
788             kwong => 'khwong',
789             kyun => ['khiun','khyun'],
790             kyut => ['khiut','khyut'],
791              
792             laa => 'la',
793             laai => 'lai',
794             laak => 'lak',
795             laam => 'lam',
796             laan => 'lan',
797             laang => 'lang',
798             laap => 'lap',
799             laat => 'lat',
800             laau => 'lau',
801             lai => 'lai',
802             lak => 'lak',
803             lam => 'lam',
804             lang => 'lang',
805             lap => 'lap',
806             lat => 'lat',
807             lau => 'lau',
808             le => 'le',
809             lei => 'lei',
810             lek => 'lek',
811             lem => 'lem',
812             leng => 'leng',
813             leoi => ['leui','leoi',
814             'leuy','leoy'],
815             leon => ['leun','leon'],
816             leot => ['leut','leot'],
817             li => 'li',
818             lik => 'lik',
819             lim => 'lim',
820             lin => 'lin',
821             ling => 'ling',
822             lip => 'lip',
823             lit => 'lit',
824             liu => 'liu',
825             lo => 'lo',
826             loek => ['leuk','loek'],
827             loeng => ['leung','loeng'],
828             loi => ['loi','loy'],
829             lok => 'lok',
830             long => 'long',
831             lou => ['lou','low'],
832             luk => 'luk',
833             lung => 'lung',
834             lyun => ['liun','lyun'],
835             lyut => ['liut','lyut'],
836              
837             m => 'm',
838             maa => 'ma',
839             maai => 'mai',
840             maak => 'mak',
841             maan => 'man',
842             maang => 'mang',
843             maat => 'mat',
844             maau => 'mau',
845             mai => 'mai',
846             mak => 'mak',
847             man => 'man',
848             mang => 'mang',
849             mat => 'mat',
850             mau => 'mau',
851             me => 'me',
852             mei => 'mei',
853             meng => 'meng',
854             mi => 'mi',
855             mik => 'mik',
856             min => 'min',
857             ming => 'ming',
858             mit => 'mit',
859             miu => 'miu',
860             mo => 'mo',
861             mok => 'mok',
862             mong => 'mong',
863             mou => ['mou','mow'],
864             mui => 'mui',
865             muk => 'muk',
866             mun => 'mun',
867             mung => 'mung',
868             mut => 'mut',
869              
870             naa => 'na',
871             naai => 'nai',
872             naam => 'nam',
873             naan => 'nan',
874             naap => 'nap',
875             naat => 'nat',
876             naau => 'nau',
877             nai => 'nai',
878             nam => 'nam',
879             nan => 'nan',
880             nang => 'nang',
881             nap => 'nap',
882             nat => 'nat',
883             nau => 'nau',
884             ne => 'ne',
885             nei => 'nei',
886             neoi => ['neui','neoi',
887             'neuy','neoy'],
888             neot => ['neut','neot'],
889             ng => 'ng',
890              
891             ngaa => 'nga',
892             ngaai => 'ngai',
893             ngaak => 'ngak',
894             ngaam => 'ngam',
895             ngaan => 'ngan',
896             ngaang => 'ngang',
897             ngaap => 'ngap',
898             ngaat => 'ngat',
899             ngaau => 'ngau',
900             ngai => 'ngai',
901             ngak => 'ngak',
902             ngam => 'ngam',
903             ngan => 'ngan',
904             ngang => 'ngang',
905             ngap => 'ngap',
906             ngat => 'ngat',
907             ngau => 'ngau',
908             ngit => 'ngit',
909             ngo => 'ngo',
910             ngoi => ['ngoi','ngoy'],
911             ngok => 'ngok',
912             ngon => 'ngon',
913             ngong => 'ngong',
914             ngou => ['ngou','ngow'],
915             nguk => 'nguk',
916             ngung => 'ngung',
917              
918             ni => 'ni',
919             nik => 'nik',
920             nim => 'nim',
921             nin => 'nin',
922             ning => 'ning',
923             nip => 'nip',
924             niu => 'niu',
925             no => 'no',
926             noeng => ['neung','noeng'],
927             noi => ['noi','noy'],
928             nok => 'nok',
929             nong => 'nong',
930             nou => ['nou','now'],
931             nuk => 'nuk',
932             nung => 'nung',
933             nyun => ['niun','nyun'],
934              
935             o => 'o',
936             oi => ['oi','oy'],
937             ok => 'ok',
938             on => 'on',
939             ong => 'ong',
940             ou => ['ou','ow'],
941              
942             paa => 'pha',
943             paai => 'phai',
944             paak => 'phak',
945             paan => 'phan',
946             paang => 'phang',
947             paau => 'phau',
948             pai => 'phai',
949             pan => 'phan',
950             pang => 'phang',
951             pat => 'phat',
952             pau => 'phau',
953             pei => 'phei',
954             pek => 'phek',
955             peng => 'pheng',
956             pik => 'phik',
957             pin => 'phin',
958             ping => 'phing',
959             pit => 'phit',
960             piu => 'phiu',
961             po => 'pho',
962             poi => 'phoi',
963             pok => 'phok',
964             pong => 'phong',
965             pou => ['phou','phow'],
966             pui => 'phui',
967             puk => 'phuk',
968             pun => 'phun',
969             pung => 'phung',
970             put => 'phut',
971              
972             saa => 'sa',
973             saai => 'sai',
974             saak => 'sak',
975             saam => 'sam',
976             saan => 'san',
977             saang => 'sang',
978             saap => 'sap',
979             saat => 'sat',
980             saau => 'sau',
981             sai => 'sai',
982             sak => 'sak',
983             sam => 'sam',
984             san => 'san',
985             sang => 'sang',
986             sap => 'sap',
987             sat => 'sat',
988             sau => 'sau',
989             se => 'se',
990             sei => 'sei',
991             sek => 'sek',
992             seng => 'seng',
993             seoi => ['seui','seoi',
994             'seuy','seoy'],
995             seon => ['seun','seon'],
996             seot => ['seut','seot'],
997             si => 'si',
998             sik => 'sik',
999             sim => 'sim',
1000             sin => 'sin',
1001             sing => 'sing',
1002             sip => 'sip',
1003             sit => 'sit',
1004             siu => 'siu',
1005             so => 'so',
1006             soek => ['seuk','soek'],
1007             soeng => ['seung','soeng'],
1008             soi => ['soi','soy'],
1009             sok => 'sok',
1010             song => 'song',
1011             sou => ['sou','sow'],
1012             suk => 'suk',
1013             sung => 'sung',
1014             syu => ['siu','syu'],
1015             syun => ['siun','syun'],
1016             syut => ['siut','syut'],
1017              
1018             taa => 'tha',
1019             taai => 'thai',
1020             taam => 'tham',
1021             taan => 'than',
1022             taap => 'thap',
1023             taat => 'that',
1024             tai => 'thai',
1025             tam => 'tham',
1026             tan => 'than',
1027             tang => 'thang',
1028             tau => 'thau',
1029             tek => 'thek',
1030             teng => 'theng',
1031             teoi => ['theui','theoi',
1032             'theuy','theoy'],
1033             teon => ['theun','theon'],
1034             tik => 'thik',
1035             tim => 'thim',
1036             tin => 'thin',
1037             ting => 'thing',
1038             tip => 'thip',
1039             tit => 'thit',
1040             tiu => 'thiu',
1041             to => 'tho',
1042             toe => ['theu','thoe'],
1043             toi => ['thoi','thoy'],
1044             tok => 'thok',
1045             tong => 'thong',
1046             tou => ['thou', 'thow'],
1047             tuk => 'thuk',
1048             tung => 'thung',
1049             tyun => ['thiun','thyun'],
1050             tyut => ['thiut','thyut'],
1051              
1052             uk => 'uk',
1053             ung => 'ung',
1054              
1055             waa => 'wa',
1056             waai => 'wai',
1057             waak => 'wak',
1058             waan => 'wan',
1059             waang => 'wang',
1060             waat => 'wat',
1061             wai => 'wai',
1062             wan => 'wan',
1063             wang => 'wang',
1064             wat => 'wat',
1065             wik => 'wik',
1066             wing => 'wing',
1067             wo => 'wo',
1068             wok => 'wok',
1069             wong => 'wong',
1070             wu => 'wu',
1071             wui => 'wui',
1072             wun => 'wun',
1073             wut => 'wut',
1074              
1075             zaa => 'ca',
1076             zaai => 'cai',
1077             zaak => 'cak',
1078             zaam => 'cam',
1079             zaan => 'can',
1080             zaang => 'cang',
1081             zaap => 'cap',
1082             zaat => 'cat',
1083             zaau => 'cau',
1084             zai => 'cai',
1085             zak => 'cak',
1086             zam => 'cam',
1087             zan => 'can',
1088             zang => 'cang',
1089             zap => 'cap',
1090             zat => 'cat',
1091             zau => 'cau',
1092             ze => 'ce',
1093             zek => 'cek',
1094             zeng => 'ceng',
1095             zeoi => ['ceui','ceoi',
1096             'ceuy','ceoy'],
1097             zeon => ['ceun','ceon'],
1098             zeot => ['ceut','ceot'],
1099             zi => 'ci',
1100             zik => 'cik',
1101             zim => 'cim',
1102             zin => 'cin',
1103             zing => 'cing',
1104             zip => 'cip',
1105             zit => 'cit',
1106             ziu => 'ciu',
1107             zo => 'co',
1108             zoek => ['ceuk','coek'],
1109             zoeng => ['ceung','coeng'],
1110             zoi => ['coi','coy'],
1111             zok => 'cok',
1112             zong => 'cong',
1113             zou => ['cou','cow'],
1114             zuk => 'cuk',
1115             zung => 'cung',
1116             zyu => ['ciu','cyu'],
1117             zyun => ['ciun','cyun'],
1118             zyut => ['ciut','cyut'],
1119             );
1120              
1121             my %id2hy;
1122             my %id2jy;
1123             for (keys %hy2id) {
1124             my $l = ref($hy2id{$_}) eq 'ARRAY' ? $hy2id{$_} : [$hy2id{$_}];
1125             for my $id (@$l) {
1126             if (exists $id2hy{$id}) {
1127             $id2hy{$id} = [$id2hy{$id}] unless ref($id2hy{$id}) eq 'ARRAY';
1128             push @{ $id2hy{$id} }, $_;
1129             } else {
1130             $id2hy{$id} = $_;
1131             }
1132             }
1133             }
1134             #use Data::Dumper; print Dumper \%id2hy;
1135             for (keys %jy2id) {
1136             my $l = ref($jy2id{$_}) eq 'ARRAY' ? $jy2id{$_} : [$jy2id{$_}];
1137             for my $id (@$l) {
1138             if (exists $id2jy{$id}) {
1139             $id2jy{$id} = [$id2jy{$id}] unless ref($id2jy{$id}) eq 'ARRAY';
1140             push @{ $id2jy{$id} }, $_;
1141             } else {
1142             $id2jy{$id} = $_;
1143             }
1144             }
1145             }
1146             #use Data::Dumper; print Dumper \%id2jy;
1147              
1148             my $hy_re = join("|", sort { length($b) <=> length($a) } keys %hy2id); $hy_re = qr/(?:$hy_re)/;
1149             my $jy_re = join("|", sort { length($b) <=> length($a) } keys %jy2id); $jy_re = qr/(?:$jy_re)/;
1150             my $idmand_re = join("|", sort { length($b) <=> length($a) } keys %id2hy); $idmand_re = qr/(?:$idmand_re)/;
1151             my $idcant_re = join("|", sort { length($b) <=> length($a) } keys %id2jy); $idcant_re = qr/(?:$idcant_re)/;
1152             my %all = (%hy2id, %jy2id, %id2hy, %id2jy);
1153             my $all_re = join("|", sort { length($b) <=> length($a) } keys %all); $all_re = qr/(?:$all_re)/;
1154              
1155             sub new {
1156 1     1 1 17 my ($class, %opts) = @_;
1157 1         5 bless {}, $class;
1158             }
1159              
1160             sub hanyu2id {
1161 5     5 1 2133 my ($self, $text, $opts) = @_;
1162 5 50       17 if (!defined($opts)) { $opts = {} }
  5         11  
1163             my $sub1 = sub {
1164 9     9   17 my $t = shift;
1165 9         1011 $t =~ s/($hy_re)([12345]?)/
1166 13 100       82 (ref($hy2id{$1}) ? $hy2id{$1}[0] : $hy2id{$1}) .
    50          
1167             ($opts->{remove_tones} ? "" : $2)/eg;
1168 9         119 $t;
1169 5         24 };
1170 5         702 $text =~ s/\b((?:$hy_re[12345]?)+)\b/$sub1->($1)/eg;
  9         22  
1171 5         86 $text;
1172             }
1173              
1174             sub jyutping2id {
1175 3     3 1 1384 my ($self, $text, $opts) = @_;
1176 3 50       8 if (!defined($opts)) { $opts = {} }
  0         0  
1177             my $sub1 = sub {
1178 5     5   10 my $t = shift;
1179 5         1268 $t =~ s/($jy_re)([123456]?)/
1180 6 100 33     56 (ref($jy2id{$1}) ? $jy2id{$1}[0] : $jy2id{$1}) .
    50          
1181             (!$opts->{remove_tones} && $2 ? $2 : "")/eg;
1182 5         144 $t;
1183 3         15 };
1184 3         626 $text =~ s/\b((?:$jy_re[123456]?)+)\b/$sub1->($1)/eg;
  5         10  
1185 3         27 $text;
1186             }
1187              
1188             sub id2hanyu {
1189 6     6 1 2954 my ($self, $text, $opts) = @_;
1190 6 100       19 if (!defined($opts)) { $opts = {} }
  5         9  
1191             my $sub2 = sub {
1192 9     9   17 my $t = shift;
1193 9 100       19 if ($opts->{list_all}) {
1194 2         936 $t =~ s/($idmand_re)([12345]?)/
1195 2 100 33     15 (ref($id2hy{$1}) ? "(".join("|", sort(@{ $id2hy{$1} })).")" : $id2hy{$1}) .
  1 50       18  
1196             (!$opts->{remove_tones} && $2 ? $2 : "")/eg;
1197             } else {
1198 7         1511 $t =~ s/($idmand_re)([12345]?)/
1199 9 100 33     83 (ref($id2hy{$1}) ? die("ambiguous") : $id2hy{$1}) .
    100          
1200             (!$opts->{remove_tones} && $2 ? $2 : "")/eg;
1201             }
1202 8         121 $t;
1203 6         27 };
1204 6         7 eval {
1205 6         604 $text =~ s/\b((?:$idmand_re[12345]?)+)\b/$sub2->($1)/eg;
  9         20  
1206             };
1207 6 100       155 $@ ? undef : $text;
1208             }
1209              
1210             sub id2jyutping {
1211 1     1 1 464 my ($self, $text, $opts) = @_;
1212 1 50       5 if (!defined($opts)) { $opts = {} }
  0         0  
1213             my $sub2 = sub {
1214 2     2   5 my $t = shift;
1215 2 50       10 if ($opts->{list_all}) {
1216 0         0 $t =~ s/($idcant_re)([123456]?)/
1217 0 0       0 (ref($id2jy{$1}) ? "(".join("|", sort(@{ $id2jy{$1} })).")" : $id2jy{$1}) .
  0 0       0  
1218             ($opts->{remove_tones} ? "" : $2)/eg;
1219             } else {
1220 2         1545 $t =~ s/($idcant_re)([123456]?)/
1221 2 50       19 (ref($id2jy{$1}) ? die("ambiguous") : $id2jy{$1}) .
    50          
1222             ($opts->{remove_tones} ? "" : $2)/eg;
1223             }
1224 2         128 $t;
1225 1         5 };
1226 1         3 eval {
1227 1         624 $text =~ s/\b((?:$idcant_re[123456]?)+)\b/$sub2->($1)/eg;
  2         5  
1228             };
1229 1 50       15 $@ ? undef : $text;
1230             }
1231              
1232             sub detect {
1233 6     6 1 5006 my ($self, $text) = @_;
1234 6         14 my $n_hy = 0;
1235 6         10 my $n_jy = 0;
1236 6         11 my $n_idmand = 0;
1237 6         9 my $n_idcant = 0;
1238 6         11 my $n_all = 0;
1239              
1240             my $sub_all = sub {
1241 17     17   40 my $t = shift;
1242 17         1361 $n_all++ while $t =~ /\b$all_re[123456]?\b/g;
1243 17         94 $t;
1244 6         30 };
1245             my $sub_hy = sub {
1246 13     13   28 my $t = shift;
1247 13         665 $n_hy++ while $t =~ /\b$hy_re[12345]?\b/g;
1248 13         68 $t;
1249 6         24 };
1250             my $sub_jy = sub {
1251 14     14   34 my $t = shift;
1252 14         878 $n_jy++ while $t =~ /\b$jy_re[123456]?\b/g;
1253             #print "[jy:$1]" while $t =~ /\b($jy_re[123456]?)\b/g;
1254 14         73 $t;
1255 6         23 };
1256             my $sub_idmand = sub {
1257 10     10   23 my $t = shift;
1258 10         681 $n_idmand++ while $t =~ /\b$idmand_re[12345]?\b/g;
1259             #print "[idmand:$1]" while $t =~ /\b($idmand_re[12345]?)\b/g;
1260 10         51 $t;
1261 6         24 };
1262             my $sub_idcant = sub {
1263 10     10   23 my $t = shift;
1264 10         892 $n_idcant++ while $t =~ /\b$idcant_re[123456]?\b/g;
1265 10         70 $t;
1266 6         21 };
1267              
1268 6         9 my @res;
1269 6         1216 $text =~ s/\b((?:$all_re[123456]?){1})\b/$sub_all->($1)/eg;
  17         39  
1270 6         534 $text =~ s/\b((?:$hy_re[12345]?){1})\b/$sub_hy->($1)/eg;
  13         32  
1271 6         803 $text =~ s/\b((?:$jy_re[123456]?){1})\b/$sub_jy->($1)/eg;
  14         32  
1272 6         546 $text =~ s/\b((?:$idmand_re[12345]?){1})\b/$sub_idmand->($1)/eg;
  10         26  
1273 6         859 $text =~ s/\b((?:$idcant_re[123456]?){1})\b/$sub_idcant->($1)/eg;
  10         26  
1274              
1275             #print "DEBUG: all=$n_all, hy=$n_hy, jy=$n_jy, idmand=$n_idmand, idcant=$n_idcant\n";
1276              
1277 6 100       57 return @res unless $n_all;
1278 5 100       23 push @res, "hanyu" if $n_hy/$n_all >= 0.9;
1279 5 100       15 push @res, "jyutping" if $n_jy/$n_all >= 0.9;
1280 5 100       15 push @res, "id-mandarin" if $n_idmand/$n_all >= 0.9;
1281 5 100       21 push @res, "id-cantonese" if $n_idcant/$n_all >= 0.9;
1282 5         95 @res;
1283             }
1284              
1285             sub list_hanyu {
1286 0     0 1   my ($self) = @_;
1287 0           sort keys %hy2id;
1288             }
1289              
1290             sub list_jyutping {
1291 0     0 1   my ($self) = @_;
1292 0           sort keys %jy2id;
1293             }
1294              
1295             sub list_id_mandarin {
1296 0     0 1   my ($self) = @_;
1297 0           sort keys %id2hy;
1298             }
1299              
1300             sub list_id_cantonese {
1301 0     0 1   my ($self) = @_;
1302 0           sort keys %id2jy;
1303             }
1304              
1305             1;
1306             # ABSTRACT: Convert between various Chinese pinyin system and Indonesian transliteration
1307              
1308             __END__