diff --git a/gold.go b/gold.go index b398034..de7d05f 100644 --- a/gold.go +++ b/gold.go @@ -25,10 +25,14 @@ type TermRenderer struct { context RenderContext } +// Render initializes a new TermRenderer and renders a markdown with a specific +// style. func Render(in string, stylePath string) ([]byte, error) { return RenderBytes([]byte(in), stylePath) } +// RenderBytes initializes a new TermRenderer and renders a markdown with a +// specific style. func RenderBytes(in []byte, stylePath string) ([]byte, error) { r, err := NewTermRenderer(stylePath, Options{ WordWrap: 80, @@ -62,6 +66,8 @@ func NewTermRenderer(stylePath string, options Options) (*TermRenderer, error) { return NewTermRendererFromBytes(b, options) } +// NewTermRendererFromBytes returns a new TermRenderer with style and options +// set. func NewTermRendererFromBytes(b []byte, options Options) (*TermRenderer, error) { e := make(map[string]ElementStyle) err := json.Unmarshal(b, &e) @@ -82,30 +88,35 @@ func NewTermRendererFromBytes(b []byte, options Options) (*TermRenderer, error) return tr, nil } +// Render returns the markdown rendered into a string. func (tr *TermRenderer) Render(in string) string { return string(tr.RenderBytes([]byte(in))) } +// RenderBytes returns the markdown rendered into a byte slice. func (tr *TermRenderer) RenderBytes(in []byte) []byte { return bf.Run(in, bf.WithRenderer(tr)) } +// RenderNode renders a single markdown node. func (tr *TermRenderer) RenderNode(w io.Writer, node *bf.Node, entering bool) bf.WalkStatus { // _, _ = w.Write([]byte(node.Type.String())) writeTo := w bs := tr.context.blockStack + // children get rendered by their parent if isChild(node) { return bf.GoToNext } e := tr.NewElement(node) if entering { + // everything below the Document element gets rendered into a block buffer if bs.Len() > 0 { writeTo = io.Writer(bs.Current().Block) } - _, _ = writeTo.Write([]byte(e.Entering)) + _, _ = writeTo.Write([]byte(e.Entering)) if e.Renderer != nil { err := e.Renderer.Render(writeTo, tr.context) if err != nil { @@ -114,6 +125,7 @@ func (tr *TermRenderer) RenderNode(w io.Writer, node *bf.Node, entering bool) bf } } } else { + // everything below the Document element gets rendered into a block buffer if bs.Len() > 0 { writeTo = io.Writer(bs.Parent().Block) } @@ -131,16 +143,17 @@ func (tr *TermRenderer) RenderNode(w io.Writer, node *bf.Node, entering bool) bf return bf.Terminate } } - _, _ = writeTo.Write([]byte(e.Exiting)) } return bf.GoToNext } +// RenderHeader renders the markdown's header. func (tr *TermRenderer) RenderHeader(w io.Writer, ast *bf.Node) { } +// RenderFooter renders the markdown's footer. func (tr *TermRenderer) RenderFooter(w io.Writer, ast *bf.Node) { } @@ -148,6 +161,8 @@ func isChild(node *bf.Node) bool { if node.Parent == nil { return false } + + // These types are already rendered by their parent switch node.Parent.Type { case bf.Heading, bf.Link, bf.Image, bf.TableCell, bf.Emph, bf.Strong: return true