package parser import ( "github.com/yuin/goldmark/ast" "github.com/yuin/goldmark/text" ) type paragraphParser struct { } var defaultParagraphParser = ¶graphParser{} // NewParagraphParser returns a new BlockParser that // parses paragraphs. func NewParagraphParser() BlockParser { return defaultParagraphParser } func (b *paragraphParser) Trigger() []byte { return nil } func (b *paragraphParser) Open(parent ast.Node, reader text.Reader, pc Context) (ast.Node, State) { _, segment := reader.PeekLine() segment = segment.TrimLeftSpace(reader.Source()) if segment.IsEmpty() { return nil, NoChildren } node := ast.NewParagraph() node.Lines().Append(segment) reader.Advance(segment.Len() - 1) return node, NoChildren } func (b *paragraphParser) Continue(node ast.Node, reader text.Reader, pc Context) State { _, segment := reader.PeekLine() segment = segment.TrimLeftSpace(reader.Source()) if segment.IsEmpty() { return Close } node.Lines().Append(segment) reader.Advance(segment.Len() - 1) return Continue | NoChildren } func (b *paragraphParser) Close(node ast.Node, reader text.Reader, pc Context) { parent := node.Parent() if parent == nil { // paragraph has been transformed return } lines := node.Lines() if lines.Len() != 0 { // trim trailing spaces length := lines.Len() lastLine := node.Lines().At(length - 1) node.Lines().Set(length-1, lastLine.TrimRightSpace(reader.Source())) } if lines.Len() == 0 { node.Parent().RemoveChild(node.Parent(), node) return } } func (b *paragraphParser) CanInterruptParagraph() bool { return false } func (b *paragraphParser) CanAcceptIndentedLine() bool { return false }