braille_mainland.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. # -*- coding: utf-8 -*-
  2. """中国内地盲文相关的几个拼音风格实现:
  3. Style.BRAILLE_MAINLAND
  4. Style.BRAILLE_MAINLAND_TONE
  5. https://en.wikipedia.org/wiki/Mainland_Chinese_Braille
  6. """
  7. from __future__ import unicode_literals
  8. import re
  9. from pypinyin.constants import Style
  10. from pypinyin.style import register
  11. from pypinyin.style._constants import RE_TONE3
  12. from pypinyin.style._utils import (
  13. replace_symbol_to_number, replace_symbol_to_no_symbol)
  14. BRAILLE_MAINLAND_REPLACE = (
  15. (re.compile(r'iu'), 'iou'),
  16. (re.compile(r'ui'), 'uei'),
  17. (re.compile(r'un'), 'uen'),
  18. (re.compile(r'ong'), 'ung'),
  19. (re.compile(r'^yi?'), 'i'),
  20. (re.compile(r'^wu?'), 'u'),
  21. (re.compile(r'y'), 'i'),
  22. (re.compile(r'w'), 'u'),
  23. (re.compile(r'iu'), 'v'),
  24. (re.compile(r'^([jqx])u'), '\\1v'),
  25. (re.compile(r'([iuv])n'), '\\1en'),
  26. (re.compile(r'^zhi?'), 'Z'),
  27. (re.compile(r'^chi?'), 'C'),
  28. (re.compile(r'^shi?'), 'S'),
  29. (re.compile(r'^([zcsr])i'), '\\1'),
  30. (re.compile(r'iang'), '⠭'),
  31. (re.compile(r'uang'), '⠶'),
  32. (re.compile(r'ueng'), '⠲'),
  33. (re.compile(r'iong'), '⠹'),
  34. (re.compile(r'ang'), '⠦'),
  35. (re.compile(r'eng'), '⠼'),
  36. (re.compile(r'uai'), '⠽'),
  37. (re.compile(r'iao'), '⠜'),
  38. (re.compile(r'iou'), '⠳'),
  39. (re.compile(r'ian'), '⠩'),
  40. (re.compile(r'uan'), '⠻'),
  41. (re.compile(r'van'), '⠯'),
  42. (re.compile(r'uen'), '⠒'),
  43. (re.compile(r'ing'), '⠡'),
  44. (re.compile(r'ong'), '⠲'),
  45. (re.compile(r'er'), '⠗'),
  46. (re.compile(r'ai'), '⠪'),
  47. (re.compile(r'ei'), '⠮'),
  48. (re.compile(r'ao'), '⠖'),
  49. (re.compile(r'ou'), '⠷'),
  50. (re.compile(r'an'), '⠧'),
  51. (re.compile(r'en'), '⠴'),
  52. (re.compile(r'ia'), '⠫'),
  53. (re.compile(r'ua'), '⠿'),
  54. (re.compile(r'ie'), '⠑'),
  55. (re.compile(r'uo'), '⠕'),
  56. (re.compile(r've'), '⠾'),
  57. (re.compile(r'ui'), '⠺'),
  58. (re.compile(r'in'), '⠣'),
  59. (re.compile(r'vn'), '⠸'),
  60. )
  61. BRAILLE_MAINLAND_TABLE = dict(zip(
  62. 'bpmfdtnlgkhjqxZCSrzcsiuvaoe1234',
  63. '⠃⠏⠍⠋⠙⠞⠝⠇⠛⠅⠓⠛⠅⠓⠌⠟⠱⠚⠵⠉⠎⠊⠥⠬⠔⠢⠢⠁⠂⠄⠆'
  64. ))
  65. class BrailleMainlandConverter(object):
  66. def to_braille_mainland_tone(self, pinyin, **kwargs):
  67. # 用数字表示声调
  68. pinyin = replace_symbol_to_number(pinyin)
  69. # 将声调数字移动到最后
  70. pinyin = RE_TONE3.sub(r'\1\3\2', pinyin)
  71. for find_re, replace in BRAILLE_MAINLAND_REPLACE:
  72. pinyin = find_re.sub(replace, pinyin)
  73. pinyin = ''.join(BRAILLE_MAINLAND_TABLE.get(x, x) for x in pinyin)
  74. return pinyin
  75. def to_braille_mainland(self, pinyin, **kwargs):
  76. pinyin = replace_symbol_to_no_symbol(pinyin)
  77. for find_re, replace in BRAILLE_MAINLAND_REPLACE:
  78. pinyin = find_re.sub(replace, pinyin)
  79. pinyin = ''.join(BRAILLE_MAINLAND_TABLE.get(x, x) for x in pinyin)
  80. return pinyin
  81. converter = BrailleMainlandConverter()
  82. register(Style.BRAILLE_MAINLAND_TONE, func=converter.to_braille_mainland_tone)
  83. register(Style.BRAILLE_MAINLAND, func=converter.to_braille_mainland)