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 }