diff --git a/benchmark_test.go b/benchmark_test.go index bffd78a..3dc15ea 100644 --- a/benchmark_test.go +++ b/benchmark_test.go @@ -37,8 +37,8 @@ func BenchmarkTableAmbiguous(b *testing.B) { func BenchmarkTableEmoji(b *testing.B) { benchSink = benchTable(b, emoji) } -func BenchmarkTableNotassigned(b *testing.B) { - benchSink = benchTable(b, notassigned) +func BenchmarkTableNarrow(b *testing.B) { + benchSink = benchTable(b, narrow) } func BenchmarkTableNeutral(b *testing.B) { benchSink = benchTable(b, neutral) diff --git a/runewidth.go b/runewidth.go index f3871a6..e667419 100644 --- a/runewidth.go +++ b/runewidth.go @@ -97,8 +97,10 @@ func NewCondition() *Condition { // See http://www.unicode.org/reports/tr11/ func (c *Condition) RuneWidth(r rune) int { switch { - case r < 0 || r > 0x10FFFF || inTables(r, nonprint, combining, notassigned): + case r < 0 || r > 0x10FFFF || inTables(r, nonprint, combining): return 0 + case inTables(r, narrow): + return 1 case (c.EastAsianWidth && IsAmbiguousWidth(r)) || inTables(r, doublewidth): return 2 default: diff --git a/runewidth_table.go b/runewidth_table.go index b27d77d..e5d890c 100644 --- a/runewidth_table.go +++ b/runewidth_table.go @@ -124,8 +124,10 @@ var ambiguous = table{ {0x1F18F, 0x1F190}, {0x1F19B, 0x1F1AC}, {0xE0100, 0xE01EF}, {0xF0000, 0xFFFFD}, {0x100000, 0x10FFFD}, } -var notassigned = table{ - {0x27E6, 0x27ED}, {0x2985, 0x2986}, +var narrow = table{ + {0x0020, 0x007E}, {0x00A2, 0x00A3}, {0x00A5, 0x00A6}, + {0x00AC, 0x00AC}, {0x00AF, 0x00AF}, {0x27E6, 0x27ED}, + {0x2985, 0x2986}, } var neutral = table{ diff --git a/runewidth_test.go b/runewidth_test.go index 89c943f..b93e652 100644 --- a/runewidth_test.go +++ b/runewidth_test.go @@ -44,7 +44,7 @@ var tables = []tableInfo{ {doublewidth, "doublewidth", 182440, "3d16eda8650dc2c92d6318d32f0b4a74fda5a278db2d4544b1dd65863394823c"}, {ambiguous, "ambiguous", 138739, "d05e339a10f296de6547ff3d6c5aee32f627f6555477afebd4a3b7e3cf74c9e3"}, {emoji, "emoji", 3535, "9ec17351601d49c535658de8d129c1d0ccda2e620669fc39a2faaee7dedcef6d"}, - {notassigned, "notassigned", 10, "68441e98eca1450efbe857ac051fcc872eed347054dfd0bc662d1c4ee021d69f"}, + {narrow, "narrow", 111, "fa897699c5e3cd9141c638d539331b0bdd508b874e22996c5e929767d455fc5a"}, {neutral, "neutral", 27333, "5455f5e75c307f70b4e9b2384dc5a8bcd91a4c5e2b24b2b185dfad4d860ee5c2"}, } @@ -164,6 +164,8 @@ var runewidthtests = []struct { {'\u0300', 0, 0}, {'\u2028', 0, 0}, {'\u2029', 0, 0}, + {'a', 1, 1}, // ASCII classified as "na" (narrow) + {'⟦', 1, 1}, // non-ASCII classified as "na" (narrow) } func TestRuneWidth(t *testing.T) { diff --git a/script/generate.go b/script/generate.go index 2b64b24..cd7f923 100644 --- a/script/generate.go +++ b/script/generate.go @@ -92,12 +92,10 @@ func eastasian(out io.Writer, in io.Reader) error { hi: r2, }) case "Na": - if r1 > 0xFF { - na = append(na, rrange{ - lo: r1, - hi: r2, - }) - } + na = append(na, rrange{ + lo: r1, + hi: r2, + }) case "N": nu = append(nu, rrange{ lo: r1, @@ -119,7 +117,7 @@ func eastasian(out io.Writer, in io.Reader) error { fmt.Fprint(out) shapeup(&na) - generate(out, "notassigned", na) + generate(out, "narrow", na) fmt.Fprintln(out) shapeup(&nu)