image.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. package parser
  2. import "github.com/usememos/memos/plugin/gomark/parser/tokenizer"
  3. type ImageParser struct {
  4. AltText string
  5. URL string
  6. }
  7. func NewImageParser() *ImageParser {
  8. return &ImageParser{}
  9. }
  10. func (*ImageParser) Match(tokens []*tokenizer.Token) *ImageParser {
  11. if len(tokens) < 5 {
  12. return nil
  13. }
  14. if tokens[0].Type != tokenizer.ExclamationMark {
  15. return nil
  16. }
  17. if tokens[1].Type != tokenizer.LeftSquareBracket {
  18. return nil
  19. }
  20. cursor, altText := 2, ""
  21. for ; cursor < len(tokens)-2; cursor++ {
  22. if tokens[cursor].Type == tokenizer.Newline {
  23. return nil
  24. }
  25. if tokens[cursor].Type == tokenizer.RightSquareBracket {
  26. break
  27. }
  28. altText += tokens[cursor].Value
  29. }
  30. if tokens[cursor+1].Type != tokenizer.LeftParenthesis {
  31. return nil
  32. }
  33. matched, url := false, ""
  34. for _, token := range tokens[cursor+2:] {
  35. if token.Type == tokenizer.Newline || token.Type == tokenizer.Space {
  36. return nil
  37. }
  38. if token.Type == tokenizer.RightParenthesis {
  39. matched = true
  40. break
  41. }
  42. url += token.Value
  43. }
  44. if !matched || url == "" {
  45. return nil
  46. }
  47. return &ImageParser{
  48. AltText: altText,
  49. URL: url,
  50. }
  51. }