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 {
Normal,
Tone,
Tone2,
Initials,
FirstLetter,
Finals,
FinalsTone,
FinalsTone2,
}
#[deprecated]
#[derive(Debug, PartialEq, Eq, Hash)]
pub struct Args {
pub style: Style,
pub heteronym: bool,
}
impl Args {
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(),
}
}
#[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()
}
}
#[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()
}