github.com/charmbracelet/glamour@v0.7.0/ansi/margin.go (about)

     1  package ansi
     2  
     3  import (
     4  	"io"
     5  
     6  	"github.com/muesli/reflow/indent"
     7  	"github.com/muesli/reflow/padding"
     8  )
     9  
    10  // MarginWriter is a Writer that applies indentation and padding around
    11  // whatever you write to it.
    12  type MarginWriter struct {
    13  	w  io.Writer
    14  	pw *padding.Writer
    15  	iw *indent.Writer
    16  }
    17  
    18  // NewMarginWriter returns a new MarginWriter.
    19  func NewMarginWriter(ctx RenderContext, w io.Writer, rules StyleBlock) *MarginWriter {
    20  	bs := ctx.blockStack
    21  
    22  	var indentation uint
    23  	var margin uint
    24  	if rules.Indent != nil {
    25  		indentation = *rules.Indent
    26  	}
    27  	if rules.Margin != nil {
    28  		margin = *rules.Margin
    29  	}
    30  
    31  	pw := padding.NewWriterPipe(w, bs.Width(ctx), func(wr io.Writer) {
    32  		renderText(w, ctx.options.ColorProfile, rules.StylePrimitive, " ")
    33  	})
    34  
    35  	ic := " "
    36  	if rules.IndentToken != nil {
    37  		ic = *rules.IndentToken
    38  	}
    39  	iw := indent.NewWriterPipe(pw, indentation+margin, func(wr io.Writer) {
    40  		renderText(w, ctx.options.ColorProfile, bs.Parent().Style.StylePrimitive, ic)
    41  	})
    42  
    43  	return &MarginWriter{
    44  		w:  w,
    45  		pw: pw,
    46  		iw: iw,
    47  	}
    48  }
    49  
    50  func (w *MarginWriter) Write(b []byte) (int, error) {
    51  	return w.iw.Write(b)
    52  }