okami.mom/glamour
git clone https://git.nkp.pet/okami.mom/glamour
052c391
main
1package ansi 2 3import ( 4"bytes" 5"errors" 6"io" 7"strconv" 8"strings" 9 10"charm.land/lipgloss/v2" 11"github.com/charmbracelet/x/ansi" 12) 13 14// An ItemElement is used to render items inside a list. 15type ItemElement struct { 16IsOrdered bool 17Enumeration uint 18} 19 20// Render renders an ItemElement. 21func (e * ItemElement )Render (w io.Writer ,ctx RenderContext )error { 22var el * BaseElement 23if e .IsOrdered { 24el = & BaseElement { 25Style :ctx .options .Styles .Enumeration , 26Prefix :strconv .FormatInt (int64 (e .Enumeration ),10 ),//nolint:gosec 27 } 28 }else { 29el = & BaseElement { 30Style :ctx .options .Styles .Item , 31 } 32 } 33 34return el .Render (w ,ctx ) 35} 36 37// A ListItemElement renders a list item as a block: its marker leads the 38// first row and every later row hangs under the text after it, so wrapped 39// lines, paragraphs, code and nested lists stay inside the item. 40type ListItemElement struct { 41Marker ElementRenderer 42} 43 44func (e * ListItemElement )marker (ctx RenderContext )string { 45var marker bytes.Buffer 46_ = e .Marker .Render (& marker ,ctx ) 47return marker .String () 48} 49 50// Render opens the item's block, indented by the marker's width. 51func (e * ListItemElement )Render (_ io.Writer ,ctx RenderContext )error { 52width := uint (ansi .StringWidth (e .marker (ctx )))//nolint:gosec 53bs := ctx .blockStack 54bs .Push (BlockElement { 55Block :& bytes.Buffer {}, 56Style :cascadeStyle (bs .Current ().Style ,StyleBlock {Indent :& width },false ), 57 }) 58return nil 59} 60 61// Finish writes the item: the marker leads its first row and pads the rest. 62func (e * ListItemElement )Finish (w io.Writer ,ctx RenderContext )error { 63bs := ctx .blockStack 64marker := e .marker (ctx ) 65lead ,pad := marker ,strings .Repeat (" " ,ansi .StringWidth (marker )) 66iw := NewIndentWriter (w ,1 ,func (w io.Writer ) { 67_ ,_ = io .WriteString (w ,lead ) 68lead = pad 69 }) 70body := lipgloss .Wrap (bs .Current ().Block .String (),int (bs .Width (ctx ))," ,.;-+|" ) 71_ ,err := io .WriteString (iw ,strings .TrimRight (body ,"\n" )) 72bs .Current ().Block .Reset () 73bs .Pop () 74return errors .Join (err ,iw .Close ()) 75}