italic.go 886 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. package parser
  2. import "github.com/usememos/memos/plugin/gomark/parser/tokenizer"
  3. type ItalicParser struct {
  4. ContentTokens []*tokenizer.Token
  5. }
  6. func NewItalicParser() *ItalicParser {
  7. return &ItalicParser{}
  8. }
  9. func (*ItalicParser) Match(tokens []*tokenizer.Token) *ItalicParser {
  10. if len(tokens) < 3 {
  11. return nil
  12. }
  13. prefixTokens := tokens[:1]
  14. if prefixTokens[0].Type != tokenizer.Star && prefixTokens[0].Type != tokenizer.Underline {
  15. return nil
  16. }
  17. prefixTokenType := prefixTokens[0].Type
  18. contentTokens := []*tokenizer.Token{}
  19. matched := false
  20. for _, token := range tokens[1:] {
  21. if token.Type == tokenizer.Newline {
  22. return nil
  23. }
  24. if token.Type == prefixTokenType {
  25. matched = true
  26. break
  27. }
  28. contentTokens = append(contentTokens, token)
  29. }
  30. if !matched || len(contentTokens) == 0 {
  31. return nil
  32. }
  33. return &ItalicParser{
  34. ContentTokens: contentTokens,
  35. }
  36. }