Skip to content

Commit 38659ec

Browse files
authored
Unicode comment align (#5505)
* Fix comment alignment with unicode Also added tests for this behaviour * Simplify tests * Improve tests
1 parent 949da52 commit 38659ec

File tree

3 files changed

+288
-8
lines changed

3 files changed

+288
-8
lines changed

Diff for: src/lists.rs

+8-8
Original file line numberDiff line numberDiff line change
@@ -297,9 +297,9 @@ where
297297
} else {
298298
inner_item.as_ref()
299299
};
300-
let mut item_last_line_width = item_last_line.len() + item_sep_len;
300+
let mut item_last_line_width = unicode_str_width(item_last_line) + item_sep_len;
301301
if item_last_line.starts_with(&**indent_str) {
302-
item_last_line_width -= indent_str.len();
302+
item_last_line_width -= unicode_str_width(indent_str);
303303
}
304304

305305
if !item.is_substantial() {
@@ -449,7 +449,7 @@ where
449449
} else if starts_with_newline(comment) {
450450
false
451451
} else {
452-
comment.trim().contains('\n') || comment.trim().len() > width
452+
comment.trim().contains('\n') || unicode_str_width(comment.trim()) > width
453453
};
454454

455455
rewrite_comment(
@@ -465,7 +465,7 @@ where
465465
if !starts_with_newline(comment) {
466466
if formatting.align_comments {
467467
let mut comment_alignment =
468-
post_comment_alignment(item_max_width, inner_item.len());
468+
post_comment_alignment(item_max_width, unicode_str_width(inner_item));
469469
if first_line_width(&formatted_comment)
470470
+ last_line_width(&result)
471471
+ comment_alignment
@@ -475,7 +475,7 @@ where
475475
item_max_width = None;
476476
formatted_comment = rewrite_post_comment(&mut item_max_width)?;
477477
comment_alignment =
478-
post_comment_alignment(item_max_width, inner_item.len());
478+
post_comment_alignment(item_max_width, unicode_str_width(inner_item));
479479
}
480480
for _ in 0..=comment_alignment {
481481
result.push(' ');
@@ -533,7 +533,7 @@ where
533533
let mut first = true;
534534
for item in items.clone().into_iter().skip(i) {
535535
let item = item.as_ref();
536-
let inner_item_width = item.inner_as_ref().len();
536+
let inner_item_width = unicode_str_width(item.inner_as_ref());
537537
if !first
538538
&& (item.is_different_group()
539539
|| item.post_comment.is_none()
@@ -552,8 +552,8 @@ where
552552
max_width
553553
}
554554

555-
fn post_comment_alignment(item_max_width: Option<usize>, inner_item_len: usize) -> usize {
556-
item_max_width.unwrap_or(0).saturating_sub(inner_item_len)
555+
fn post_comment_alignment(item_max_width: Option<usize>, inner_item_width: usize) -> usize {
556+
item_max_width.unwrap_or(0).saturating_sub(inner_item_width)
557557
}
558558

559559
pub(crate) struct ListItems<'a, I, F1, F2, F3>

Diff for: tests/source/comments_unicode.rs

+140
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
impl Default for WhitespaceCharacters {
2+
fn default() -> Self {
3+
Self {
4+
space: '·', // U+00B7
5+
nbsp: '⍽', // U+237D
6+
tab: '→', // U+2192
7+
newline: '⏎', // U+23CE
8+
}
9+
}
10+
}
11+
12+
const RAINBOWS: &[&str] = &[
13+
"rаinЬοѡ", // hue: 0
14+
"raіnЬοw", // hue: 2
15+
"rаіɴЬow", // hue: 2
16+
"raіɴЬoѡ", // hue: 8
17+
"ʀainЬow", // hue: 8
18+
"ʀaіɴboѡ", // hue: 8
19+
"ʀаіnbοw", // hue: 11
20+
"rainЬoѡ", // hue: 14
21+
"raіɴbow", // hue: 14
22+
"rаiɴЬow", // hue: 20
23+
"raіnЬow", // hue: 26
24+
"ʀaiɴbοw", // hue: 32
25+
"raіɴboѡ", // hue: 35
26+
"rаiɴbow", // hue: 35
27+
"rаіnbοw", // hue: 38
28+
"rаinЬow", // hue: 47
29+
"ʀaіnboѡ", // hue: 47
30+
"ʀaіnЬoѡ", // hue: 47
31+
"ʀаіɴbοw", // hue: 53
32+
"ʀaіnЬοѡ", // hue: 57
33+
"raiɴЬoѡ", // hue: 68
34+
"ʀainbοѡ", // hue: 68
35+
"ʀаinboѡ", // hue: 68
36+
"ʀаiɴbοw", // hue: 68
37+
"ʀаіnbow", // hue: 68
38+
"rаіnЬοѡ", // hue: 69
39+
"ʀainЬοw", // hue: 71
40+
"raiɴbow", // hue: 73
41+
"raіnЬoѡ", // hue: 74
42+
"rаіɴbοw", // hue: 77
43+
"raіnЬοѡ", // hue: 81
44+
"raiɴЬow", // hue: 83
45+
"ʀainbοw", // hue: 83
46+
"ʀаinbow", // hue: 83
47+
"ʀаiɴbοѡ", // hue: 83
48+
"ʀаіnboѡ", // hue: 83
49+
"ʀаіɴЬοѡ", // hue: 84
50+
"rainЬow", // hue: 85
51+
"ʀаiɴЬοw", // hue: 86
52+
"ʀаіnbοѡ", // hue: 89
53+
"ʀаіnЬοw", // hue: 92
54+
"rаiɴbοw", // hue: 95
55+
"ʀаіɴbοѡ", // hue: 98
56+
"ʀаiɴЬοѡ", // hue: 99
57+
"raіnbοw", // hue: 101
58+
"ʀаіɴЬοw", // hue: 101
59+
"ʀaiɴboѡ", // hue: 104
60+
"ʀаinbοѡ", // hue: 104
61+
"rаiɴbοѡ", // hue: 107
62+
"ʀаinЬοw", // hue: 107
63+
"rаiɴЬοw", // hue: 110
64+
"rаіnboѡ", // hue: 110
65+
"rаіnbοѡ", // hue: 113
66+
"ʀainЬοѡ", // hue: 114
67+
"rаіnЬοw", // hue: 116
68+
"ʀaіɴЬow", // hue: 116
69+
"rаinbοw", // hue: 122
70+
"ʀаіɴboѡ", // hue: 125
71+
"rаinbοѡ", // hue: 131
72+
"rainbow", // hue: 134
73+
"rаinЬοw", // hue: 134
74+
"ʀаiɴboѡ", // hue: 140
75+
"rainЬοѡ", // hue: 141
76+
"raіɴЬow", // hue: 143
77+
"ʀainЬoѡ", // hue: 143
78+
"ʀaіɴbow", // hue: 143
79+
"ʀainbow", // hue: 148
80+
"rаіɴboѡ", // hue: 149
81+
"ʀainboѡ", // hue: 155
82+
"ʀaіnbow", // hue: 155
83+
"ʀaіnЬow", // hue: 155
84+
"raiɴbοw", // hue: 158
85+
"ʀаiɴЬoѡ", // hue: 158
86+
"rainbοw", // hue: 160
87+
"rаinbow", // hue: 160
88+
"ʀaіɴbοѡ", // hue: 164
89+
"ʀаiɴbow", // hue: 164
90+
"ʀаіnЬoѡ", // hue: 164
91+
"ʀaiɴЬοѡ", // hue: 165
92+
"rаiɴboѡ", // hue: 167
93+
"ʀaіɴЬοw", // hue: 167
94+
"ʀaіɴЬοѡ", // hue: 171
95+
"raіnboѡ", // hue: 173
96+
"ʀаіɴЬoѡ", // hue: 173
97+
"rаіɴbοѡ", // hue: 176
98+
"ʀаinЬow", // hue: 176
99+
"rаiɴЬοѡ", // hue: 177
100+
"rаіɴЬοw", // hue: 179
101+
"ʀаinЬoѡ", // hue: 179
102+
"ʀаіɴbow", // hue: 179
103+
"rаiɴЬoѡ", // hue: 182
104+
"raіɴbοѡ", // hue: 188
105+
"rаіnЬoѡ", // hue: 188
106+
"raiɴЬοѡ", // hue: 189
107+
"raіɴЬοw", // hue: 191
108+
"ʀaіɴbοw", // hue: 191
109+
"ʀаіnЬow", // hue: 191
110+
"rainbοѡ", // hue: 194
111+
"rаinboѡ", // hue: 194
112+
"rаіnbow", // hue: 194
113+
"rainЬοw", // hue: 197
114+
"rаinЬoѡ", // hue: 206
115+
"rаіɴbow", // hue: 206
116+
"rаіɴЬοѡ", // hue: 210
117+
"ʀaiɴЬow", // hue: 212
118+
"raіɴbοw", // hue: 218
119+
"rаіnЬow", // hue: 218
120+
"ʀaiɴbοѡ", // hue: 221
121+
"ʀaiɴЬοw", // hue: 224
122+
"ʀaіnbοѡ", // hue: 227
123+
"raiɴboѡ", // hue: 230
124+
"ʀaіnbοw", // hue: 230
125+
"ʀaіnЬοw", // hue: 230
126+
"ʀаinЬοѡ", // hue: 231
127+
"rainboѡ", // hue: 232
128+
"raіnbow", // hue: 232
129+
"ʀаіɴЬow", // hue: 233
130+
"ʀaіɴЬoѡ", // hue: 239
131+
"ʀаіnЬοѡ", // hue: 246
132+
"raiɴbοѡ", // hue: 248
133+
"ʀаiɴЬow", // hue: 248
134+
"raіɴЬοѡ", // hue: 249
135+
"raiɴЬοw", // hue: 251
136+
"rаіɴЬoѡ", // hue: 251
137+
"ʀaiɴbow", // hue: 251
138+
"ʀаinbοw", // hue: 251
139+
"raіnbοѡ", // hue: 254
140+
];

Diff for: tests/target/comments_unicode.rs

+140
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,140 @@
1+
impl Default for WhitespaceCharacters {
2+
fn default() -> Self {
3+
Self {
4+
space: '·', // U+00B7
5+
nbsp: '⍽', // U+237D
6+
tab: '→', // U+2192
7+
newline: '⏎', // U+23CE
8+
}
9+
}
10+
}
11+
12+
const RAINBOWS: &[&str] = &[
13+
"rаinЬοѡ", // hue: 0
14+
"raіnЬοw", // hue: 2
15+
"rаіɴЬow", // hue: 2
16+
"raіɴЬoѡ", // hue: 8
17+
"ʀainЬow", // hue: 8
18+
"ʀaіɴboѡ", // hue: 8
19+
"ʀаіnbοw", // hue: 11
20+
"rainЬoѡ", // hue: 14
21+
"raіɴbow", // hue: 14
22+
"rаiɴЬow", // hue: 20
23+
"raіnЬow", // hue: 26
24+
"ʀaiɴbοw", // hue: 32
25+
"raіɴboѡ", // hue: 35
26+
"rаiɴbow", // hue: 35
27+
"rаіnbοw", // hue: 38
28+
"rаinЬow", // hue: 47
29+
"ʀaіnboѡ", // hue: 47
30+
"ʀaіnЬoѡ", // hue: 47
31+
"ʀаіɴbοw", // hue: 53
32+
"ʀaіnЬοѡ", // hue: 57
33+
"raiɴЬoѡ", // hue: 68
34+
"ʀainbοѡ", // hue: 68
35+
"ʀаinboѡ", // hue: 68
36+
"ʀаiɴbοw", // hue: 68
37+
"ʀаіnbow", // hue: 68
38+
"rаіnЬοѡ", // hue: 69
39+
"ʀainЬοw", // hue: 71
40+
"raiɴbow", // hue: 73
41+
"raіnЬoѡ", // hue: 74
42+
"rаіɴbοw", // hue: 77
43+
"raіnЬοѡ", // hue: 81
44+
"raiɴЬow", // hue: 83
45+
"ʀainbοw", // hue: 83
46+
"ʀаinbow", // hue: 83
47+
"ʀаiɴbοѡ", // hue: 83
48+
"ʀаіnboѡ", // hue: 83
49+
"ʀаіɴЬοѡ", // hue: 84
50+
"rainЬow", // hue: 85
51+
"ʀаiɴЬοw", // hue: 86
52+
"ʀаіnbοѡ", // hue: 89
53+
"ʀаіnЬοw", // hue: 92
54+
"rаiɴbοw", // hue: 95
55+
"ʀаіɴbοѡ", // hue: 98
56+
"ʀаiɴЬοѡ", // hue: 99
57+
"raіnbοw", // hue: 101
58+
"ʀаіɴЬοw", // hue: 101
59+
"ʀaiɴboѡ", // hue: 104
60+
"ʀаinbοѡ", // hue: 104
61+
"rаiɴbοѡ", // hue: 107
62+
"ʀаinЬοw", // hue: 107
63+
"rаiɴЬοw", // hue: 110
64+
"rаіnboѡ", // hue: 110
65+
"rаіnbοѡ", // hue: 113
66+
"ʀainЬοѡ", // hue: 114
67+
"rаіnЬοw", // hue: 116
68+
"ʀaіɴЬow", // hue: 116
69+
"rаinbοw", // hue: 122
70+
"ʀаіɴboѡ", // hue: 125
71+
"rаinbοѡ", // hue: 131
72+
"rainbow", // hue: 134
73+
"rаinЬοw", // hue: 134
74+
"ʀаiɴboѡ", // hue: 140
75+
"rainЬοѡ", // hue: 141
76+
"raіɴЬow", // hue: 143
77+
"ʀainЬoѡ", // hue: 143
78+
"ʀaіɴbow", // hue: 143
79+
"ʀainbow", // hue: 148
80+
"rаіɴboѡ", // hue: 149
81+
"ʀainboѡ", // hue: 155
82+
"ʀaіnbow", // hue: 155
83+
"ʀaіnЬow", // hue: 155
84+
"raiɴbοw", // hue: 158
85+
"ʀаiɴЬoѡ", // hue: 158
86+
"rainbοw", // hue: 160
87+
"rаinbow", // hue: 160
88+
"ʀaіɴbοѡ", // hue: 164
89+
"ʀаiɴbow", // hue: 164
90+
"ʀаіnЬoѡ", // hue: 164
91+
"ʀaiɴЬοѡ", // hue: 165
92+
"rаiɴboѡ", // hue: 167
93+
"ʀaіɴЬοw", // hue: 167
94+
"ʀaіɴЬοѡ", // hue: 171
95+
"raіnboѡ", // hue: 173
96+
"ʀаіɴЬoѡ", // hue: 173
97+
"rаіɴbοѡ", // hue: 176
98+
"ʀаinЬow", // hue: 176
99+
"rаiɴЬοѡ", // hue: 177
100+
"rаіɴЬοw", // hue: 179
101+
"ʀаinЬoѡ", // hue: 179
102+
"ʀаіɴbow", // hue: 179
103+
"rаiɴЬoѡ", // hue: 182
104+
"raіɴbοѡ", // hue: 188
105+
"rаіnЬoѡ", // hue: 188
106+
"raiɴЬοѡ", // hue: 189
107+
"raіɴЬοw", // hue: 191
108+
"ʀaіɴbοw", // hue: 191
109+
"ʀаіnЬow", // hue: 191
110+
"rainbοѡ", // hue: 194
111+
"rаinboѡ", // hue: 194
112+
"rаіnbow", // hue: 194
113+
"rainЬοw", // hue: 197
114+
"rаinЬoѡ", // hue: 206
115+
"rаіɴbow", // hue: 206
116+
"rаіɴЬοѡ", // hue: 210
117+
"ʀaiɴЬow", // hue: 212
118+
"raіɴbοw", // hue: 218
119+
"rаіnЬow", // hue: 218
120+
"ʀaiɴbοѡ", // hue: 221
121+
"ʀaiɴЬοw", // hue: 224
122+
"ʀaіnbοѡ", // hue: 227
123+
"raiɴboѡ", // hue: 230
124+
"ʀaіnbοw", // hue: 230
125+
"ʀaіnЬοw", // hue: 230
126+
"ʀаinЬοѡ", // hue: 231
127+
"rainboѡ", // hue: 232
128+
"raіnbow", // hue: 232
129+
"ʀаіɴЬow", // hue: 233
130+
"ʀaіɴЬoѡ", // hue: 239
131+
"ʀаіnЬοѡ", // hue: 246
132+
"raiɴbοѡ", // hue: 248
133+
"ʀаiɴЬow", // hue: 248
134+
"raіɴЬοѡ", // hue: 249
135+
"raiɴЬοw", // hue: 251
136+
"rаіɴЬoѡ", // hue: 251
137+
"ʀaiɴbow", // hue: 251
138+
"ʀаinbοw", // hue: 251
139+
"raіnbοѡ", // hue: 254
140+
];

0 commit comments

Comments
 (0)