emphasis.go

 1package ansi
 2
 3import (
 4	"fmt"
 5	"io"
 6)
 7
 8// A EmphasisElement is used to render emphasis.
 9type EmphasisElement struct {
10	Children []ElementRenderer
11	Level    int
12}
13
14// Render renders a EmphasisElement.
15func (e *EmphasisElement) Render(w io.Writer, ctx RenderContext) error {
16	style := ctx.options.Styles.Emph
17	if e.Level > 1 {
18		style = ctx.options.Styles.Strong
19	}
20
21	return e.doRender(w, ctx, style)
22}
23
24// StyleOverrideRender renders a EmphasisElement with a given style.
25func (e *EmphasisElement) StyleOverrideRender(w io.Writer, ctx RenderContext, style StylePrimitive) error {
26	base := ctx.options.Styles.Emph
27	if e.Level > 1 {
28		base = ctx.options.Styles.Strong
29	}
30	return e.doRender(w, ctx, cascadeStylePrimitives(base, style))
31}
32
33func (e *EmphasisElement) doRender(w io.Writer, ctx RenderContext, style StylePrimitive) error {
34	for _, child := range e.Children {
35		if r, ok := child.(StyleOverriderElementRenderer); ok {
36			if err := r.StyleOverrideRender(w, ctx, style); err != nil {
37				return fmt.Errorf("glamour: error rendering with style: %w", err)
38			}
39		} else {
40			if err := child.Render(w, ctx); err != nil {
41				return fmt.Errorf("glamour: error rendering: %w", err)
42			}
43		}
44	}
45
46	return nil
47}