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}