Fix incorrect wrap of mixed wide and ascii chars

Yang Zhang created

Change summary

util/text/text.go      | 14 +++++++++++---
util/text/text_test.go | 13 ++++++++++++-
2 files changed, 23 insertions(+), 4 deletions(-)

Detailed changes

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
 			}

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 {