From a0ae5fc5349063fb9b0a3de04be555b3757c1f4b Mon Sep 17 00:00:00 2001 From: Yang Zhang Date: Mon, 31 Dec 2018 08:53:11 +0800 Subject: [PATCH] Fix incorrect wrap of mixed wide and ascii chars --- util/text/text.go | 14 +++++++++++--- util/text/text_test.go | 13 ++++++++++++- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/util/text/text.go b/util/text/text.go index 0447bde1dcf4b8ee355c9c9da044a1798a9af1bb..f8062bc690d1f6724f8bac55b102f6ea3f258646 100644 --- a/util/text/text.go +++ b/util/text/text.go @@ -151,10 +151,18 @@ func softwrapLine(s string, w int) string { var chunks []string var word string wordType := NONE + flushWord := func() { + chunks = append(chunks, word) + word = "" + wordType = NONE + } for _, r := range []rune(newStr) { // A WIDE_CHAR itself constitutes a group. thisType := runeType(r) if thisType == WIDE_CHAR { + if wordType != NONE { + flushWord() + } chunks = append(chunks, string(r)) continue } @@ -162,7 +170,7 @@ func softwrapLine(s string, w int) string { // char with different type or end of string. if thisType != wordType { if wordType != NONE { - chunks = append(chunks, word) + flushWord() } word = string(r) wordType = thisType @@ -171,7 +179,7 @@ func softwrapLine(s string, w int) string { } } if word != "" { - chunks = append(chunks, word) + flushWord() } var line string = "" @@ -187,7 +195,7 @@ func softwrapLine(s string, w int) string { line += chunks[len(chunks)-1] chunks = chunks[:len(chunks)-1] width += wl - if width == w && len(chunks) > 0{ + if width == w && len(chunks) > 0 { line += "\n" width = 0 } diff --git a/util/text/text_test.go b/util/text/text_test.go index 480b1f1f01814492c450e1c9af519a7b36ac6d4c..374ced16e61ffaf80a77b8302edace6c16b3f354 100644 --- a/util/text/text_test.go +++ b/util/text/text_test.go @@ -5,7 +5,6 @@ import ( "testing" ) - func TestWrap(t *testing.T) { cases := []struct { Input, Output string @@ -102,6 +101,18 @@ func TestWrap(t *testing.T) { "一只敏捷的\x1b[31m狐\n狸跳过\x1b[0m了一只\n懒狗。", 12, }, + // Handle mixed wide and short characters + { + "敏捷 A quick 的狐狸 fox 跳过 jumps over a lazy 了一只懒狗 dog。", + "敏捷 A quick\n的狐狸 fox\n跳过 jumps\nover a lazy\n了一只懒狗\ndog。", + 12, + }, + // Handle mixed wide and short characters with color + { + "敏捷 A \x1b31mquick 的狐狸 fox 跳\x1b0m过 jumps over a lazy 了一只懒狗 dog。", + "敏捷 A \x1b31mquick\n的狐狸 fox\n跳\x1b0m过 jumps\nover a lazy\n了一只懒狗\ndog。", + 12, + }, } for i, tc := range cases {