57 lines
920 B
Go
57 lines
920 B
Go
package html
|
|
|
|
import (
|
|
"code.squareroundforest.org/arpio/textedit"
|
|
"io"
|
|
)
|
|
|
|
type indentState struct {
|
|
started, lineStarted bool
|
|
}
|
|
|
|
func indentLen(indent string) int {
|
|
var l int
|
|
r := []rune(indent)
|
|
for _, ri := range r {
|
|
if ri == '\t' {
|
|
l += 8
|
|
continue
|
|
}
|
|
|
|
l++
|
|
}
|
|
|
|
return l
|
|
}
|
|
|
|
func indentEdit(indent []rune) func(rune, indentState) ([]rune, indentState) {
|
|
return func(r rune, s indentState) ([]rune, indentState) {
|
|
var ret []rune
|
|
if r == '\n' {
|
|
s.started = true
|
|
s.lineStarted = false
|
|
ret = append(ret, '\n')
|
|
return ret, s
|
|
}
|
|
|
|
if s.started && !s.lineStarted {
|
|
ret = append(ret, indent...)
|
|
}
|
|
|
|
ret = append(ret, r)
|
|
s.started = true
|
|
s.lineStarted = true
|
|
return ret, s
|
|
}
|
|
}
|
|
|
|
func newIndentWriter(out io.Writer, indent string) *textedit.Writer {
|
|
return textedit.New(
|
|
out,
|
|
textedit.Func(
|
|
indentEdit([]rune(indent)),
|
|
func(indentState) []rune { return nil },
|
|
),
|
|
)
|
|
}
|