1package parser
2
3import (
4 "github.com/yuin/goldmark/ast"
5 "github.com/yuin/goldmark/text"
6 "github.com/yuin/goldmark/util"
7)
8
9type blockquoteParser struct {
10}
11
12var defaultBlockquoteParser = &blockquoteParser{}
13
14// NewBlockquoteParser returns a new BlockParser that
15// parses blockquotes.
16func NewBlockquoteParser() BlockParser {
17 return defaultBlockquoteParser
18}
19
20func (b *blockquoteParser) process(reader text.Reader) bool {
21 line, _ := reader.PeekLine()
22 w, pos := util.IndentWidth(line, reader.LineOffset())
23 if w > 3 || pos >= len(line) || line[pos] != '>' {
24 return false
25 }
26 pos++
27 if pos >= len(line) || line[pos] == '\n' {
28 reader.Advance(pos)
29 return true
30 }
31 if line[pos] == ' ' || line[pos] == '\t' {
32 pos++
33 }
34 reader.Advance(pos)
35 if line[pos-1] == '\t' {
36 reader.SetPadding(2)
37 }
38 return true
39}
40
41func (b *blockquoteParser) Trigger() []byte {
42 return []byte{'>'}
43}
44
45func (b *blockquoteParser) Open(parent ast.Node, reader text.Reader, pc Context) (ast.Node, State) {
46 if b.process(reader) {
47 return ast.NewBlockquote(), HasChildren
48 }
49 return nil, NoChildren
50}
51
52func (b *blockquoteParser) Continue(node ast.Node, reader text.Reader, pc Context) State {
53 if b.process(reader) {
54 return Continue | HasChildren
55 }
56 return Close
57}
58
59func (b *blockquoteParser) Close(node ast.Node, reader text.Reader, pc Context) {
60 // nothing to do
61}
62
63func (b *blockquoteParser) CanInterruptParagraph() bool {
64 return true
65}
66
67func (b *blockquoteParser) CanAcceptIndentedLine() bool {
68 return false
69}