File Coverage

blib/lib/Lingua/ZH/PinyinConvert.pm
Criterion Covered Total %
statement 36 36 100.0
branch 13 18 72.2
condition n/a
subroutine 5 5 100.0
pod 1 2 50.0
total 55 61 90.1


line stmt bran cond sub pod time code
1             package Lingua::ZH::PinyinConvert;
2              
3 3     3   27087 use 5.006;
  3         12  
  3         147  
4 3     3   16 use strict;
  3         6  
  3         109  
5 3     3   15 use Carp;
  3         9  
  3         10405  
6             require Exporter;
7             our @ISA = qw(Exporter);
8             our @EXPORT_OK = qw/convert/;
9             our $VERSION = '0.05';
10              
11             my @PS = ( # pinyin systems
12             [ qw/a a a a a/],
13             [ qw/ai ai ai ai ai/],
14             [ qw/an an an an an/],
15             [ qw/ang ang ang ang ang/],
16             [ qw/ao au ao au ao/],
17             [ qw/pa ba ba ba ba/],
18             [ qw/pai bai bai bai bai/],
19             [ qw/pan ban ban ban ban/],
20             [ qw/pang bang bang bang bang/],
21             [ qw/pao bau bao bau bao/],
22             [ qw/pei bei bei bei bei/],
23             [ qw/pen ban ben ben ben/],
24             [ qw/peng beng beng beng beng/],
25             [ qw/pi bi bi bi bi/],
26             [ qw/pien bian bian byan bian/],
27             [ qw/piao biau biao byau biao/],
28             [ qw/pieh bie bie bye bie/],
29             [ qw/pin bin bin bin bin/],
30             [ qw/ping bing bing bing bing/],
31             [ qw/po bo bo bwo bo/],
32             [ qw/pu bu bu bu bu/],
33             [ qw/ts'a tsa ca tsa ca/],
34             [ qw/ts'ai tsai cai tsai cai/],
35             [ qw/ts'an tsan can tsan can/],
36             [ qw/ts'ang tsang cang tsang cang/],
37             [ qw/ts'ao tsau cao tsau cao/],
38             [ qw/ts'e tse ce tse ce/],
39             [ qw/ts'en tsen cen tsen cen/],
40             [ qw/ts'eng tseng ceng tseng ceng/],
41             [ qw/ch'a cha cha cha cha/],
42             [ qw/ch'ai chai chai chai chai/],
43             [ qw/ch'an chan chan chan chan/],
44             [ qw/ch'ang chang chang chang chang/],
45             [ qw/ch'ao chau chao chau chao/],
46             [ qw/ch'e che che che che/],
47             [ qw/ch'en chen chen chen chen/],
48             [ qw/ch'eng cheng cheng cheng cheng/],
49             [ qw/ch'ih chr chi chr chih/],
50             [ qw/ch'ung chung chong chung chong/],
51             [ qw/ch'ou chou chou chou chou/],
52             [ qw/ch'u chu chu chu chu/],
53             [ qw/chua chua chua chwa chua/],
54             [ qw/ch'uai chuai chuai chwai chuai/],
55             [ qw/ch'uan chuan chuan chwan chuan/],
56             [ qw/ch'uang chuang chuang chwang chuang/],
57             [ qw/ch'ui chuei chui chwei chuei/],
58             [ qw/ch'un chuen chun chwun chun/],
59             [ qw/ch'o chuo chuo chwo chuo/],
60             [ qw/tz'u tsz ci tsz cih/],
61             [ qw/ts'ung tsung cong tsung cong/],
62             [ qw/ts'ou tsou cou tsou cou/],
63             [ qw/ts'u tsu cu tsu cu/],
64             [ qw/ts'uan tsuan cuan tswan cuan/],
65             [ qw/ts'ui tsuei cui tswei cuei/],
66             [ qw/ts'un tsuen cun tswun cun/],
67             [ qw/ts'o tsuo cuo tswo cuo/],
68             [ qw/ta da da da da/],
69             [ qw/tai dai dai dai dai/],
70             [ qw/tan dan dan dan dan/],
71             [ qw/tang dang dang dang dang/],
72             [ qw/tao dau dao dau dao/],
73             [ qw/te de de de de/],
74             [ qw/tei dei dei dei dei/],
75             [ qw/ten den den den den/],
76             [ qw/teng deng deng deng deng/],
77             [ qw/ti di di di di/],
78             [ qw/tien dian dian dyan dian/],
79             [ qw/tiang diang diang dyang diang/],
80             [ qw/tiao diau diao dyau diao/],
81             [ qw/tieh die die dye die/],
82             [ qw/ting ding ding ding ding/],
83             [ qw/tiu diou diu dyou diou/],
84             [ qw/tung dung dong dung dong/],
85             [ qw/tou dou dou dou dou/],
86             [ qw/tu du du du du/],
87             [ qw/tuan duan duan dwan duan/],
88             [ qw/tui duei dui dwei duei/],
89             [ qw/tun duen dun dwun dun/],
90             [ qw/to duo duo dwo duo/],
91             [ qw/e e e e e/],
92             [ qw/ei ei ei ei ei/],
93             [ qw/en en en en en/],
94             [ qw/erh er er er er/],
95             [ qw/fa fa fa fa fa/],
96             [ qw/fan fan fan fan fan/],
97             [ qw/fang fang fang fang fang/],
98             [ qw/fei fei fei fei fei/],
99             [ qw/fen fen fen fen fen/],
100             [ qw/feng feng feng feng fong/],
101             [ qw/fo fo fo fwo fo/],
102             [ qw/fou fou fou fou fou/],
103             [ qw/fu fu fu fu fu/],
104             [ qw/ka ga ga ga ga/],
105             [ qw/kai gai gai gai gai/],
106             [ qw/kan gan gan gan gan/],
107             [ qw/kang gang gang gang gang/],
108             [ qw/kao gau gao gau gao/],
109             [ qw/ke ge ge ge ge/],
110             [ qw/kei gei gei gei gei/],
111             [ qw/ken gen gen gen gen/],
112             [ qw/keng geng geng geng geng/],
113             [ qw/kung gung gong gung gong/],
114             [ qw/kou gou gou gou gou/],
115             [ qw/ku gu gu gu gu/],
116             [ qw/kua gua gua gwa gua/],
117             [ qw/kuai guai guai gwai guai/],
118             [ qw/kuan guan guan gwan guan/],
119             [ qw/kuang guang guang gwang guang/],
120             [ qw/kuei guei gui gwei guei/],
121             [ qw/kun guen gun gwun gun/],
122             [ qw/kuo guo guo gwo guo/],
123             [ qw/ha ha ha ha ha/],
124             [ qw/hai hai hai hai hai/],
125             [ qw/han han han han han/],
126             [ qw/hang hang hang hang hang/],
127             [ qw/hao hau hao hau hao/],
128             [ qw/he he he he he/],
129             [ qw/hei hei hei hei hei/],
130             [ qw/hen hen hen hen hen/],
131             [ qw/heng heng heng heng heng/],
132             [ qw/hung hung hong hung hong/],
133             [ qw/hou hou hou hou hou/],
134             [ qw/hu hu hu hu hu/],
135             [ qw/hua hua hua hwa hua/],
136             [ qw/huai huai huai hwai huai/],
137             [ qw/huan huan huan hwan huan/],
138             [ qw/huang huang huang hwang huang/],
139             [ qw/hui huei hui hwei huei/],
140             [ qw/hun huen hun hwun hun/],
141             [ qw/huo huo huo hwo huo/],
142             [ qw/chi ji ji ji ji/],
143             [ qw/chia jia jia jya jia/],
144             [ qw/chien jian jian jyan jian/],
145             [ qw/chiang jiang jiang jyang jiang/],
146             [ qw/chiao jiau jiao jyau jiao/],
147             [ qw/chieh jie jie jye jie/],
148             [ qw/chin jin jin jin jin/],
149             [ qw/ching jing jing jing jing/],
150             [ qw/chiung jiung jiong jyung jyong/],
151             [ qw/chiu jiou jiu jyou jiou/],
152             [ qw/chu: jiu ju jyu jyu/],
153             [ qw/chuan: jiuan juan jywan juan/],
154             [ qw/chueh: jiue jue jywe jue/],
155             [ qw/chun: jiun jun jyun jun/],
156             [ qw/k'a ka ka ka ka/],
157             [ qw/k'ai kai kai kai kai/],
158             [ qw/k'an kan kan kan kan/],
159             [ qw/k'ang kang kang kang kang/],
160             [ qw/k'ao kau kao kau kao/],
161             [ qw/k'e ke ke ke ke/],
162             [ qw/k'en ken ken ken ken/],
163             [ qw/k'eng keng keng keng keng/],
164             [ qw/k'ung kung kong kung kong/],
165             [ qw/k'ou kou kou kou kou/],
166             [ qw/k'u ku ku ku ku/],
167             [ qw/k'ua kua kua kwa kua/],
168             [ qw/k'uai kuai kuai kwai kuai/],
169             [ qw/k'uan kuan kuan kwan kuan/],
170             [ qw/k'uang kuang kuang kwang kuang/],
171             [ qw/k'uei kuei kui kwei kuei/],
172             [ qw/k'un kuen kun kwun kun/],
173             [ qw/k'uo kuo kuo kwo kuo/],
174             [ qw/la la la la la/],
175             [ qw/lai lai lai lai lai/],
176             [ qw/lan lan lan lan lan/],
177             [ qw/lang lang lang lang lang/],
178             [ qw/lao lau lao lau lao/],
179             [ qw/le le le le le/],
180             [ qw/lei lei lei lei lei/],
181             [ qw/leng leng leng leng leng/],
182             [ qw/li li li li li/],
183             [ qw/lia lia lia lya lia/],
184             [ qw/lien lian lian lyan lian/],
185             [ qw/liang liang liang lyang liang/],
186             [ qw/liao liao liao lyau liao/],
187             [ qw/lieh lie lie lye lie/],
188             [ qw/lin lin lin lin lin/],
189             [ qw/ling ling ling ling ling/],
190             [ qw/liu liou liu lyou liou/],
191             [ qw/lo lo lo lo lo/],
192             [ qw/lung lung long lung long/],
193             [ qw/lou lou lou lou lou/],
194             [ qw/lu lu lu lu lu/],
195             [ qw/lu: liu lu lyu lyu/],
196             [ qw/luan luan luan lwan luan/],
197             [ qw/luan: liuan luan lywan lyuan/],
198             [ qw/lueh: lieu lue lywe lyue/],
199             [ qw/lun luen lun lwun lun/],
200             [ qw/lun: liun lun lyun lyuen/],
201             [ qw/luo luo luo lwo luo/],
202             [ qw/ma ma ma ma ma/],
203             [ qw/mai mai mai mai mai/],
204             [ qw/man man man man man/],
205             [ qw/mang mang mang mang mang/],
206             [ qw/mao mau mao mau mao/],
207             [ qw/me me me me me/],
208             [ qw/mei mei mei mei mei/],
209             [ qw/men men men men men/],
210             [ qw/meng meng meng meng meng/],
211             [ qw/mi mi mi mi mi/],
212             [ qw/mien mian mian myan mian/],
213             [ qw/miao miau miao myau miao/],
214             [ qw/mieh mie mie mye mie/],
215             [ qw/min min min min min/],
216             [ qw/ming ming ming ming ming/],
217             [ qw/miu miou miu myou miou/],
218             [ qw/mo mo mo mwo mo/],
219             [ qw/mou mou mou mou mou/],
220             [ qw/mu mu mu mu mu/],
221             [ qw/na na na na na/],
222             [ qw/nai nai nai nai nai/],
223             [ qw/nan nan nan nan nan/],
224             [ qw/nang nang nang nang nang/],
225             [ qw/nao nau nao nau nao/],
226             [ qw/ne ne ne ne ne/],
227             [ qw/nei nei nei nei nei/],
228             [ qw/nen nen nen nen nen/],
229             [ qw/neng neng neng neng neng/],
230             [ qw/ni ni ni ni ni/],
231             [ qw/nia nia nia nya nia/],
232             [ qw/nien nian nian nyan nian/],
233             [ qw/niang niang niang nyang niang/],
234             [ qw/niao niau niao nyau niao/],
235             [ qw/nieh nie nie nye nie/],
236             [ qw/nin nin nin nin nin/],
237             [ qw/ning ning ning ning ning/],
238             [ qw/niu niou niu nyou niou/],
239             [ qw/nung nung nong nung nong/],
240             [ qw/nou nou nou nou nou/],
241             [ qw/nu nu nu nu nu/],
242             [ qw/nu: niu nu nyu nyu/],
243             [ qw/nuan nuan nuan nwan nuan/],
244             [ qw/nueh: niue nue nywe nyue/],
245             [ qw/nuen nun nun nwen nun/],
246             [ qw/no nuo nuo nwo nuo/],
247             [ qw/ou ou ou ou ou/],
248             [ qw/p'a pa pa pa pa/],
249             [ qw/p'ai pai pai pai pai/],
250             [ qw/p'an pan pan pan pan/],
251             [ qw/p'ang pang pang pang pang/],
252             [ qw/p'ao pau pao pau pao/],
253             [ qw/p'ei pei pei pei pei/],
254             [ qw/p'en pen pen pen pen/],
255             [ qw/p'eng peng peng peng peng/],
256             [ qw/p'i pi pi pi pi/],
257             [ qw/p'ien pian pian pyan pian/],
258             [ qw/p'iao piau piao pyau piao/],
259             [ qw/p'ieh pie pie pye pie/],
260             [ qw/p'in pin pin pin pin/],
261             [ qw/p'ing ping ping ping ping/],
262             [ qw/p'o po po pwo po/],
263             [ qw/p'ou pou pou pou pou/],
264             [ qw/p'u pu pu pu pu/],
265             [ qw/ch'i chi qi chi ci/],
266             [ qw/ch'ia chia qia chya cia/],
267             [ qw/ch'ien chian qian chyan cian/],
268             [ qw/ch'iang chiang qiang chyang ciang/],
269             [ qw/ch'iao chiau qiao chyau ciao/],
270             [ qw/ch'ieh chie qie chye cie/],
271             [ qw/ch'in chin qin chin cin/],
272             [ qw/ch'ing ching qing ching cing/],
273             [ qw/ch'iung chiung qiong chyung cyong/],
274             [ qw/ch'iu chiou qiu chyou ciou/],
275             [ qw/ch'u: chiu qu chyu cyu/],
276             [ qw/ch'uan: chiuan quan chywan cyuan/],
277             [ qw/ch'ueh: chiue que chywe cyue/],
278             [ qw/ch'un: chiun qun chyun cyun/],
279             [ qw/jan ran ran ran ran/],
280             [ qw/jang rang rang rang rang/],
281             [ qw/jao rau rao rau rao/],
282             [ qw/je re re re re/],
283             [ qw/jen ren ren ren ren/],
284             [ qw/jeng reng reng reng reng/],
285             [ qw/jih r ri r rih/],
286             [ qw/jung rung rong rung rong/],
287             [ qw/jou rou rou rou rou/],
288             [ qw/ju ru ru ru ru/],
289             [ qw/juan ruan ruan rwan ruan/],
290             [ qw/jui ruei rui rwei ruei/],
291             [ qw/jun run run rwun run/],
292             [ qw/jo ruo ruo rwo ruo/],
293             [ qw/sa sa sa sa sa/],
294             [ qw/sai sai sai sai sai/],
295             [ qw/san san san san san/],
296             [ qw/sang sang sang sang sang/],
297             [ qw/sao sau sao sau sao/],
298             [ qw/se se se se se/],
299             [ qw/sei sei sei sei sei/],
300             [ qw/sen sen sen sen sen/],
301             [ qw/seng seng seng seng seng/],
302             [ qw/sha sha sha sha sha/],
303             [ qw/shai shai shai shai shai/],
304             [ qw/shan shan shan shan shan/],
305             [ qw/shang shang shang shang shang/],
306             [ qw/shao shau shao shau shao/],
307             [ qw/she she she she she/],
308             [ qw/shei shei shei shei shei/],
309             [ qw/shen shen shen shen shen/],
310             [ qw/sheng sheng sheng sheng sheng/],
311             [ qw/shih shr shi shr shih/],
312             [ qw/shung shung shong shung shong/],
313             [ qw/shou shou shou shou shou/],
314             [ qw/shu shu shu shu shu/],
315             [ qw/shua shua shua shwa shua/],
316             [ qw/shuai shuai shuai shwai shuai/],
317             [ qw/shuan shuan shuan shwan shuan/],
318             [ qw/shuang shuang shuang shwang shuang/],
319             [ qw/shui shuei shui shwei shuei/],
320             [ qw/shun shuen shun shwun shun/],
321             [ qw/shuo shuo shuo shwo shuo/],
322             [ qw/ssu sz si sz sih/],
323             [ qw/sung sung song sung song/],
324             [ qw/sou sou sou sou sou/],
325             [ qw/su su su su su/],
326             [ qw/suan suan suan swan suan/],
327             [ qw/sui suei sui swei suei/],
328             [ qw/sun suen sun swun sun/],
329             [ qw/so suo suo swo suo/],
330             [ qw/t'a ta ta ta ta/],
331             [ qw/t'ai tai tai tai tai/],
332             [ qw/t'an tan tan tan tan/],
333             [ qw/t'ang tang tang tang tang/],
334             [ qw/t'ao tau tao tau tao/],
335             [ qw/t'e te te te te/],
336             [ qw/t'eng teng teng teng teng/],
337             [ qw/t'i ti ti ti ti/],
338             [ qw/t'ien tian tian tyan tian/],
339             [ qw/t'iao tiau tiao tyau tiao/],
340             [ qw/t'ieh tie tie tye tie/],
341             [ qw/t'ing ting ting ting ting/],
342             [ qw/t'ung tung tong tung tong/],
343             [ qw/t'ou tou tou tou tou/],
344             [ qw/t'u tu tu tu tu/],
345             [ qw/t'uan tuan tuan twan tuan/],
346             [ qw/t'ui tuei tui twei tuei/],
347             [ qw/t'un tuen tun twun tun/],
348             [ qw/t'o tuo tuo two tuo/],
349             [ qw/wa wa wa wa wa/],
350             [ qw/wai wai wai wai wai/],
351             [ qw/wan wan wan wan wan/],
352             [ qw/wang wang wang wang wang/],
353             [ qw/wei wei wei wei wei/],
354             [ qw/wen wen wen wen wun/],
355             [ qw/weng weng weng weng wong/],
356             [ qw/wo wo wo wo wo/],
357             [ qw/wu wu wu wu wu/],
358             [ qw/hsi shi xi syi si/],
359             [ qw/hsia shia xia sya sia/],
360             [ qw/hsien shian xian syan sian/],
361             [ qw/hsiang shiang xiang syang siang/],
362             [ qw/hsiao shiau xiao syau siao/],
363             [ qw/hsieh shie xie sye sie/],
364             [ qw/hsin shin xin syin sin/],
365             [ qw/hsing shing xing sying sing/],
366             [ qw/hsiung shiung xiong syung syong/],
367             [ qw/hsiu shiou xiu syou siou/],
368             [ qw/hsu: shiu xu syu syu/],
369             [ qw/hsuan: shiuan xuan sywan syuan/],
370             [ qw/hsueh: shiue xue sywe syue/],
371             [ qw/hsun: shiun xun syun syun/],
372             [ qw/ya ya ya ya ya/],
373             [ qw/yai yai yai yai yai/],
374             [ qw/yan yan yan yan yan/],
375             [ qw/yang yang yang yang yang/],
376             [ qw/yao yau yao yau yao/],
377             [ qw/yeh ye ye ye ye/],
378             [ qw/i yi yi yi yi/],
379             [ qw/yin yin yin yin yin/],
380             [ qw/ying ying ying ying ying/],
381             [ qw/yung yung yong yung yong/],
382             [ qw/yu you you you you/],
383             [ qw/yu: yu yu yu yu/],
384             [ qw/yuan: yuan yuan ywan yuan/],
385             [ qw/yueh: yue yue ywe yue/],
386             [ qw/yun: yun yun yun yun/],
387             [ qw/tsa tza za dza za/],
388             [ qw/tsai tzai zai dzai zai/],
389             [ qw/tsan tzan zan dzan zan/],
390             [ qw/tsang tzang zang dzang zang/],
391             [ qw/tsao tzau zao dzau zao/],
392             [ qw/tse tze ze dze ze/],
393             [ qw/tsei tzei zei dzei zei/],
394             [ qw/tsen tzen zen dzen zen/],
395             [ qw/tseng tzeng zeng dzeng zeng/],
396             [ qw/cha ja zha ja jha/],
397             [ qw/chai jai zhai jai jhai/],
398             [ qw/chan jan zhan jan jhan/],
399             [ qw/chang jang zhang jang jhang/],
400             [ qw/chao jau zhao jau jhao/],
401             [ qw/che je zhe je jhe/],
402             [ qw/chei jei zhei jei jhei/],
403             [ qw/chen jen zhen jen jhen/],
404             [ qw/cheng jeng zheng jeng jheng/],
405             [ qw/chih jr zhi jr jhih/],
406             [ qw/chung jung zhong jung jhong/],
407             [ qw/chou jou zhou jou jhou/],
408             [ qw/chu ju zhu ju jhu/],
409             [ qw/chua jua zhua jwa jhua/],
410             [ qw/chuai juai zhuai jwai jhuai/],
411             [ qw/chuan juan zhuan jwan jhuan/],
412             [ qw/chuang juang zhuang jwang jhuang/],
413             [ qw/chui juei zhui jwei jhuei/],
414             [ qw/chun juen zhun jwun jhun/],
415             [ qw/cho juo zhuo jwo jhuo/],
416             [ qw/tzu tz zi dz zih/],
417             [ qw/tsung tzung zong dzung zong/],
418             [ qw/tsou tzou zou dzou zou/],
419             [ qw/tsu tzu zu dzu zu/],
420             [ qw/tsuan tzuan zuan dzwan zuan/],
421             [ qw/tsui tzuei zui dzwei zuei/],
422             [ qw/tsun tzuen zun dzwun zun/],
423             [ qw/tso tzuo zuo dzwo zuo/],
424             );
425              
426             # building index
427             my (%idx);
428             my $i = 0;
429             for my $p (@PS){
430             for (@$p){
431             $idx{lc $_}->{$i} = 1;
432             }
433             $i++;
434             }
435              
436             my %enum = (
437             'wade-giles' => 0,
438             'mps-2' => 1,
439             'hanyu' => 2,
440             'yale' => 3,
441             'tongyong' => 4
442             );
443              
444             # table lookup
445             sub transfer($$$){
446 276     276 0 381 my ($pinyin, $from, $to) = @_;
447 276 50       642 return unless exists $idx{lc $pinyin};
448 276         533 for my $line (keys %{$idx{lc $pinyin}}){
  276         987  
449 296 100       1348 return $PS[$line]->[$to] if($PS[$line]->[$from] eq $pinyin);
450             }
451             }
452              
453             sub convert($$$) {
454 4     4 1 516 my ($from, $to, $text) = @_;
455 4 50       30 $from = ( exists $enum{lc $from} ? $enum{lc $from} : croak "No such a system");
456 4 50       18 $to = ( exists $enum{lc $to} ? $enum{lc $to} : croak "No such a system");
457              
458 4         7 my ($offset, $sslen, $ss, $matched, $rets, $targets, $SS);
459 4         30 for($offset = 0; $offset < length $text; ){
460 678         746 $matched = 0;
461 678         1432 for($sslen = 7; $sslen>0; $sslen--){
462 3990         6247 my $SS = substr($text, $offset, $sslen);
463 3990 100       28536 last unless $SS =~ m([':A-Za-z])o;
464 3588         4944 my $ss = lc $SS;
465 3588 100       11215 if( exists $idx{$ss} ){
466 276         497 $targets = transfer($ss, $from, $to);
467 276 50       663 if($targets){
468 276 50       837 $targets = ucfirst $targets if $SS =~ /^[A-Z]/o;
469 276         342 $offset += length $ss;
470 276         296 $matched = 1;
471 276         1552 last;
472             }
473             }
474             }
475 678 100       1149 unless ($matched){
476 402         703 $rets .= substr($text, $offset, 1);
477 402         871 $offset++;
478             }
479             else{
480 276         810 $rets .= $targets;
481             }
482             }
483 4         38 $rets;
484             }
485              
486             1;
487             __END__