github.com/charmbracelet/glamour@v0.7.0/ansi/link.go (about) 1 package ansi 2 3 import ( 4 "io" 5 "net/url" 6 ) 7 8 // A LinkElement is used to render hyperlinks. 9 type LinkElement struct { 10 Text string 11 BaseURL string 12 URL string 13 Child ElementRenderer 14 } 15 16 func (e *LinkElement) Render(w io.Writer, ctx RenderContext) error { 17 var textRendered bool 18 if len(e.Text) > 0 && e.Text != e.URL { 19 textRendered = true 20 21 el := &BaseElement{ 22 Token: e.Text, 23 Style: ctx.options.Styles.LinkText, 24 } 25 err := el.Render(w, ctx) 26 if err != nil { 27 return err 28 } 29 } 30 31 /* 32 if node.LastChild != nil { 33 if node.LastChild.Type == bf.Image { 34 el := tr.NewElement(node.LastChild) 35 err := el.Renderer.Render(w, node.LastChild, tr) 36 if err != nil { 37 return err 38 } 39 } 40 if len(node.LastChild.Literal) > 0 && 41 string(node.LastChild.Literal) != string(node.LinkData.Destination) { 42 textRendered = true 43 el := &BaseElement{ 44 Token: string(node.LastChild.Literal), 45 Style: ctx.style[LinkText], 46 } 47 err := el.Render(w, node.LastChild, tr) 48 if err != nil { 49 return err 50 } 51 } 52 } 53 */ 54 55 u, err := url.Parse(e.URL) 56 if err == nil && 57 "#"+u.Fragment != e.URL { // if the URL only consists of an anchor, ignore it 58 pre := " " 59 style := ctx.options.Styles.Link 60 if !textRendered { 61 pre = "" 62 style.BlockPrefix = "" 63 style.BlockSuffix = "" 64 } 65 66 el := &BaseElement{ 67 Token: resolveRelativeURL(e.BaseURL, e.URL), 68 Prefix: pre, 69 Style: style, 70 } 71 err := el.Render(w, ctx) 72 if err != nil { 73 return err 74 } 75 } 76 77 return nil 78 }