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  }