package parser import "github.com/usememos/memos/plugin/gomark/parser/tokenizer" type ImageParser struct { AltText string URL string } func NewImageParser() *ImageParser { return &ImageParser{} } func (*ImageParser) Match(tokens []*tokenizer.Token) *ImageParser { if len(tokens) < 5 { return nil } if tokens[0].Type != tokenizer.ExclamationMark { return nil } if tokens[1].Type != tokenizer.LeftSquareBracket { return nil } cursor, altText := 2, "" for ; cursor < len(tokens)-2; cursor++ { if tokens[cursor].Type == tokenizer.Newline { return nil } if tokens[cursor].Type == tokenizer.RightSquareBracket { break } altText += tokens[cursor].Value } 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 } return &ImageParser{ AltText: altText, URL: url, } }