| 54 | } |
| 55 | |
| 56 | func (p *CodeBlockParser) Parse(tokens []*tokenizer.Token) (ast.Node, error) { |
| 57 | size, ok := p.Match(tokens) |
| 58 | if size == 0 || !ok { |
| 59 | return nil, errors.New("not matched") |
| 60 | } |
| 61 | |
| 62 | languageToken := tokens[3] |
| 63 | contentStart, contentEnd := 5, size-4 |
| 64 | if languageToken.Type == tokenizer.Newline { |
| 65 | languageToken = nil |
| 66 | contentStart = 4 |
| 67 | } |
| 68 | if tokens[size-1].Type == tokenizer.Newline { |
| 69 | contentEnd = size - 5 |
| 70 | } |
| 71 | |
| 72 | codeBlock := &ast.CodeBlock{ |
| 73 | Content: tokenizer.Stringify(tokens[contentStart:contentEnd]), |
| 74 | } |
| 75 | if languageToken != nil { |
| 76 | codeBlock.Language = languageToken.String() |
| 77 | } |
| 78 | return codeBlock, nil |
| 79 | } |