wadegiles.py 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559
  1. # -*- coding: utf-8 -*-
  2. from __future__ import unicode_literals
  3. from pypinyin.constants import Style
  4. from pypinyin.style import register
  5. from pypinyin.style._utils import replace_symbol_to_no_symbol
  6. from pypinyin.style._utils import get_initials
  7. # https://en.wikipedia.org/wiki/Wade%E2%80%93Giles
  8. # https://web.archive.org/web/20070128065433/http://polaris.gseis.ucla.edu/skozerow/wadegiles.htm
  9. # https://www.lib.uchicago.edu/about/directory/departments/eastasia/find/wade-giles-pinyin-conversion-table/
  10. # https://www.zdic.net/ts/fulu/2019/05/18.html
  11. _convert_table = [
  12. ['a', 'a'],
  13. ['ai', 'ai'],
  14. ['an', 'an'],
  15. ['ang', 'ang'],
  16. ['ao', 'ao'],
  17. ['zha', 'cha'],
  18. ['cha', 'ch\'a'],
  19. ['zhai', 'chai'],
  20. ['chai', 'ch\'ai'],
  21. ['zhan', 'chan'],
  22. ['chan', 'ch\'an'],
  23. ['zhang', 'chang'],
  24. ['chang', 'ch\'ang'],
  25. ['zhao', 'chao'],
  26. ['chao', 'ch\'ao'],
  27. ['zhe', 'che'],
  28. ['che', 'ch\'e'],
  29. ['zhen', 'chen'],
  30. ['chen', 'ch\'en'],
  31. ['zheng', 'cheng'],
  32. ['cheng', 'ch\'eng'],
  33. ['ji', 'chi'],
  34. ['qi', 'ch\'i'],
  35. ['jia', 'chia'],
  36. ['qia', 'ch\'ia'],
  37. ['jiang', 'chiang'],
  38. ['qiang', 'ch\'iang'],
  39. ['jiao', 'chiao'],
  40. ['qiao', 'ch\'iao'],
  41. ['jie', 'chieh'],
  42. ['qie', 'ch\'ieh'],
  43. ['jian', 'chien'],
  44. ['qian', 'ch\'ien'],
  45. ['zhi', 'chih'],
  46. ['chi', 'ch\'ih'],
  47. ['jin', 'chin'],
  48. ['qin', 'ch\'in'],
  49. ['jing', 'ching'],
  50. ['qing', 'ch\'ing'],
  51. ['jiu', 'chiu'],
  52. ['qiu', 'ch\'iu'],
  53. ['jiong', 'chiung'],
  54. ['qiong', 'ch\'iung'],
  55. ['zhuo', 'cho'],
  56. ['chuo', 'ch\'o'],
  57. ['zhou', 'chou'],
  58. ['chou', 'ch\'ou'],
  59. ['zhu', 'chu'],
  60. ['chu', 'ch\'u'],
  61. ['ju', 'chü'],
  62. ['qu', 'ch\'ü'],
  63. ['zhua', 'chua'],
  64. ['zhuai', 'chuai'],
  65. ['chuai', 'ch\'uai'],
  66. ['zhuan', 'chuan'],
  67. ['chuan', 'ch\'uan'],
  68. ['juan', 'chüan'],
  69. ['quan', 'ch\'üan'],
  70. ['zhuang', 'chuang'],
  71. ['chuang', 'ch\'uang'],
  72. ['jue', 'chüeh'],
  73. ['que', 'ch\'üeh'],
  74. ['zhui', 'chui'],
  75. ['chui', 'ch\'ui'],
  76. ['zhun', 'chun'],
  77. ['chun', 'ch\'un'],
  78. ['jun', 'chün'],
  79. ['qun', 'ch\'ün'],
  80. ['zhong', 'chung'],
  81. ['chong', 'ch\'ung'],
  82. ['en', 'en'],
  83. ['er', 'erh'],
  84. ['fa', 'fa'],
  85. ['fan', 'fan'],
  86. ['fang', 'fang'],
  87. ['fei', 'fei'],
  88. ['fen', 'fen'],
  89. ['feng', 'feng'],
  90. ['fo', 'fo'],
  91. ['fou', 'fou'],
  92. ['fu', 'fu'],
  93. ['ha', 'ha'],
  94. ['hai', 'hai'],
  95. ['han', 'han'],
  96. ['hang', 'hang'],
  97. ['hao', 'hao'],
  98. ['hei', 'hei'],
  99. ['hen', 'hen'],
  100. ['heng', 'heng'],
  101. ['he', 'ho'],
  102. ['hou', 'hou'],
  103. ['xi', 'hsi'],
  104. ['xia', 'hsia'],
  105. ['xiang', 'hsiang'],
  106. ['xiao', 'hsiao'],
  107. ['xie', 'hsieh'],
  108. ['xian', 'hsien'],
  109. ['xin', 'hsin'],
  110. ['xing', 'hsing'],
  111. ['xiu', 'hsiu'],
  112. ['xiong', 'hsiung'],
  113. ['xu', 'hsü'],
  114. ['xuan', 'hsüan'],
  115. ['xue', 'hsüeh'],
  116. ['xun', 'hsün'],
  117. ['hu', 'hu'],
  118. ['hua', 'hua'],
  119. ['huai', 'huai'],
  120. ['huan', 'huan'],
  121. ['huang', 'huang'],
  122. ['hui', 'hui'],
  123. ['hun', 'hun'],
  124. ['hong', 'hung'],
  125. ['huo', 'huo'],
  126. ['yi', 'i'],
  127. ['ran', 'jan'],
  128. ['rang', 'jang'],
  129. ['rao', 'jao'],
  130. ['re', 'je'],
  131. ['ren', 'jen'],
  132. ['reng', 'jeng'],
  133. ['ri', 'jih'],
  134. ['ruo', 'jo'],
  135. ['rou', 'jou'],
  136. ['ru', 'ju'],
  137. ['ruan', 'juan'],
  138. ['rui', 'jui'],
  139. ['run', 'jun'],
  140. ['rong', 'jung'],
  141. ['ga', 'ka'],
  142. ['ka', 'k\'a'],
  143. ['gai', 'kai'],
  144. ['kai', 'k\'ai'],
  145. ['gan', 'kan'],
  146. ['kan', 'k\'an'],
  147. ['gang', 'kang'],
  148. ['kang', 'k\'ang'],
  149. ['gao', 'kao'],
  150. ['kao', 'k\'ao'],
  151. ['gen', 'ken'],
  152. ['ken', 'k\'en'],
  153. ['geng', 'keng'],
  154. ['keng', 'k\'eng'],
  155. ['ge', 'ko'],
  156. ['ke', 'k\'o'],
  157. ['gou', 'kou'],
  158. ['kou', 'k\'ou'],
  159. ['gu', 'ku'],
  160. ['ku', 'k\'u'],
  161. ['gua', 'kua'],
  162. ['kua', 'k\'ua'],
  163. ['guai', 'kuai'],
  164. ['kuai', 'k\'uai'],
  165. ['guan', 'kuan'],
  166. ['kuan', 'k\'uan'],
  167. ['guang', 'kuang'],
  168. ['kuang', 'k\'uang'],
  169. ['gui', 'kuei'],
  170. ['kui', 'k\'uei'],
  171. ['gun', 'kun'],
  172. ['kun', 'k\'un'],
  173. ['gong', 'kung'],
  174. ['kong', 'k\'ung'],
  175. ['guo', 'kuo'],
  176. ['kuo', 'k\'uo'],
  177. ['la', 'la'],
  178. ['lai', 'lai'],
  179. ['lan', 'lan'],
  180. ['lang', 'lang'],
  181. ['lao', 'lao'],
  182. ['le', 'le'],
  183. ['lei', 'lei'],
  184. ['leng', 'leng'],
  185. ['li', 'li'],
  186. ['liang', 'liang'],
  187. ['liao', 'liao'],
  188. ['lie', 'lieh'],
  189. ['lian', 'lien'],
  190. ['lin', 'lin'],
  191. ['ling', 'ling'],
  192. ['liu', 'liu'],
  193. ['luo', 'lo'],
  194. ['lou', 'lou'],
  195. ['lu', 'lu'],
  196. ['lü', 'lü'],
  197. ['luan', 'luan'],
  198. ['luan', 'lüan'],
  199. ['lue', 'lüeh'],
  200. ['lun', 'lun'],
  201. ['long', 'lung'],
  202. ['ma', 'ma'],
  203. ['mai', 'mai'],
  204. ['man', 'man'],
  205. ['mang', 'mang'],
  206. ['mao', 'mao'],
  207. ['mei', 'mei'],
  208. ['men', 'men'],
  209. ['meng', 'meng'],
  210. ['mi', 'mi'],
  211. ['miao', 'miao'],
  212. ['mie', 'mieh'],
  213. ['mian', 'mien'],
  214. ['min', 'min'],
  215. ['ming', 'ming'],
  216. ['miu', 'miu'],
  217. ['mo', 'mo'],
  218. ['mou', 'mou'],
  219. ['mu', 'mu'],
  220. ['na', 'na'],
  221. ['nai', 'nai'],
  222. ['nan', 'nan'],
  223. ['nang', 'nang'],
  224. ['nao', 'nao'],
  225. ['nei', 'nei'],
  226. ['nen', 'nen'],
  227. ['neng', 'neng'],
  228. ['ni', 'ni'],
  229. ['niang', 'niang'],
  230. ['niao', 'niao'],
  231. ['nie', 'nieh'],
  232. ['nian', 'nien'],
  233. ['nin', 'nin'],
  234. ['ning', 'ning'],
  235. ['niu', 'niu'],
  236. ['nuo', 'no'],
  237. ['nou', 'nou'],
  238. ['nu', 'nu'],
  239. ['nü', 'nü'],
  240. ['nuan', 'nuan'],
  241. ['nue', 'nüeh'],
  242. ['nong', 'nung'],
  243. ['e', 'o'],
  244. ['ou', 'ou'],
  245. ['ba', 'pa'],
  246. ['pa', 'p\'a'],
  247. ['bai', 'pai'],
  248. ['pai', 'p\'ai'],
  249. ['ban', 'pan'],
  250. ['pan', 'p\'an'],
  251. ['bang', 'pang'],
  252. ['pang', 'p\'ang'],
  253. ['bao', 'pao'],
  254. ['pao', 'p\'ao'],
  255. ['bei', 'pei'],
  256. ['pei', 'p\'ei'],
  257. ['ben', 'pen'],
  258. ['pen', 'p\'en'],
  259. ['beng', 'peng'],
  260. ['peng', 'p\'eng'],
  261. ['bi', 'pi'],
  262. ['pi', 'p\'i'],
  263. ['biao', 'piao'],
  264. ['piao', 'p\'iao'],
  265. ['bie', 'pieh'],
  266. ['pie', 'p\'ieh'],
  267. ['bian', 'pien'],
  268. ['pian', 'p\'ien'],
  269. ['bin', 'pin'],
  270. ['pin', 'p\'in'],
  271. ['bing', 'ping'],
  272. ['ping', 'p\'ing'],
  273. ['bo', 'po'],
  274. ['po', 'p\'o'],
  275. ['pou', 'p\'ou'],
  276. ['bu', 'pu'],
  277. ['pu', 'p\'u'],
  278. ['sa', 'sa'],
  279. ['sai', 'sai'],
  280. ['san', 'san'],
  281. ['sang', 'sang'],
  282. ['sao', 'sao'],
  283. ['se', 'se'],
  284. ['sen', 'sen'],
  285. ['seng', 'seng'],
  286. ['sha', 'sha'],
  287. ['shai', 'shai'],
  288. ['shan', 'shan'],
  289. ['shang', 'shang'],
  290. ['shao', 'shao'],
  291. ['she', 'she'],
  292. ['shen', 'shen'],
  293. ['sheng', 'sheng'],
  294. ['shi', 'shih'],
  295. ['shou', 'shou'],
  296. ['shu', 'shu'],
  297. ['shua', 'shua'],
  298. ['shuai', 'shuai'],
  299. ['shuan', 'shuan'],
  300. ['shuang', 'shuang'],
  301. ['shui', 'shui'],
  302. ['shun', 'shun'],
  303. ['shuo', 'shuo'],
  304. ['suo', 'so'],
  305. ['sou', 'sou'],
  306. ['si', 'ssu'],
  307. ['su', 'su'],
  308. ['suan', 'suan'],
  309. ['sui', 'sui'],
  310. ['sun', 'sun'],
  311. ['song', 'sung'],
  312. ['da', 'ta'],
  313. ['ta', 't\'a'],
  314. ['dai', 'tai'],
  315. ['tai', 't\'ai'],
  316. ['dan', 'tan'],
  317. ['tan', 't\'an'],
  318. ['dang', 'tang'],
  319. ['tang', 't\'ang'],
  320. ['dao', 'tao'],
  321. ['tao', 't\'ao'],
  322. ['de', 'te'],
  323. ['te', 't\'e'],
  324. ['deng', 'teng'],
  325. ['teng', 't\'eng'],
  326. ['di', 'ti'],
  327. ['ti', 't\'i'],
  328. ['diao', 'tiao'],
  329. ['tiao', 't\'iao'],
  330. ['die', 'tieh'],
  331. ['tie', 't\'oeh'],
  332. ['dian', 'tien'],
  333. ['tian', 't\'ien'],
  334. ['ding', 'ting'],
  335. ['ting', 't\'ing'],
  336. ['diu', 'tiu'],
  337. ['duo', 'to'],
  338. ['tuo', 't\'o'],
  339. ['dou', 'tou'],
  340. ['tou', 't\'ou'],
  341. ['du', 'tu'],
  342. ['tu', 't\'u'],
  343. ['duan', 'tuan'],
  344. ['tuan', 't\'uan'],
  345. ['dui', 'tui'],
  346. ['tui', 't\'ui'],
  347. ['dun', 'tun'],
  348. ['tun', 't\'un'],
  349. ['dong', 'tung'],
  350. ['tong', 't\'ung'],
  351. ['za', 'tsa'],
  352. ['ca', 'ts\'a'],
  353. ['zai', 'tsai'],
  354. ['cai', 'ts\'ai'],
  355. ['zan', 'tsan'],
  356. ['can', 'ts\'an'],
  357. ['zang', 'tsang'],
  358. ['cang', 'ts\'ang'],
  359. ['zao', 'tsao'],
  360. ['cao', 'ts\'ao'],
  361. ['ze', 'tse'],
  362. ['ce', 'ts\'e'],
  363. ['zei', 'tsei'],
  364. ['zen', 'tsen'],
  365. ['cen', 'ts\'en'],
  366. ['zeng', 'tseng'],
  367. ['ceng', 'ts\'eng'],
  368. ['zuo', 'tso'],
  369. ['cuo', 'ts\'o'],
  370. ['zou', 'tsou'],
  371. ['cou', 'ts\'ou'],
  372. ['zu', 'tsu'],
  373. ['cu', 'ts\'u'],
  374. ['zuan', 'tsuan'],
  375. ['cuan', 'ts\'uan'],
  376. ['zui', 'tsui'],
  377. ['cui', 'ts\'ui'],
  378. ['zun', 'tsun'],
  379. ['cun', 'ts\'un'],
  380. ['zong', 'tsung'],
  381. ['cong', 'ts\'ung'],
  382. ['zi', 'tzu'],
  383. ['ci', 'tz\'u'],
  384. ['wa', 'wa'],
  385. ['wai', 'wai'],
  386. ['wan', 'wan'],
  387. ['wang', 'wang'],
  388. ['wei', 'wei'],
  389. ['wen', 'wen'],
  390. ['weng', 'weng'],
  391. ['wo', 'wo'],
  392. ['wu', 'wu'],
  393. ['ya', 'ya'],
  394. ['yai', 'yai'],
  395. ['yang', 'yang'],
  396. ['yao', 'yao'],
  397. ['ye', 'yeh'],
  398. ['yan', 'yen'],
  399. ['yin', 'yin'],
  400. ['ying', 'ying'],
  401. ['yo', 'yo'],
  402. ['you', 'yu'],
  403. ['yu', 'yü'],
  404. ['yuan', 'yüan'],
  405. ['yue', 'yüeh'],
  406. ['yun', 'yün'],
  407. ['yong', 'yung'],
  408. ['chua', 'ch`ua'],
  409. ['dei', 'tei'],
  410. ['den', 'ten'],
  411. ['diang', 'tiang'],
  412. ['ei', 'ei'],
  413. ['eng', 'eng'],
  414. ['gei', 'kei'],
  415. ['lia', 'lia'],
  416. ['lo', 'lo'],
  417. ['lüan', 'lüan'],
  418. ['lvan', 'lüan'],
  419. ['lüe', 'lüeh'],
  420. ['lve', 'lüeh'],
  421. ['lün', 'lün'],
  422. ['lvn', 'lün'],
  423. ['me', 'me'],
  424. ['ne', 'ne'],
  425. ['nia', 'nia'],
  426. ['nun', 'nun'],
  427. ['nüe', 'nüeh'],
  428. ['nve', 'nüeh'],
  429. ['o', 'o'],
  430. ['sei', 'sei'],
  431. ['shei', 'shei'],
  432. ['shong', 'shung'],
  433. ['zhei', 'chei'],
  434. ]
  435. _convert_table.sort(key=lambda x: len(x[0]), reverse=True)
  436. # https://www.mysmth.net/nForum/#!article/Linguistics/4991
  437. _initial_table = [
  438. ['b', 'p'],
  439. ['p', 'p\''],
  440. ['m', 'm'],
  441. ['f', 'f'],
  442. ['d', 't'],
  443. ['t', 't\''],
  444. ['n', 'n'],
  445. ['l', 'l'],
  446. ['g', 'g'],
  447. ['k', 'k\''],
  448. ['h', 'h'],
  449. ['j', 'ch'],
  450. ['q', 'ch\''],
  451. ['x', 'hs'],
  452. ['zh', 'ch'],
  453. ['ch', 'ch\''],
  454. ['sh', 'sh'],
  455. ['r', 'j'],
  456. ['z', 'ts'],
  457. ['c', 'ts\''],
  458. ['s', 's'],
  459. ]
  460. _initial_table.sort(key=lambda x: len(x[0]), reverse=True)
  461. _tone_table = [
  462. ['i', 'i'],
  463. ['u', 'u'],
  464. ['ü', 'ü'],
  465. ['v', 'ü'],
  466. ['a', 'a'],
  467. ['ia', 'ia'],
  468. ['ua', 'ua'],
  469. ['o', 'o'],
  470. ['uo', 'o'],
  471. ['e', 'e'],
  472. ['ie', 'ieh'],
  473. ['üe', 'üeh'],
  474. ['ve', 'üeh'],
  475. ['ai', 'ei'],
  476. ['uei', 'ui'],
  477. ['ao', 'ao'],
  478. ['iao', 'iao'],
  479. ['ou', 'ou'],
  480. ['iou', 'iu'],
  481. ['an', 'an'],
  482. ['ian', 'ien'],
  483. ['uan', 'uan'],
  484. ['üan', 'üan'],
  485. ['van', 'üan'],
  486. ['en', 'en'],
  487. ['in', 'in'],
  488. ['uen', 'un'],
  489. ['ün', 'ün'],
  490. ['vn', 'ün'],
  491. ['ang', 'ang'],
  492. ['iang', 'iang'],
  493. ['uang', 'uang'],
  494. ['eng', 'eng'],
  495. ['ing', 'ing'],
  496. ['ueng', 'ueng'],
  497. ['ong', 'ung'],
  498. ['iong', 'iung'],
  499. ['ê', 'eh'],
  500. ['er', 'erh'],
  501. ]
  502. _tone_table.sort(key=lambda x: len(x[0]), reverse=True)
  503. _except_table = [
  504. ['zhi', 'chih'],
  505. ['chi', 'ch\'ih'],
  506. ['shi', 'shih'],
  507. ['ri', 'jih'],
  508. ['zi', 'tzu'],
  509. ['ci', 'tz\'u'],
  510. ['si', 'ssu'],
  511. ['guo', 'guo'],
  512. ['kuo', 'k\'uo'],
  513. ['huo', 'huo'],
  514. ['luo', 'luo'],
  515. ['jue', 'chüeh'],
  516. ['que', 'ch\'üeh'],
  517. ['xue', 'hsüeh'],
  518. ]
  519. _except_table.sort(key=lambda x: len(x[0]), reverse=True)
  520. def to_wade_glides(pinyin, **kwargs):
  521. pinyin = replace_symbol_to_no_symbol(pinyin).replace('v', 'ü')
  522. whole_converted = _convert_whole(pinyin, _except_table)
  523. if whole_converted != pinyin:
  524. return _fixed_result(whole_converted)
  525. whole_converted = _convert_whole(pinyin, _convert_table)
  526. if whole_converted != pinyin:
  527. return _fixed_result(whole_converted)
  528. initials = get_initials(pinyin, strict=False)
  529. tones = pinyin[len(initials):]
  530. initials = _convert_whole(initials, _initial_table)
  531. tones = _convert_whole(tones, _tone_table)
  532. return _fixed_result('{}{}'.format(initials, tones))
  533. def _fixed_result(pinyin):
  534. return pinyin.replace('ü', 'v')
  535. def _convert_whole(chars, table):
  536. for pair in table:
  537. f, r = pair
  538. if f == chars:
  539. return r
  540. return chars
  541. register(Style.WADEGILES, func=to_wade_glides)