github.com/xxf098/lite-proxy@v0.15.1-0.20230422081941-12c69f323218/web/render/wrap.go (about) 1 package render 2 3 import ( 4 "strings" 5 "unicode" 6 ) 7 8 type measureStringer interface { 9 MeasureString(s string) (w, h float64) 10 } 11 12 func splitOnSpace(x string) []string { 13 var result []string 14 pi := 0 15 ps := false 16 for i, c := range x { 17 s := unicode.IsSpace(c) 18 if s != ps && i > 0 { 19 result = append(result, x[pi:i]) 20 pi = i 21 } 22 ps = s 23 } 24 result = append(result, x[pi:]) 25 return result 26 } 27 28 func wordWrap(m measureStringer, s string, width float64) []string { 29 var result []string 30 for _, line := range strings.Split(s, "\n") { 31 fields := splitOnSpace(line) 32 if len(fields)%2 == 1 { 33 fields = append(fields, "") 34 } 35 x := "" 36 for i := 0; i < len(fields); i += 2 { 37 w, _ := m.MeasureString(x + fields[i]) 38 if w > width { 39 if x == "" { 40 result = append(result, fields[i]) 41 x = "" 42 continue 43 } else { 44 result = append(result, x) 45 x = "" 46 } 47 } 48 x += fields[i] + fields[i+1] 49 } 50 if x != "" { 51 result = append(result, x) 52 } 53 } 54 for i, line := range result { 55 result[i] = strings.TrimSpace(line) 56 } 57 return result 58 }