package gg import ( "strings" "unicode" ) type measureStringer interface { MeasureString(s string) (w, h float64) } func splitOnSpace(x string) []string { var result []string pi := 0 ps := false for i, c := range x { s := unicode.IsSpace(c) if s != ps && i > 0 { result = append(result, x[pi:i]) pi = i } ps = s } result = append(result, x[pi:]) return result } func wordWrap(m measureStringer, s string, width float64) []string { var result []string for _, line := range strings.Split(s, "\n") { if strings.TrimSpace(line) == "" { result = append(result, line) continue } fields := splitOnSpace(line) if len(fields)%2 == 1 { fields = append(fields, "") } x := "" for i := 0; i < len(fields); i += 2 { w, _ := m.MeasureString(x + fields[i]) if w > width { if x == "" { result = append(result, fields[i]) x = "" continue } else { result = append(result, x) x = "" } } x += fields[i] + fields[i+1] } if x != "" { result = append(result, x) } } for i, line := range result { result[i] = strings.TrimSpace(line) } return result }