53 lines
1.1 KiB
Go
53 lines
1.1 KiB
Go
package ansi
|
|
|
|
import (
|
|
"io"
|
|
|
|
"github.com/muesli/reflow/indent"
|
|
"github.com/muesli/reflow/padding"
|
|
)
|
|
|
|
// MarginWriter is a Writer that applies indentation and padding around
|
|
// whatever you write to it.
|
|
type MarginWriter struct {
|
|
w io.Writer
|
|
pw *padding.Writer
|
|
iw *indent.Writer
|
|
}
|
|
|
|
// NewMarginWriter returns a new MarginWriter.
|
|
func NewMarginWriter(ctx RenderContext, w io.Writer, rules StyleBlock) *MarginWriter {
|
|
bs := ctx.blockStack
|
|
|
|
var indentation uint
|
|
var margin uint
|
|
if rules.Indent != nil {
|
|
indentation = *rules.Indent
|
|
}
|
|
if rules.Margin != nil {
|
|
margin = *rules.Margin
|
|
}
|
|
|
|
pw := padding.NewWriterPipe(w, bs.Width(ctx), func(wr io.Writer) {
|
|
renderText(w, ctx.options.ColorProfile, rules.StylePrimitive, " ")
|
|
})
|
|
|
|
ic := " "
|
|
if rules.IndentToken != nil {
|
|
ic = *rules.IndentToken
|
|
}
|
|
iw := indent.NewWriterPipe(pw, indentation+margin, func(wr io.Writer) {
|
|
renderText(w, ctx.options.ColorProfile, bs.Parent().Style.StylePrimitive, ic)
|
|
})
|
|
|
|
return &MarginWriter{
|
|
w: w,
|
|
pw: pw,
|
|
iw: iw,
|
|
}
|
|
}
|
|
|
|
func (w *MarginWriter) Write(b []byte) (int, error) {
|
|
return w.iw.Write(b)
|
|
}
|