1package parser
2
3import (
4	"github.com/yuin/goldmark/ast"
5	"github.com/yuin/goldmark/text"
6)
7
8type paragraphParser struct {
9}
10
11var defaultParagraphParser = &paragraphParser{}
12
13// NewParagraphParser returns a new BlockParser that
14// parses paragraphs.
15func NewParagraphParser() BlockParser {
16	return defaultParagraphParser
17}
18
19func (b *paragraphParser) Trigger() []byte {
20	return nil
21}
22
23func (b *paragraphParser) Open(parent ast.Node, reader text.Reader, pc Context) (ast.Node, State) {
24	_, segment := reader.PeekLine()
25	segment = segment.TrimLeftSpace(reader.Source())
26	if segment.IsEmpty() {
27		return nil, NoChildren
28	}
29	node := ast.NewParagraph()
30	node.Lines().Append(segment)
31	reader.Advance(segment.Len() - 1)
32	return node, NoChildren
33}
34
35func (b *paragraphParser) Continue(node ast.Node, reader text.Reader, pc Context) State {
36	_, segment := reader.PeekLine()
37	segment = segment.TrimLeftSpace(reader.Source())
38	if segment.IsEmpty() {
39		return Close
40	}
41	node.Lines().Append(segment)
42	reader.Advance(segment.Len() - 1)
43	return Continue | NoChildren
44}
45
46func (b *paragraphParser) Close(node ast.Node, reader text.Reader, pc Context) {
47	parent := node.Parent()
48	if parent == nil {
49		// paragraph has been transformed
50		return
51	}
52	lines := node.Lines()
53	if lines.Len() != 0 {
54		// trim trailing spaces
55		length := lines.Len()
56		lastLine := node.Lines().At(length - 1)
57		node.Lines().Set(length-1, lastLine.TrimRightSpace(reader.Source()))
58	}
59	if lines.Len() == 0 {
60		node.Parent().RemoveChild(node.Parent(), node)
61		return
62	}
63}
64
65func (b *paragraphParser) CanInterruptParagraph() bool {
66	return false
67}
68
69func (b *paragraphParser) CanAcceptIndentedLine() bool {
70	return false
71}
72