12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- package parser
- import "github.com/usememos/memos/plugin/gomark/parser/tokenizer"
- type LinkParser struct {
- ContentTokens []*tokenizer.Token
- URL string
- }
- func NewLinkParser() *LinkParser {
- return &LinkParser{}
- }
- func (*LinkParser) Match(tokens []*tokenizer.Token) *LinkParser {
- if len(tokens) < 4 {
- return nil
- }
- if tokens[0].Type != tokenizer.LeftSquareBracket {
- return nil
- }
- cursor, contentTokens := 1, []*tokenizer.Token{}
- for ; cursor < len(tokens)-2; cursor++ {
- if tokens[cursor].Type == tokenizer.Newline {
- return nil
- }
- if tokens[cursor].Type == tokenizer.RightSquareBracket {
- break
- }
- contentTokens = append(contentTokens, tokens[cursor])
- }
- if tokens[cursor+1].Type != tokenizer.LeftParenthesis {
- return nil
- }
- matched, url := false, ""
- for _, token := range tokens[cursor+2:] {
- if token.Type == tokenizer.Newline || token.Type == tokenizer.Space {
- return nil
- }
- if token.Type == tokenizer.RightParenthesis {
- matched = true
- break
- }
- url += token.Value
- }
- if !matched || url == "" {
- return nil
- }
- if len(contentTokens) == 0 {
- contentTokens = append(contentTokens, &tokenizer.Token{
- Type: tokenizer.Text,
- Value: url,
- })
- }
- return &LinkParser{
- ContentTokens: contentTokens,
- URL: url,
- }
- }
|