69 lines
918 B
Go
69 lines
918 B
Go
|
package tui
|
||
|
|
||
|
import (
|
||
|
"strings"
|
||
|
"unicode"
|
||
|
)
|
||
|
|
||
|
// Split text into words or newlines.
|
||
|
func splitText(s string) [][]rune {
|
||
|
s = strings.TrimSpace(s)
|
||
|
r := []rune(s)
|
||
|
out := [][]rune{}
|
||
|
|
||
|
nextWord := func() []rune {
|
||
|
for i := range r {
|
||
|
if unicode.IsSpace(r[i]) {
|
||
|
ret := r[:i]
|
||
|
r = r[i:]
|
||
|
return ret
|
||
|
}
|
||
|
}
|
||
|
ret := r
|
||
|
r = r[:0]
|
||
|
return ret
|
||
|
}
|
||
|
|
||
|
nextSpaces := func() []rune {
|
||
|
for i := range r {
|
||
|
if !unicode.IsSpace(r[i]) {
|
||
|
ret := r[:i]
|
||
|
r = r[i:]
|
||
|
return ret
|
||
|
}
|
||
|
}
|
||
|
// Code should never reach these lines.
|
||
|
ret := r
|
||
|
r = r[:0]
|
||
|
return ret
|
||
|
}
|
||
|
|
||
|
for len(r) > 0 {
|
||
|
word := nextWord()
|
||
|
if len(word) != 0 {
|
||
|
out = append(out, word)
|
||
|
}
|
||
|
|
||
|
if len(r) == 0 {
|
||
|
break
|
||
|
}
|
||
|
|
||
|
spaces := nextSpaces()
|
||
|
count := 0
|
||
|
for _, x := range spaces {
|
||
|
if x == '\n' {
|
||
|
count++
|
||
|
}
|
||
|
if count > 1 {
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if count > 1 {
|
||
|
out = append(out, []rune{'\n'})
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return out
|
||
|
}
|