• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

mozillazg / python-pinyin / 2490

10 Mar 2024 03:15AM UTC coverage: 98.59% (-0.05%) from 98.64%
2490

push

circleci

mozillazg
增加新的命令行工具: python -m pypinyin.tools.toneconvert

提供一个用于转换拼音风格的命令行辅助工具

$ python -m pypinyin.tools.toneconvert to-tone 'zhong4 xin1'
zhòng xīn

362 of 382 branches covered (94.76%)

36 of 37 new or added lines in 1 file covered. (97.3%)

979 of 993 relevant lines covered (98.59%)

0.99 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

97.3
/pypinyin/tools/toneconvert.py
1
#!/usr/bin/env python
2
# -*- coding: utf-8 -*-
3

4
from __future__ import unicode_literals
1✔
5
from argparse import ArgumentParser
1✔
6
from functools import partial
1✔
7
import re
1✔
8
import sys
1✔
9

10
from pypinyin.compat import PY2
1✔
11
from pypinyin.style._constants import (
1✔
12
    PHONETIC_SYMBOL_DICT, PHONETIC_SYMBOL_DICT_KEY_LENGTH_NOT_ONE
13
)
14
from pypinyin.contrib.tone_convert import (
1✔
15
    to_normal,
16
    to_tone,
17
    to_tone2,
18
    to_tone3,
19
    # to_initials,
20
    # to_finals,
21
    # to_finals_tone,
22
    # to_finals_tone2,
23
    # to_finals_tone3,
24
)
25

26
re_pinyin = re.compile(
1✔
27
    r'(?m)(^|\s|,)([1-5a-zêü{0}]+)'.format(
28
        re.escape(
29
            ''.join(x for x in PHONETIC_SYMBOL_DICT if len(x) == 1)
30
        )
31
    )
32
)
33
ACTIONS = {
1✔
34
    'to_normal': to_normal,
35
    'to_tone': to_tone,
36
    'to_tone2': to_tone2,
37
    'to_tone3': to_tone3,
38
    # 'to_initials': to_initials,
39
    # 'to_finals': to_finals,
40
    # 'to_finals_tone': to_finals_tone,
41
    # 'to_finals_tone2': to_finals_tone2,
42
    # 'to_finals_tone3': to_finals_tone3,
43
}
44

45

46
def re_sub(action, match_obj):
1✔
47
    func = ACTIONS[action]
1✔
48
    converted = func(match_obj.group(2))
1✔
49
    return '{0}{1}'.format(match_obj.group(1), converted)
1✔
50

51

52
def prepare(input):
1✔
53
    for k, v in PHONETIC_SYMBOL_DICT_KEY_LENGTH_NOT_ONE.items():
1✔
54
        if k in input:
1✔
55
            input = input.replace(k, v)
1✔
56
    return input
1✔
57

58

59
def convert(action, args):
1✔
60
    inputs = args.inputs
1✔
61
    for item in inputs:
1✔
62
        item = prepare(item)
1✔
63
        result = re_pinyin.sub(lambda m: re_sub(action, m), item)
1✔
64
        print(result)
1✔
65

66

67
def get_parser():
1✔
68
    parser = ArgumentParser()
1✔
69

70
    if PY2 or sys.version_info < (3, 7):
1!
71
        subparser = parser.add_subparsers()
1✔
72
    else:
NEW
73
        subparser = parser.add_subparsers(required=True, title='subcommands')
×
74

75
    for key in ACTIONS.keys():
1✔
76
        name = key.replace('_', '-')
1✔
77
        func = partial(convert, key)
1✔
78
        p = subparser.add_parser(
1✔
79
            name,
80
            help='call pypinyin.contrib.tone_convert.{}() with inputs'.format(key))
81
        p.set_defaults(func=func)
1✔
82
        p.add_argument('inputs', nargs='+')
1✔
83

84
    return parser
1✔
85

86

87
def main(argv):
88
    argv = argv[:]
89

90
    if not sys.stdin.isatty():
91
        pipe_data = sys.stdin.read().strip()
92
    else:
93
        pipe_data = ''
94
    if pipe_data:
95
        argv.append(pipe_data)
96

97
    parser = get_parser()
98
    args = parser.parse_args(argv)
99
    args.func(args)
100

101

102
if __name__ == '__main__':
103
    main(sys.argv[1:])
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc