toneconvert.py 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. from __future__ import unicode_literals
  4. from argparse import ArgumentParser
  5. from functools import partial
  6. import re
  7. import sys
  8. from pypinyin.compat import PY2
  9. from pypinyin.style._constants import (
  10. PHONETIC_SYMBOL_DICT, PHONETIC_SYMBOL_DICT_KEY_LENGTH_NOT_ONE
  11. )
  12. from pypinyin.contrib.tone_convert import (
  13. to_normal,
  14. to_tone,
  15. to_tone2,
  16. to_tone3,
  17. # to_initials,
  18. # to_finals,
  19. # to_finals_tone,
  20. # to_finals_tone2,
  21. # to_finals_tone3,
  22. )
  23. re_pinyin = re.compile(
  24. r'(?m)(^|\s|,)([1-5a-zêü{0}]+)'.format(
  25. re.escape(
  26. ''.join(x for x in PHONETIC_SYMBOL_DICT if len(x) == 1)
  27. )
  28. )
  29. )
  30. ACTIONS = {
  31. 'to_normal': to_normal,
  32. 'to_tone': to_tone,
  33. 'to_tone2': to_tone2,
  34. 'to_tone3': to_tone3,
  35. # 'to_initials': to_initials,
  36. # 'to_finals': to_finals,
  37. # 'to_finals_tone': to_finals_tone,
  38. # 'to_finals_tone2': to_finals_tone2,
  39. # 'to_finals_tone3': to_finals_tone3,
  40. }
  41. def re_sub(action, match_obj):
  42. func = ACTIONS[action]
  43. converted = func(match_obj.group(2))
  44. return '{0}{1}'.format(match_obj.group(1), converted)
  45. def prepare(input):
  46. for k, v in PHONETIC_SYMBOL_DICT_KEY_LENGTH_NOT_ONE.items():
  47. if k in input:
  48. input = input.replace(k, v)
  49. return input
  50. def convert(action, args):
  51. inputs = args.inputs
  52. for item in inputs:
  53. item = prepare(item)
  54. result = re_pinyin.sub(lambda m: re_sub(action, m), item)
  55. print(result)
  56. def get_parser():
  57. parser = ArgumentParser()
  58. if PY2 or sys.version_info < (3, 7):
  59. subparser = parser.add_subparsers()
  60. else:
  61. subparser = parser.add_subparsers(required=True, title='subcommands')
  62. for key in ACTIONS.keys():
  63. name = key.replace('_', '-')
  64. func = partial(convert, key)
  65. p = subparser.add_parser(
  66. name,
  67. help='call pypinyin.contrib.tone_convert.{}() with inputs'.format(key))
  68. p.set_defaults(func=func)
  69. p.add_argument('inputs', nargs='+')
  70. return parser
  71. def main(argv):
  72. argv = argv[:]
  73. if not sys.stdin.isatty():
  74. pipe_data = sys.stdin.read().strip()
  75. else:
  76. pipe_data = ''
  77. if pipe_data:
  78. argv.append(pipe_data)
  79. parser = get_parser()
  80. args = parser.parse_args(argv)
  81. args.func(args)
  82. if __name__ == '__main__':
  83. main(sys.argv[1:])