Платформа ЦРНП "Мирокод" для разработки проектов
https://git.mirocod.ru
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
71 lines
1.6 KiB
71 lines
1.6 KiB
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 |
|
}
|
|
|