image.go

 1package ansi
 2
 3import (
 4	"io"
 5	"strings"
 6)
 7
 8// An ImageElement is used to render images elements.
 9type ImageElement struct {
10	Text     string
11	BaseURL  string
12	URL      string
13	Child    ElementRenderer
14	TextOnly bool
15}
16
17// Render renders an ImageElement.
18func (e *ImageElement) Render(w io.Writer, ctx RenderContext) error {
19	// Make OSC 8 hyperlink token.
20	hyperlink, resetHyperlink, _ := makeHyperlink(e.URL)
21
22	style := ctx.options.Styles.ImageText
23	if e.TextOnly {
24		style.Format = strings.TrimSuffix(style.Format, " →")
25	}
26
27	if len(e.Text) > 0 {
28		token := hyperlink + e.Text + resetHyperlink
29		el := &BaseElement{
30			Token: token,
31			Style: style,
32		}
33		err := el.Render(w, ctx)
34		if err != nil {
35			return err
36		}
37	}
38
39	if e.TextOnly {
40		return nil
41	}
42
43	if len(e.URL) > 0 {
44		token := hyperlink + resolveRelativeURL(e.BaseURL, e.URL) + resetHyperlink
45		el := &BaseElement{
46			Token:  token,
47			Prefix: " ",
48			Style:  ctx.options.Styles.Image,
49		}
50		err := el.Render(w, ctx)
51		if err != nil {
52			return err
53		}
54	}
55
56	return nil
57}