109 lines
1.5 KiB
Go
109 lines
1.5 KiB
Go
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)
|
|
}
|
|
}
|