paragraph.go 1.7 KB

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