46 lines
765 B
Go
46 lines
765 B
Go
package textedit
|
|
|
|
import "unicode"
|
|
|
|
type singleLineState struct {
|
|
started bool
|
|
currentWord []rune
|
|
}
|
|
|
|
func singleLineEdit(r rune, s singleLineState) ([]rune, singleLineState) {
|
|
if !unicode.IsSpace(r) || r == nonbreakSpace {
|
|
s.currentWord = append(s.currentWord, r)
|
|
return nil, s
|
|
}
|
|
|
|
if len(s.currentWord) == 0 {
|
|
return nil, s
|
|
}
|
|
|
|
ret := s.currentWord
|
|
if s.started {
|
|
ret = append([]rune{' '}, ret...)
|
|
}
|
|
|
|
s.currentWord = nil
|
|
s.started = true
|
|
return ret, s
|
|
}
|
|
|
|
func singleLineReleaseState(s singleLineState) []rune {
|
|
if len(s.currentWord) == 0 {
|
|
return nil
|
|
}
|
|
|
|
var ret []rune
|
|
if s.started {
|
|
ret = append(ret, ' ')
|
|
}
|
|
|
|
return append(ret, s.currentWord...)
|
|
}
|
|
|
|
func singleLine() Editor {
|
|
return Func(singleLineEdit, singleLineReleaseState)
|
|
}
|