12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152 |
- package parser
- import "github.com/usememos/memos/plugin/gomark/parser/tokenizer"
- type CodeBlockParser struct {
- Language string
- Content string
- }
- func NewCodeBlockParser() *CodeBlockParser {
- return &CodeBlockParser{}
- }
- func (*CodeBlockParser) Match(tokens []*tokenizer.Token) *CodeBlockParser {
- if len(tokens) < 9 {
- return nil
- }
- if tokens[0].Type != tokenizer.Backtick || tokens[1].Type != tokenizer.Backtick || tokens[2].Type != tokenizer.Backtick {
- return nil
- }
- if tokens[3].Type != tokenizer.Newline && tokens[4].Type != tokenizer.Newline {
- return nil
- }
- cursor, language := 4, ""
- if tokens[3].Type != tokenizer.Newline {
- language = tokens[3].Value
- cursor = 5
- }
- content, matched := "", false
- for ; cursor < len(tokens)-3; cursor++ {
- if tokens[cursor].Type == tokenizer.Newline && tokens[cursor+1].Type == tokenizer.Backtick && tokens[cursor+2].Type == tokenizer.Backtick && tokens[cursor+3].Type == tokenizer.Backtick {
- if cursor+3 == len(tokens)-1 {
- matched = true
- break
- } else if tokens[cursor+4].Type == tokenizer.Newline {
- matched = true
- break
- }
- }
- content += tokens[cursor].Value
- }
- if !matched {
- return nil
- }
- return &CodeBlockParser{
- Language: language,
- Content: content,
- }
- }
|