auto_link.go 979 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. package parser
  2. import (
  3. "github.com/yuin/goldmark/ast"
  4. "github.com/yuin/goldmark/text"
  5. "github.com/yuin/goldmark/util"
  6. )
  7. type autoLinkParser struct {
  8. }
  9. var defaultAutoLinkParser = &autoLinkParser{}
  10. // NewAutoLinkParser returns a new InlineParser that parses autolinks
  11. // surrounded by '<' and '>' .
  12. func NewAutoLinkParser() InlineParser {
  13. return defaultAutoLinkParser
  14. }
  15. func (s *autoLinkParser) Trigger() []byte {
  16. return []byte{'<'}
  17. }
  18. func (s *autoLinkParser) Parse(parent ast.Node, block text.Reader, pc Context) ast.Node {
  19. line, segment := block.PeekLine()
  20. stop := util.FindEmailIndex(line[1:])
  21. typ := ast.AutoLinkType(ast.AutoLinkEmail)
  22. if stop < 0 {
  23. stop = util.FindURLIndex(line[1:])
  24. typ = ast.AutoLinkURL
  25. }
  26. if stop < 0 {
  27. return nil
  28. }
  29. stop++
  30. if stop >= len(line) || line[stop] != '>' {
  31. return nil
  32. }
  33. value := ast.NewTextSegment(text.NewSegment(segment.Start+1, segment.Start+stop))
  34. block.Advance(stop + 1)
  35. return ast.NewAutoLink(typ, value)
  36. }