package textfmt import ( "io" "fmt" "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) } }