mirror of
https://github.com/usememos/memos.git
synced 2025-02-25 05:45:00 +08:00
43 lines
1 KiB
Go
43 lines
1 KiB
Go
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)
|
|
}
|