2025-11-01 03:49:02 +01:00
|
|
|
package textedit
|
|
|
|
|
|
2025-11-02 01:04:54 +01:00
|
|
|
type indentState struct {
|
|
|
|
|
started, lineStarted bool
|
2025-11-01 03:49:02 +01:00
|
|
|
}
|
|
|
|
|
|
2025-11-02 01:04:54 +01:00
|
|
|
func indentEdit(first, rest []rune) func(rune, indentState) ([]rune, indentState) {
|
|
|
|
|
return func(r rune, s indentState) ([]rune, indentState) {
|
|
|
|
|
if r == '\n' {
|
|
|
|
|
s.started = true
|
|
|
|
|
s.lineStarted = false
|
|
|
|
|
return []rune{'\n'}, s
|
2025-11-01 03:49:02 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var ret []rune
|
2025-11-02 01:04:54 +01:00
|
|
|
if !s.started {
|
|
|
|
|
ret = append(ret, first...)
|
|
|
|
|
} else if !s.lineStarted {
|
2025-11-01 03:49:02 +01:00
|
|
|
ret = append(ret, rest...)
|
|
|
|
|
}
|
|
|
|
|
|
2025-11-02 01:04:54 +01:00
|
|
|
ret = append(ret, r)
|
|
|
|
|
s.started = true
|
|
|
|
|
s.lineStarted = true
|
|
|
|
|
return ret, s
|
2025-11-01 03:49:02 +01:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2025-11-02 01:04:54 +01:00
|
|
|
func indent(first, rest []rune) Editor {
|
2025-11-01 03:49:02 +01:00
|
|
|
return Func(
|
2025-11-02 01:04:54 +01:00
|
|
|
indentEdit(first, rest),
|
|
|
|
|
func(indentState) []rune { return nil },
|
2025-11-01 03:49:02 +01:00
|
|
|
)
|
|
|
|
|
}
|