49 lines
1.0 KiB
Go
49 lines
1.0 KiB
Go
package parsing
|
|
|
|
import (
|
|
"io"
|
|
"regexp"
|
|
|
|
"github.com/yuin/goldmark/ast"
|
|
"github.com/yuin/goldmark/renderer"
|
|
)
|
|
|
|
type plaintextRenderer struct{}
|
|
|
|
var _ renderer.Renderer = plaintextRenderer{}
|
|
|
|
var backslashRegex = regexp.MustCompile("\\\\(?P<char>[\\\\\\x60!\"#$%&'()*+,-./:;<=>?@\\[\\]^_{|}~])")
|
|
|
|
func (r plaintextRenderer) Render(w io.Writer, source []byte, n ast.Node) error {
|
|
return ast.Walk(n, func(n ast.Node, entering bool) (ast.WalkStatus, error) {
|
|
if !entering {
|
|
return ast.WalkContinue, nil
|
|
}
|
|
|
|
switch n.Kind() {
|
|
case ast.KindText:
|
|
n := n.(*ast.Text)
|
|
_, err := w.Write(backslashRegex.ReplaceAll(n.Text(source), []byte("$1")))
|
|
if err != nil {
|
|
return ast.WalkContinue, err
|
|
}
|
|
|
|
if n.SoftLineBreak() {
|
|
_, err := w.Write([]byte(" "))
|
|
if err != nil {
|
|
return ast.WalkContinue, err
|
|
}
|
|
}
|
|
case ast.KindParagraph:
|
|
_, err := w.Write([]byte(" "))
|
|
if err != nil {
|
|
return ast.WalkContinue, err
|
|
}
|
|
}
|
|
|
|
return ast.WalkContinue, nil
|
|
})
|
|
}
|
|
|
|
func (r plaintextRenderer) AddOptions(...renderer.Option) {}
|