| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- package parser
- import (
- "github.com/yuin/goldmark/ast"
- "github.com/yuin/goldmark/text"
- "github.com/yuin/goldmark/util"
- )
- 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 {
- line, segment := reader.PeekLine()
- if util.IsBlank(line) {
- 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) {
- lines := node.Lines()
- if lines.Len() != 0 {
- // trim leading spaces
- for i := 0; i < lines.Len(); i++ {
- l := lines.At(i)
- lines.Set(i, l.TrimLeftSpace(reader.Source()))
- }
- // 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
- }
|