Skip to content

Commit 79eab0d

Browse files
authored
Publish 0.2.0 with newlines treated as width 1 (#68)
* Revert "Treat newlines as width 0 in the 0.1 stream, publish 0.1.14 (#67)" This reverts commit 9eaafa5. * Update readme * Bump to 0.2
1 parent 9eaafa5 commit 79eab0d

File tree

5 files changed

+22
-32
lines changed

5 files changed

+22
-32
lines changed

Cargo.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22

33
name = "unicode-width"
4-
version = "0.1.14"
4+
version = "0.2.0"
55
authors = [
66
"kwantam <kwantam@gmail.com>",
77
"Manish Goregaokar <manishsmail@gmail.com>",

README.md

+13
Original file line numberDiff line numberDiff line change
@@ -55,3 +55,16 @@ to your `Cargo.toml`:
5555
[dependencies]
5656
unicode-width = "0.1.11"
5757
```
58+
59+
60+
## Changelog
61+
62+
63+
### 0.2.0
64+
65+
- Treat `\n` as width 1 (#60)
66+
- Treat ambiguous `Modifier_Letter`s as narrow (#63)
67+
- Support `Grapheme_Cluster_Break=Prepend` (#62)
68+
- Support lots of ligatures (#53)
69+
70+
Note: If you are using `unicode-width` for linebreaking, the change treating `\n` as width 1 _may cause behavior changes_. It is recommended that in such cases you feed already-line segmented text to `unicode-width`. In other words, please apply higher level control character based line breaking protocols before feeding text to `unicode-width`. Relying on any character producing a stable width in this crate is likely the sign of a bug.

scripts/unicode.py

+1-4
Original file line numberDiff line numberDiff line change
@@ -1281,10 +1281,7 @@ def lookup_fns(
12811281
s += """
12821282
if c <= '\\u{A0}' {
12831283
match c {
1284-
// According to the spec, LF should be width 1, which is how it is often rendered when it is forced to have a single-line rendering
1285-
// However, this makes it harder to use this crate to calculate line breaks, and breaks assumptions of downstream crates.
1286-
// https://github.com/unicode-rs/unicode-width/issues/60
1287-
'\\n' => (0, WidthInfo::LINE_FEED),
1284+
'\\n' => (1, WidthInfo::LINE_FEED),
12881285
'\\r' if next_info == WidthInfo::LINE_FEED => (0, WidthInfo::DEFAULT),
12891286
_ => (1, WidthInfo::DEFAULT),
12901287
}

src/tables.rs

+2-8
Original file line numberDiff line numberDiff line change
@@ -215,10 +215,7 @@ fn width_in_str(c: char, mut next_info: WidthInfo) -> (i8, WidthInfo) {
215215
}
216216
if c <= '\u{A0}' {
217217
match c {
218-
// According to the spec, LF should be width 1, which is how it is often rendered when it is forced to have a single-line rendering
219-
// However, this makes it harder to use this crate to calculate line breaks, and breaks assumptions of downstream crates.
220-
// https://github.com/unicode-rs/unicode-width/issues/60
221-
'\n' => (0, WidthInfo::LINE_FEED),
218+
'\n' => (1, WidthInfo::LINE_FEED),
222219
'\r' if next_info == WidthInfo::LINE_FEED => (0, WidthInfo::DEFAULT),
223220
_ => (1, WidthInfo::DEFAULT),
224221
}
@@ -510,10 +507,7 @@ fn width_in_str_cjk(c: char, mut next_info: WidthInfo) -> (i8, WidthInfo) {
510507
}
511508
if c <= '\u{A0}' {
512509
match c {
513-
// According to the spec, LF should be width 1, which is how it is often rendered when it is forced to have a single-line rendering
514-
// However, this makes it harder to use this crate to calculate line breaks, and breaks assumptions of downstream crates.
515-
// https://github.com/unicode-rs/unicode-width/issues/60
516-
'\n' => (0, WidthInfo::LINE_FEED),
510+
'\n' => (1, WidthInfo::LINE_FEED),
517511
'\r' if next_info == WidthInfo::LINE_FEED => (0, WidthInfo::DEFAULT),
518512
_ => (1, WidthInfo::DEFAULT),
519513
}

tests/tests.rs

+5-19
Original file line numberDiff line numberDiff line change
@@ -214,23 +214,18 @@ fn test_control_line_break() {
214214
assert_width!('\r', None, None);
215215
assert_width!('\n', None, None);
216216
assert_width!("\r", 1, 1);
217-
// This is 0 due to #60
218-
assert_width!("\n", 0, 0);
219-
assert_width!("\r\n", 0, 0);
217+
assert_width!("\n", 1, 1);
218+
assert_width!("\r\n", 1, 1);
220219
assert_width!("\0", 1, 1);
221-
assert_width!("1\t2\r\n3\u{85}4", 6, 6);
222-
assert_width!("\r\u{FE0F}\n", 1, 1);
223-
assert_width!("\r\u{200D}\n", 1, 1);
220+
assert_width!("1\t2\r\n3\u{85}4", 7, 7);
221+
assert_width!("\r\u{FE0F}\n", 2, 2);
222+
assert_width!("\r\u{200D}\n", 2, 2);
224223
}
225224

226225
#[test]
227226
fn char_str_consistent() {
228227
let mut s = String::with_capacity(4);
229228
for c in '\0'..=char::MAX {
230-
// Newlines are special cased (#60)
231-
if c == '\n' {
232-
continue;
233-
}
234229
s.clear();
235230
s.push(c);
236231
assert_eq!(c.width().unwrap_or(1), s.width());
@@ -423,10 +418,6 @@ fn test_khmer_coeng() {
423418
assert_width!(format!("\u{17D2}{c}"), 0, 0);
424419
assert_width!(format!("\u{17D2}\u{200D}\u{200D}{c}"), 0, 0);
425420
} else {
426-
// Newlines are special cased (#60)
427-
if c == '\n' {
428-
continue;
429-
}
430421
assert_width!(
431422
format!("\u{17D2}{c}"),
432423
c.width().unwrap_or(1),
@@ -597,11 +588,6 @@ fn emoji_test_file() {
597588
}
598589
}
599590

600-
#[test]
601-
fn test_newline_zero_issue_60() {
602-
assert_width!("a\na", 2, 2);
603-
}
604-
605591
// Test traits are unsealed
606592

607593
#[cfg(feature = "cjk")]

0 commit comments

Comments
 (0)