12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455 |
- 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,
- }
- }
|