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 = ¶graphParser{} 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