1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#![allow(deprecated)]

use crate::{Pinyin, ToPinyin, ToPinyinMulti};
use std::collections::HashSet;
use std::convert::identity;

/// 拼音风格
#[deprecated = "请使用 `Pinyin` 的方法代替"]
#[derive(Debug, PartialEq, Eq, Hash)]
pub enum Style {
    /// 普通风格,不带声调(默认风格)。如: `pin yin`
    Normal,
    /// 声调风格1,拼音声调在韵母第一个字母上。如: `pīn yīn`
    Tone,
    /// 声调风格2,即拼音声调在各个拼音之后,用数字 [0-4] 进行表示。如: `pi1n yi1n`
    Tone2,
    /// 声母风格,只返回各个拼音的声母部分。如: 中国 的拼音 `zh g`
    Initials,
    /// 首字母风格,只返回拼音的首字母部分。如: `p y`
    FirstLetter,
    /// 韵母风格1,只返回各个拼音的韵母部分,不带声调。如: `ong uo`
    Finals,
    /// 韵母风格2,带声调,声调在韵母第一个字母上。如: `ōng uó`
    FinalsTone,
    /// 韵母风格2,带声调,声调在各个拼音之后,用数字 [0-4] 进行表示。如: `o1ng uo2`
    FinalsTone2,
}

/// 参数
#[deprecated]
#[derive(Debug, PartialEq, Eq, Hash)]
pub struct Args {
    /// 拼音风格
    pub style: Style,
    /// 是否启用多音字模式
    pub heteronym: bool,
}

impl Args {
    /// 返回一个默认参数
    ///
    /// ```ignore
    /// Args {
    ///    style: Style::Normal,
    ///    heteronym: false,
    /// }
    /// ```
    pub fn new() -> Args {
        Args {
            style: Style::Normal,
            heteronym: false,
        }
    }
}

impl Default for Args {
    fn default() -> Self {
        Self::new()
    }
}

fn apply_style(py: Pinyin, style: &Style) -> &'static str {
    match style {
        Style::Normal => py.plain(),
        Style::Tone => py.with_tone(),
        Style::Tone2 => py.with_tone_num(),
        Style::Initials => py.initials(),
        Style::FirstLetter => py.first_letter(),
        Style::Finals => py.finals_plain(),
        Style::FinalsTone => py.finals_with_tone(),
        Style::FinalsTone2 => py.finals_with_tone_num(),
    }
}

/// 汉字转拼音
///
/// ```
/// let hans = "中国人";
/// let args = pinyin::Args::new();
///
/// // 默认输出 [["zhong"] ["guo"] ["ren"]]
/// println!("{:?}",  pinyin::pinyin(hans, &args));
/// ```
#[deprecated = "请使用 `ToPinyin` 或 `ToPinyinMulti` 代替"]
pub fn pinyin(s: &str, a: &Args) -> Vec<Vec<String>> {
    if a.heteronym {
        s.to_pinyin_multi()
            .map(|multi| match multi {
                Some(multi) => {
                    let mut set = HashSet::new();
                    multi
                        .into_iter()
                        .map(|pinyin| apply_style(pinyin, &a.style))
                        .filter(|s| set.insert(*s))
                        .map(str::to_string)
                        .collect()
                }
                None => vec![],
            })
            .collect()
    } else {
        s.to_pinyin()
            .map(|pinyin| match pinyin {
                Some(pinyin) => vec![apply_style(pinyin, &a.style).to_string()],
                None => vec![],
            })
            .collect()
    }
}

/// 汉字转拼音, 与 ``pinyin`` 的区别是返回值不同,每个汉字只取一个音
///
/// ```
/// let hans = "中国人";
/// let args = pinyin::Args::new();
///
/// // 默认输出 ["zhong", "guo", "ren"]
/// println!("{:?}",  pinyin::lazy_pinyin(hans, &args));
/// ```
#[deprecated = "请使用 `ToPinyin` 代替"]
pub fn lazy_pinyin(s: &str, a: &Args) -> Vec<String> {
    s.to_pinyin()
        .filter_map(identity)
        .map(|pinyin| apply_style(pinyin, &a.style).to_string())
        .collect()
}