Skip to content

Commit efebac4

Browse files
committed
Improve Strategery::new API for more clearly.
1 parent e3b8d30 commit efebac4

File tree

2 files changed

+41
-24
lines changed

2 files changed

+41
-24
lines changed

autocorrect/src/lib.rs

+12-10
Original file line numberDiff line numberDiff line change
@@ -112,24 +112,25 @@ lazy_static! {
112112
// ()【】「」《》
113113
static ref LEFT_QUOTE_RE: Regex = regexp!("{}", r" ([(【「《])");
114114
static ref RIGHT_QUOTE_RE: Regex = regexp!("{}", r"([)】」》]) ");
115+
115116
// Strategies all rules
116117
static ref STRATEGIES: Vec<Strategery> = vec![
117118
// EnglishLetter, Number
118-
// But not start with %, $, \ for avoid change %s, %d, $1, $2, \d, \r, \p ... in source code
119-
Strategery::new(r"\p{CJK}[^%\$\\]", r"[a-zA-Z0-9]", true, false),
120-
Strategery::new(r"[^%\$\\][a-zA-Z0-9]", r"\p{CJK}", true, false),
119+
// But not start with %, $, \ for avoid change %s, %d, $1, $2, \1, \2, \d, \r, \p ... in source code
120+
Strategery::new(r"\p{CJK}[^%\$\\]", r"[a-zA-Z0-9]"),
121+
Strategery::new(r"[a-zA-Z0-9]", r"\p{CJK}"),
121122
// 10%中文
122-
Strategery::new(r"[0-9][%]", r"\p{CJK}", true, false),
123+
Strategery::new(r"[0-9][%]", r"\p{CJK}"),
123124
// SpecialSymbol
124-
Strategery::new(r"\p{CJK}", r"[\|+]", true, true),
125+
Strategery::new(r"\p{CJK}", r"[\|+]").with_reverse(),
125126
// @ after CJK, not not before, 你好 @某某
126-
Strategery::new(r"\p{CJK}", r"[@]", true, false),
127-
Strategery::new(r"\p{CJK}", r"[\[\(]", true, false),
128-
Strategery::new(r"[\]\)!]", r"\p{CJK}", true, false),
127+
Strategery::new(r"\p{CJK}", r"[@]"),
128+
Strategery::new(r"\p{CJK}", r"[\[\(]"),
129+
Strategery::new(r"[\]\)!]", r"\p{CJK}"),
129130

130131
// FullwidthPunctuation remove space case, Fullwidth can safe to remove spaces
131-
Strategery::new(r"[\w\p{CJK}]", r"[,。!?:;)」》】”’]", false, true),
132-
Strategery::new(r"[‘“【「《(]", r"[\w\p{CJK}]", false, true),
132+
Strategery::new(r"[\w\p{CJK}]", r"[,。!?:;)」》】”’]").with_remove_space().with_reverse(),
133+
Strategery::new(r"[‘“【「《(]", r"[\w\p{CJK}]").with_remove_space().with_reverse(),
133134
];
134135
}
135136

@@ -283,6 +284,7 @@ mod tests {
283284
#[test]
284285
fn it_format_for_programming() {
285286
let cases = map![
287+
"A开头的case测试" => "A 开头的 case 测试",
286288
"内容带有\n不会处理" => "内容带有\n不会处理",
287289
"内容带有%s或%d或%v特殊字符,或者%S或%D或%V这些特殊format字符" => "内容带有%s或%d或%v特殊字符,或者%S或%D或%V这些特殊 format 字符",
288290
"内容带有$1或$2或$3特殊字符" => "内容带有$1或$2或$3特殊字符"

autocorrect/src/strategery.rs

+29-14
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
// autocorrect: false
2+
enum SpaceMode {
3+
Add,
4+
Remove,
5+
}
6+
27
pub struct Strategery {
3-
space: bool,
8+
space_mode: SpaceMode,
49
reverse: bool,
510
add_space_re: regex::Regex,
611
add_space_reverse_re: regex::Regex,
@@ -10,36 +15,46 @@ pub struct Strategery {
1015

1116
impl Strategery {
1217
/// Create a new strategery object.
13-
/// ## Arguments
14-
///
15-
/// - `space` - `true` - add space / `false` - remove space
16-
/// - `reverse` - false just format `(one + other)`, true will format `(other + one)` and `(other + one)`.
17-
pub fn new(one: &'static str, other: &'static str, space: bool, reverse: bool) -> Self {
18+
pub fn new(one: &'static str, other: &'static str) -> Self {
1819
return Strategery {
19-
space,
20-
reverse,
20+
space_mode: SpaceMode::Add,
21+
reverse: false,
2122
add_space_re: regexp!("({})({})", one, other),
2223
add_space_reverse_re: regexp!("({})({})", other, one),
2324
remove_space_re: regexp!("({})[ ]({})", one, other),
2425
remove_space_reverse_re: regexp!("({})[ ]({})", other, one),
2526
};
2627
}
2728

29+
// Set Strategery for remove space.
30+
pub fn with_remove_space(mut self) -> Self {
31+
self.space_mode = SpaceMode::Remove;
32+
return self;
33+
}
34+
35+
// Set Strategery for format by reverse again.
36+
pub fn with_reverse(mut self) -> Self {
37+
self.reverse = true;
38+
return self;
39+
}
40+
2841
pub fn format(&self, text: &str) -> String {
29-
if self.space {
30-
self.add_space(text)
31-
} else {
32-
self.remove_space(text)
42+
match self.space_mode {
43+
SpaceMode::Add => self.add_space(text),
44+
SpaceMode::Remove => self.remove_space(text),
3345
}
3446
}
3547

3648
fn add_space(&self, text: &str) -> String {
3749
let mut out = String::from(text);
3850

39-
out = (&self.add_space_re.replace_all(&out, "$1 $2")).to_string();
51+
out = self.add_space_re.replace_all(&out, "$1 $2").to_string();
4052

4153
if self.reverse {
42-
out = (&self.add_space_reverse_re.replace_all(&out, "$1 $2")).to_string();
54+
out = self
55+
.add_space_reverse_re
56+
.replace_all(&out, "$1 $2")
57+
.to_string();
4358
}
4459

4560
out

0 commit comments

Comments
 (0)