1
0
textfmt/write.go
2025-10-23 02:55:49 +02:00

109 lines
1.5 KiB
Go

package textfmt
import (
"fmt"
"io"
"strings"
)
type writer interface {
write(...any)
error() error
setErr(error)
}
type ttyWriter struct {
w io.Writer
internal bool
err error
}
type roffWriter struct {
w io.Writer
internal bool
err error
}
func (w *ttyWriter) write(a ...any) {
for _, ai := range a {
if w.err != nil {
return
}
s := fmt.Sprint(ai)
r := []rune(s)
if !w.internal {
for i := range r {
if r[i] == '\u00a0' {
r[i] = ' '
}
}
}
if _, err := w.w.Write([]byte(string(r))); err != nil {
w.err = err
}
}
}
func (w *ttyWriter) error() error {
return w.err
}
func (w *ttyWriter) setErr(err error) {
w.err = err
}
func (w *roffWriter) write(a ...any) {
for _, ai := range a {
if w.err != nil {
return
}
var rr []rune
s := fmt.Sprint(ai)
r := []rune(s)
if w.internal {
rr = r
} else {
for i := range r {
if r[i] == '\u00a0' {
rr = append(rr, []rune("\\~")...)
continue
}
rr = append(rr, r[i])
}
}
if _, err := w.w.Write([]byte(string(rr))); err != nil {
w.err = err
}
}
}
func (w *roffWriter) error() error {
return w.err
}
func (w *roffWriter) setErr(err error) {
w.err = err
}
func writeLines(w writer, txt string, indentFirst, indentRest int) {
lines := strings.Split(txt, "\n")
for i, l := range lines {
if i > 0 {
w.write("\n")
}
indent := indentFirst
if i > 0 {
indent = indentRest
}
w.write(timesn(" ", indent))
w.write(l)
}
}