package parser import ( "net/url" "github.com/usememos/memos/plugin/gomark/ast" "github.com/usememos/memos/plugin/gomark/parser/tokenizer" ) type AutoLinkParser struct{} func NewAutoLinkParser() *AutoLinkParser { return &AutoLinkParser{} } func (*AutoLinkParser) Match(tokens []*tokenizer.Token) (ast.Node, int) { if len(tokens) < 3 { return nil, 0 } matchedTokens := tokenizer.GetFirstLine(tokens) urlStr, isRawText := "", true if matchedTokens[0].Type == tokenizer.LessThan { greaterThanIndex := tokenizer.FindUnescaped(matchedTokens, tokenizer.GreaterThan) if greaterThanIndex < 0 { return nil, 0 } matchedTokens = matchedTokens[:greaterThanIndex+1] urlStr = tokenizer.Stringify(matchedTokens[1 : len(matchedTokens)-1]) isRawText = false } else { u, err := url.Parse(tokenizer.Stringify(matchedTokens)) if err != nil || u.Scheme == "" || u.Host == "" { return nil, 0 } urlStr = tokenizer.Stringify(matchedTokens) } return &ast.AutoLink{ URL: urlStr, IsRawText: isRawText, }, len(matchedTokens) }