support two letter yunmu from full pinyin
[platform/upstream/libpinyin.git] / scripts / bopomofo.py
1 # -*- coding: utf-8 -*-
2 # vim:set et sts=4 sw=4:
3 #
4 # libpinyin - Library to deal with pinyin.
5 #
6 # Copyright (c) 2010 BYVoid <byvoid1@gmail.com>
7 # Copyright (C) 2011 Peng Wu <alexepico@gmail.com>
8 #
9 # This program is free software; you can redistribute it and/or modify
10 # it under the terms of the GNU General Public License as published by
11 # the Free Software Foundation; either version 2, or (at your option)
12 # any later version.
13 #
14 # This program is distributed in the hope that it will be useful,
15 # but WITHOUT ANY WARRANTY; without even the implied warranty of
16 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
17 # GNU General Public License for more details.
18 #
19 # You should have received a copy of the GNU General Public License
20 # along with this program; if not, write to the Free Software
21 # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
22
23
24 BOPOMOFO_PINYIN_MAP = {
25     "ㄅ" : "b",
26     "ㄅㄚ" : "ba",
27     "ㄅㄛ" : "bo",
28     "ㄅㄞ" : "bai",
29     "ㄅㄟ" : "bei",
30     "ㄅㄠ" : "bao",
31     "ㄅㄢ" : "ban",
32     "ㄅㄣ" : "ben",
33     "ㄅㄤ" : "bang",
34     "ㄅㄥ" : "beng",
35     "ㄅㄧ" : "bi",
36     "ㄅㄧㄝ" : "bie",
37     "ㄅㄧㄠ" : "biao",
38     "ㄅㄧㄢ" : "bian",
39     "ㄅㄧㄣ" : "bin",
40     "ㄅㄧㄥ" : "bing",
41     "ㄅㄨ" : "bu",
42     "ㄆ" : "p",
43     "ㄆㄚ" : "pa",
44     "ㄆㄛ" : "po",
45     "ㄆㄞ" : "pai",
46     "ㄆㄟ" : "pei",
47     "ㄆㄠ" : "pao",
48     "ㄆㄡ" : "pou",
49     "ㄆㄢ" : "pan",
50     "ㄆㄣ" : "pen",
51     "ㄆㄤ" : "pang",
52     "ㄆㄥ" : "peng",
53     "ㄆㄧ" : "pi",
54     "ㄆㄧㄝ" : "pie",
55     "ㄆㄧㄠ" : "piao",
56     "ㄆㄧㄢ" : "pian",
57     "ㄆㄧㄣ" : "pin",
58     "ㄆㄧㄥ" : "ping",
59     "ㄆㄨ" : "pu",
60     "ㄇ" : "m",
61     "ㄇㄚ" : "ma",
62     "ㄇㄛ" : "mo",
63     "ㄇㄜ" : "me",
64     "ㄇㄞ" : "mai",
65     "ㄇㄟ" : "mei",
66     "ㄇㄠ" : "mao",
67     "ㄇㄡ" : "mou",
68     "ㄇㄢ" : "man",
69     "ㄇㄣ" : "men",
70     "ㄇㄤ" : "mang",
71     "ㄇㄥ" : "meng",
72     "ㄇㄧ" : "mi",
73     "ㄇㄧㄝ" : "mie",
74     "ㄇㄧㄠ" : "miao",
75     "ㄇㄧㄡ" : "miu",
76     "ㄇㄧㄢ" : "mian",
77     "ㄇㄧㄣ" : "min",
78     "ㄇㄧㄥ" : "ming",
79     "ㄇㄨ" : "mu",
80     "ㄈ" : "f",
81     "ㄈㄚ" : "fa",
82     "ㄈㄛ" : "fo",
83     "ㄈㄜ" : "fe",
84     "ㄈㄟ" : "fei",
85     "ㄈㄡ" : "fou",
86     "ㄈㄢ" : "fan",
87     "ㄈㄣ" : "fen",
88     "ㄈㄤ" : "fang",
89     "ㄈㄥ" : "feng",
90     "ㄈㄨ" : "fu",
91     "ㄉ" : "d",
92     "ㄉㄚ" : "da",
93     "ㄉㄜ" : "de",
94     "ㄉㄞ" : "dai",
95     "ㄉㄟ" : "dei",
96     "ㄉㄠ" : "dao",
97     "ㄉㄡ" : "dou",
98     "ㄉㄢ" : "dan",
99     "ㄉㄣ" : "den",
100     "ㄉㄤ" : "dang",
101     "ㄉㄥ" : "deng",
102     "ㄉㄧ" : "di",
103     "ㄉㄧㄚ" : "dia",
104     "ㄉㄧㄝ" : "die",
105     "ㄉㄧㄠ" : "diao",
106     "ㄉㄧㄡ" : "diu",
107     "ㄉㄧㄢ" : "dian",
108     "ㄉㄧㄣ" : "din",
109     "ㄉㄧㄥ" : "ding",
110     "ㄉㄨ" : "du",
111     "ㄉㄨㄛ" : "duo",
112     "ㄉㄨㄟ" : "dui",
113     "ㄉㄨㄢ" : "duan",
114     "ㄉㄨㄣ" : "dun",
115     "ㄉㄨㄥ" : "dong",
116     "ㄊ" : "t",
117     "ㄊㄚ" : "ta",
118     "ㄊㄜ" : "te",
119     "ㄊㄞ" : "tai",
120     "ㄊㄠ" : "tao",
121     "ㄊㄡ" : "tou",
122     "ㄊㄢ" : "tan",
123     "ㄊㄤ" : "tang",
124     "ㄊㄥ" : "teng",
125     "ㄊㄧ" : "ti",
126     "ㄊㄧㄝ" : "tie",
127     "ㄊㄧㄠ" : "tiao",
128     "ㄊㄧㄢ" : "tian",
129     "ㄊㄧㄥ" : "ting",
130     "ㄊㄨ" : "tu",
131     "ㄊㄨㄛ" : "tuo",
132     "ㄊㄨㄟ" : "tui",
133     "ㄊㄨㄢ" : "tuan",
134     "ㄊㄨㄣ" : "tun",
135     "ㄊㄨㄥ" : "tong",
136     "ㄋ" : "n",
137     "ㄋㄚ" : "na",
138     "ㄋㄜ" : "ne",
139     "ㄋㄞ" : "nai",
140     "ㄋㄟ" : "nei",
141     "ㄋㄠ" : "nao",
142     "ㄋㄡ" : "nou",
143     "ㄋㄢ" : "nan",
144     "ㄋㄣ" : "nen",
145     "ㄋㄤ" : "nang",
146     "ㄋㄥ" : "neng",
147     "ㄋㄧ" : "ni",
148     "ㄋㄧㄚ" : "nia",
149     "ㄋㄧㄝ" : "nie",
150     "ㄋㄧㄠ" : "niao",
151     "ㄋㄧㄡ" : "niu",
152     "ㄋㄧㄢ" : "nian",
153     "ㄋㄧㄣ" : "nin",
154     "ㄋㄧㄤ" : "niang",
155     "ㄋㄧㄥ" : "ning",
156     "ㄋㄨ" : "nu",
157     "ㄋㄨㄛ" : "nuo",
158     "ㄋㄨㄢ" : "nuan",
159     "ㄋㄨㄣ" : "nun",
160     "ㄋㄨㄥ" : "nong",
161     "ㄋㄩ" : "nv",
162     "ㄋㄩㄝ" : "nve",
163     "ㄌ" : "l",
164     "ㄌㄚ" : "la",
165     "ㄌㄛ" : "lo",
166     "ㄌㄜ" : "le",
167     "ㄌㄞ" : "lai",
168     "ㄌㄟ" : "lei",
169     "ㄌㄠ" : "lao",
170     "ㄌㄡ" : "lou",
171     "ㄌㄢ" : "lan",
172     "ㄌㄣ" : "len",
173     "ㄌㄤ" : "lang",
174     "ㄌㄥ" : "leng",
175     "ㄌㄧ" : "li",
176     "ㄌㄧㄚ" : "lia",
177     "ㄌㄧㄝ" : "lie",
178     "ㄌㄧㄠ" : "liao",
179     "ㄌㄧㄡ" : "liu",
180     "ㄌㄧㄢ" : "lian",
181     "ㄌㄧㄣ" : "lin",
182     "ㄌㄧㄤ" : "liang",
183     "ㄌㄧㄥ" : "ling",
184     "ㄌㄨ" : "lu",
185     "ㄌㄨㄛ" : "luo",
186     "ㄌㄨㄢ" : "luan",
187     "ㄌㄨㄣ" : "lun",
188     "ㄌㄨㄥ" : "long",
189     "ㄌㄩ" : "lv",
190     "ㄌㄩㄝ" : "lve",
191     "ㄍ" : "g",
192     "ㄍㄚ" : "ga",
193     "ㄍㄜ" : "ge",
194     "ㄍㄞ" : "gai",
195     "ㄍㄟ" : "gei",
196     "ㄍㄠ" : "gao",
197     "ㄍㄡ" : "gou",
198     "ㄍㄢ" : "gan",
199     "ㄍㄣ" : "gen",
200     "ㄍㄤ" : "gang",
201     "ㄍㄥ" : "geng",
202     "ㄍㄨ" : "gu",
203     "ㄍㄨㄚ" : "gua",
204     "ㄍㄨㄛ" : "guo",
205     "ㄍㄨㄞ" : "guai",
206     "ㄍㄨㄟ" : "gui",
207     "ㄍㄨㄢ" : "guan",
208     "ㄍㄨㄣ" : "gun",
209     "ㄍㄨㄤ" : "guang",
210     "ㄍㄨㄥ" : "gong",
211     "ㄎ" : "k",
212     "ㄎㄚ" : "ka",
213     "ㄎㄜ" : "ke",
214     "ㄎㄞ" : "kai",
215     "ㄎㄟ" : "kei",
216     "ㄎㄠ" : "kao",
217     "ㄎㄡ" : "kou",
218     "ㄎㄢ" : "kan",
219     "ㄎㄣ" : "ken",
220     "ㄎㄤ" : "kang",
221     "ㄎㄥ" : "keng",
222     "ㄎㄨ" : "ku",
223     "ㄎㄨㄚ" : "kua",
224     "ㄎㄨㄛ" : "kuo",
225     "ㄎㄨㄞ" : "kuai",
226     "ㄎㄨㄟ" : "kui",
227     "ㄎㄨㄢ" : "kuan",
228     "ㄎㄨㄣ" : "kun",
229     "ㄎㄨㄤ" : "kuang",
230     "ㄎㄨㄥ" : "kong",
231     "ㄏ" : "h",
232     "ㄏㄚ" : "ha",
233     "ㄏㄜ" : "he",
234     "ㄏㄞ" : "hai",
235     "ㄏㄟ" : "hei",
236     "ㄏㄠ" : "hao",
237     "ㄏㄡ" : "hou",
238     "ㄏㄢ" : "han",
239     "ㄏㄣ" : "hen",
240     "ㄏㄤ" : "hang",
241     "ㄏㄥ" : "heng",
242     "ㄏㄨ" : "hu",
243     "ㄏㄨㄚ" : "hua",
244     "ㄏㄨㄛ" : "huo",
245     "ㄏㄨㄞ" : "huai",
246     "ㄏㄨㄟ" : "hui",
247     "ㄏㄨㄢ" : "huan",
248     "ㄏㄨㄣ" : "hun",
249     "ㄏㄨㄤ" : "huang",
250     "ㄏㄨㄥ" : "hong",
251     "ㄐ" : "j",
252     "ㄐㄧ" : "ji",
253     "ㄐㄧㄚ" : "jia",
254     "ㄐㄧㄝ" : "jie",
255     "ㄐㄧㄠ" : "jiao",
256     "ㄐㄧㄡ" : "jiu",
257     "ㄐㄧㄢ" : "jian",
258     "ㄐㄧㄣ" : "jin",
259     "ㄐㄧㄤ" : "jiang",
260     "ㄐㄧㄥ" : "jing",
261     "ㄐㄩ" : "ju",
262     "ㄐㄩㄝ" : "jue",
263     "ㄐㄩㄢ" : "juan",
264     "ㄐㄩㄣ" : "jun",
265     "ㄐㄩㄥ" : "jiong",
266     "ㄑ" : "q",
267     "ㄑㄧ" : "qi",
268     "ㄑㄧㄚ" : "qia",
269     "ㄑㄧㄝ" : "qie",
270     "ㄑㄧㄠ" : "qiao",
271     "ㄑㄧㄡ" : "qiu",
272     "ㄑㄧㄢ" : "qian",
273     "ㄑㄧㄣ" : "qin",
274     "ㄑㄧㄤ" : "qiang",
275     "ㄑㄧㄥ" : "qing",
276     "ㄑㄩ" : "qu",
277     "ㄑㄩㄝ" : "que",
278     "ㄑㄩㄢ" : "quan",
279     "ㄑㄩㄣ" : "qun",
280     "ㄑㄩㄥ" : "qiong",
281     "ㄒ" : "x",
282     "ㄒㄧ" : "xi",
283     "ㄒㄧㄚ" : "xia",
284     "ㄒㄧㄝ" : "xie",
285     "ㄒㄧㄠ" : "xiao",
286     "ㄒㄧㄡ" : "xiu",
287     "ㄒㄧㄢ" : "xian",
288     "ㄒㄧㄣ" : "xin",
289     "ㄒㄧㄤ" : "xiang",
290     "ㄒㄧㄥ" : "xing",
291     "ㄒㄩ" : "xu",
292     "ㄒㄩㄝ" : "xue",
293     "ㄒㄩㄢ" : "xuan",
294     "ㄒㄩㄣ" : "xun",
295     "ㄒㄩㄥ" : "xiong",
296     "ㄓ" : "zhi",
297     "ㄓㄚ" : "zha",
298     "ㄓㄜ" : "zhe",
299     "ㄓㄞ" : "zhai",
300     "ㄓㄟ" : "zhei",
301     "ㄓㄠ" : "zhao",
302     "ㄓㄡ" : "zhou",
303     "ㄓㄢ" : "zhan",
304     "ㄓㄣ" : "zhen",
305     "ㄓㄤ" : "zhang",
306     "ㄓㄥ" : "zheng",
307     "ㄓㄨ" : "zhu",
308     "ㄓㄨㄚ" : "zhua",
309     "ㄓㄨㄛ" : "zhuo",
310     "ㄓㄨㄞ" : "zhuai",
311     "ㄓㄨㄟ" : "zhui",
312     "ㄓㄨㄢ" : "zhuan",
313     "ㄓㄨㄣ" : "zhun",
314     "ㄓㄨㄤ" : "zhuang",
315     "ㄓㄨㄥ" : "zhong",
316     "ㄔ" : "chi",
317     "ㄔㄚ" : "cha",
318     "ㄔㄜ" : "che",
319     "ㄔㄞ" : "chai",
320     "ㄔㄠ" : "chao",
321     "ㄔㄡ" : "chou",
322     "ㄔㄢ" : "chan",
323     "ㄔㄣ" : "chen",
324     "ㄔㄤ" : "chang",
325     "ㄔㄥ" : "cheng",
326     "ㄔㄨ" : "chu",
327     "ㄔㄨㄚ" : "chua",
328     "ㄔㄨㄛ" : "chuo",
329     "ㄔㄨㄞ" : "chuai",
330     "ㄔㄨㄟ" : "chui",
331     "ㄔㄨㄢ" : "chuan",
332     "ㄔㄨㄣ" : "chun",
333     "ㄔㄨㄤ" : "chuang",
334     "ㄔㄨㄥ" : "chong",
335     "ㄕ" : "shi",
336     "ㄕㄚ" : "sha",
337     "ㄕㄜ" : "she",
338     "ㄕㄞ" : "shai",
339     "ㄕㄟ" : "shei",
340     "ㄕㄠ" : "shao",
341     "ㄕㄡ" : "shou",
342     "ㄕㄢ" : "shan",
343     "ㄕㄣ" : "shen",
344     "ㄕㄤ" : "shang",
345     "ㄕㄥ" : "sheng",
346     "ㄕㄨ" : "shu",
347     "ㄕㄨㄚ" : "shua",
348     "ㄕㄨㄛ" : "shuo",
349     "ㄕㄨㄞ" : "shuai",
350     "ㄕㄨㄟ" : "shui",
351     "ㄕㄨㄢ" : "shuan",
352     "ㄕㄨㄣ" : "shun",
353     "ㄕㄨㄤ" : "shuang",
354     "ㄖ" : "ri",
355     "ㄖㄜ" : "re",
356     "ㄖㄠ" : "rao",
357     "ㄖㄡ" : "rou",
358     "ㄖㄢ" : "ran",
359     "ㄖㄣ" : "ren",
360     "ㄖㄤ" : "rang",
361     "ㄖㄥ" : "reng",
362     "ㄖㄨ" : "ru",
363     "ㄖㄨㄚ" : "rua",
364     "ㄖㄨㄛ" : "ruo",
365     "ㄖㄨㄟ" : "rui",
366     "ㄖㄨㄢ" : "ruan",
367     "ㄖㄨㄣ" : "run",
368     "ㄖㄨㄥ" : "rong",
369     "ㄗ" : "zi",
370     "ㄗㄚ" : "za",
371     "ㄗㄜ" : "ze",
372     "ㄗㄞ" : "zai",
373     "ㄗㄟ" : "zei",
374     "ㄗㄠ" : "zao",
375     "ㄗㄡ" : "zou",
376     "ㄗㄢ" : "zan",
377     "ㄗㄣ" : "zen",
378     "ㄗㄤ" : "zang",
379     "ㄗㄥ" : "zeng",
380     "ㄗㄨ" : "zu",
381     "ㄗㄨㄛ" : "zuo",
382     "ㄗㄨㄟ" : "zui",
383     "ㄗㄨㄢ" : "zuan",
384     "ㄗㄨㄣ" : "zun",
385     "ㄗㄨㄥ" : "zong",
386     "ㄘ" : "ci",
387     "ㄘㄚ" : "ca",
388     "ㄘㄜ" : "ce",
389     "ㄘㄞ" : "cai",
390     "ㄘㄠ" : "cao",
391     "ㄘㄡ" : "cou",
392     "ㄘㄢ" : "can",
393     "ㄘㄣ" : "cen",
394     "ㄘㄤ" : "cang",
395     "ㄘㄥ" : "ceng",
396     "ㄘㄨ" : "cu",
397     "ㄘㄨㄛ" : "cuo",
398     "ㄘㄨㄟ" : "cui",
399     "ㄘㄨㄢ" : "cuan",
400     "ㄘㄨㄣ" : "cun",
401     "ㄘㄨㄥ" : "cong",
402     "ㄙ" : "si",
403     "ㄙㄚ" : "sa",
404     "ㄙㄜ" : "se",
405     "ㄙㄞ" : "sai",
406     "ㄙㄠ" : "sao",
407     "ㄙㄡ" : "sou",
408     "ㄙㄢ" : "san",
409     "ㄙㄣ" : "sen",
410     "ㄙㄤ" : "sang",
411     "ㄙㄥ" : "seng",
412     "ㄙㄨ" : "su",
413     "ㄙㄨㄛ" : "suo",
414     "ㄙㄨㄟ" : "sui",
415     "ㄙㄨㄢ" : "suan",
416     "ㄙㄨㄣ" : "sun",
417     "ㄙㄨㄥ" : "song",
418     "ㄚ" : "a",
419     "ㄛ" : "o",
420     "ㄜ" : "e",
421     "ㄞ" : "ai",
422     "ㄟ" : "ei",
423     "ㄠ" : "ao",
424     "ㄡ" : "ou",
425     "ㄢ" : "an",
426     "ㄣ" : "en",
427     "ㄤ" : "ang",
428     "ㄥ" : "eng",
429     "ㄦ" : "er",
430     "ㄧ" : "yi",
431     "ㄧㄚ" : "ya",
432     "ㄧㄛ" : "yo",
433     "ㄧㄝ" : "ye",
434     "ㄧㄞ" : "yai",
435     "ㄧㄠ" : "yao",
436     "ㄧㄡ" : "you",
437     "ㄧㄢ" : "yan",
438     "ㄧㄣ" : "yin",
439     "ㄧㄤ" : "yang",
440     "ㄧㄥ" : "ying",
441     "ㄨ" : "wu",
442     "ㄨㄚ" : "wa",
443     "ㄨㄛ" : "wo",
444     "ㄨㄞ" : "wai",
445     "ㄨㄟ" : "wei",
446     "ㄨㄢ" : "wan",
447     "ㄨㄣ" : "wen",
448     "ㄨㄤ" : "wang",
449     "ㄨㄥ" : "weng",
450     "ㄩ" : "yu",
451     "ㄩㄝ" : "yue",
452     "ㄩㄢ" : "yuan",
453     "ㄩㄣ" : "yun",
454     "ㄩㄥ" : "yong",
455     "ㄫ" : "ng",
456 }
457
458 PINYIN_BOPOMOFO_MAP = dict([(v, k) for k, v in BOPOMOFO_PINYIN_MAP.items()])
459
460 SPECIAL_INITIAL_SET = {'ci', 'chi', 'si', 'shi', 'zi', 'zhi', 'ri'}
461
462 '''
463 SHENG_YUN_BOPOMOFO_MAP = {
464     "b" : "ㄅ",
465     "p" : "ㄆ",
466     "m" : "ㄇ",
467     "f" : "ㄈ",
468     "d" : "ㄉ",
469     "t" : "ㄊ",
470     "n" : "ㄋ",
471     "l" : "ㄌ",
472     "g" : "ㄍ",
473     "k" : "ㄎ",
474     "h" : "ㄏ",
475     "j" : "ㄐ",
476     "q" : "ㄑ",
477     "x" : "ㄒ",
478     "zh" : "ㄓ",
479     "ch" : "ㄔ",
480     "sh" : "ㄕ",
481     "r" : "ㄖ",
482     "z" : "ㄗ",
483     "c" : "ㄘ",
484     "s" : "ㄙ",
485
486     # 韻母為u,ue,un,uan,ong時ㄧ省略
487     "y" : ("ㄧ", (("u", "ue", "un", "uan", "ong"), "")),
488     "w" : "ㄨ",
489     "a" : "ㄚ",
490     "o" : "ㄛ",
491     "e" : ("ㄜ", ("y", "ㄝ")),  # y後面為ㄝ
492
493     # zh ch sh r z c s y後面為空
494     "i" : ("ㄧ", (("zh", "ch", "sh", "r", "z", "c", "s", "y"), "")),
495
496     # jqxy後面為ㄩ w後面為空
497     "u" : ("ㄨ", ("jqxy", "ㄩ")),
498     "v" : "ㄩ",
499     "ai" : "ㄞ",
500     "ei" : "ㄟ",
501     "ao" : "ㄠ",
502     "ou" : "ㄡ",
503     "an" : "ㄢ",
504     "en" : "ㄣ",
505     "ang" : "ㄤ",
506     "eng" : "ㄥ",
507     "er" : "ㄦ",
508     "ia" : "ㄧㄚ",
509     "ie" : "ㄧㄝ",
510     "iai" : "ㄧㄞ",
511     "iao" : "ㄧㄠ",
512     "iu" : "ㄧㄡ",
513     "ian" : "ㄧㄢ",
514     "in" : ("ㄧㄣ", ("y", "ㄣ")),      #y後面為ㄣ
515     "iang" : "ㄧㄤ",
516     "ing" : ("ㄧㄥ", ("y", "ㄥ")),     #y後面為ㄥ
517     "ua" : "ㄨㄚ",
518     "uo" : "ㄨㄛ",
519     "ue" : "ㄩㄝ",
520     # TODO: "ve" is OK?
521     "ve" : "ㄩㄝ",
522     "uai" : "ㄨㄞ",
523     "ui" : "ㄨㄟ",
524     "uan" :  ("ㄨㄢ", ("jqxy", "ㄩㄢ")),  # jqxy後面是ㄩㄢ
525     "un" :   ("ㄨㄣ", ("jqxy", "ㄩㄣ")),  # jqxy後面是ㄩㄣ
526     "uang" : ("ㄨㄤ", ("jqxy", "ㄩㄤ")),  # jqxy後面是ㄩㄤ
527     "ong" :  ("ㄨㄥ", ("jqxy", "ㄩㄥ")),  # y後面為ㄩㄥ
528     "iong" : "ㄩㄥ",
529 }
530 '''