136 lines
3.4 KiB
Go
136 lines
3.4 KiB
Go
|
package void
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"fmt"
|
||
|
|
||
|
"github.com/yuin/goldmark/ast"
|
||
|
goldrender "github.com/yuin/goldmark/renderer"
|
||
|
"github.com/yuin/goldmark/renderer/html"
|
||
|
"github.com/yuin/goldmark/util"
|
||
|
)
|
||
|
|
||
|
type VoidRenderer struct {
|
||
|
Writer html.Writer
|
||
|
errs []error
|
||
|
}
|
||
|
|
||
|
func NewVoidRenderer() *VoidRenderer {
|
||
|
return &VoidRenderer{
|
||
|
Writer: html.DefaultWriter,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// RegisterFuncs implements NodeRenderer.RegisterFuncs .
|
||
|
func (r *VoidRenderer) RegisterFuncs(reg goldrender.NodeRendererFuncRegisterer) {
|
||
|
reg.Register(ast.KindParagraph, r.renderParagraph)
|
||
|
reg.Register(ast.KindAutoLink, r.renderAutoLink)
|
||
|
reg.Register(ast.KindCodeSpan, r.renderCodeSpan)
|
||
|
reg.Register(ast.KindRawHTML, r.renderRawHTML)
|
||
|
reg.Register(ast.KindImage, r.renderImage)
|
||
|
reg.Register(ast.KindText, r.renderText)
|
||
|
reg.Register(ast.KindString, r.renderString)
|
||
|
}
|
||
|
|
||
|
func (r *VoidRenderer) Errors() []error {
|
||
|
return r.errs
|
||
|
}
|
||
|
|
||
|
func (r *VoidRenderer) renderParagraph(w util.BufWriter, source []byte, n ast.Node, entering bool) (ast.WalkStatus, error) {
|
||
|
_, _ = w.WriteString("\n")
|
||
|
return ast.WalkContinue, nil
|
||
|
}
|
||
|
|
||
|
func (r *VoidRenderer) renderAutoLink(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) {
|
||
|
if !entering {
|
||
|
return ast.WalkContinue, nil
|
||
|
}
|
||
|
|
||
|
_, _ = w.WriteString(`lien hypertexte`)
|
||
|
return ast.WalkContinue, nil
|
||
|
}
|
||
|
|
||
|
func (r *VoidRenderer) renderCodeSpan(w util.BufWriter, source []byte, n ast.Node, entering bool) (ast.WalkStatus, error) {
|
||
|
if !entering {
|
||
|
return ast.WalkContinue, nil
|
||
|
}
|
||
|
|
||
|
_, _ = w.WriteString(`code remplacé`)
|
||
|
return ast.WalkSkipChildren, nil
|
||
|
}
|
||
|
|
||
|
func (r *VoidRenderer) renderRawHTML(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) {
|
||
|
if !entering {
|
||
|
return ast.WalkContinue, nil
|
||
|
}
|
||
|
|
||
|
_, _ = w.WriteString(`bloc HTML remplacé`)
|
||
|
return ast.WalkSkipChildren, nil
|
||
|
}
|
||
|
|
||
|
func (r *VoidRenderer) renderImage(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) {
|
||
|
if !entering {
|
||
|
_, _ = w.WriteString(`.`)
|
||
|
return ast.WalkContinue, nil
|
||
|
}
|
||
|
n := node.(*ast.Image)
|
||
|
|
||
|
// Check there is a correct image alt
|
||
|
alt := nodeToText(n, source)
|
||
|
if len(bytes.Fields(alt)) <= 1 {
|
||
|
r.errs = append(r.errs, fmt.Errorf("No valid image alternative defined for %q", n.Destination))
|
||
|
return ast.WalkContinue, nil
|
||
|
}
|
||
|
|
||
|
return ast.WalkContinue, nil
|
||
|
}
|
||
|
|
||
|
func nodeToText(n ast.Node, source []byte) []byte {
|
||
|
var buf bytes.Buffer
|
||
|
for c := n.FirstChild(); c != nil; c = c.NextSibling() {
|
||
|
if s, ok := c.(*ast.String); ok && s.IsCode() {
|
||
|
buf.Write(s.Text(source))
|
||
|
} else if !c.HasChildren() {
|
||
|
buf.Write(util.EscapeHTML(c.Text(source)))
|
||
|
} else {
|
||
|
buf.Write(nodeToText(c, source))
|
||
|
}
|
||
|
}
|
||
|
return buf.Bytes()
|
||
|
}
|
||
|
|
||
|
func (r *VoidRenderer) renderText(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) {
|
||
|
if !entering {
|
||
|
return ast.WalkContinue, nil
|
||
|
}
|
||
|
|
||
|
n := node.(*ast.Text)
|
||
|
segment := n.Segment
|
||
|
if n.IsRaw() {
|
||
|
r.Writer.RawWrite(w, segment.Value(source))
|
||
|
} else {
|
||
|
r.Writer.Write(w, segment.Value(source))
|
||
|
r.Writer.Write(w, []byte(" "))
|
||
|
}
|
||
|
return ast.WalkContinue, nil
|
||
|
}
|
||
|
|
||
|
func (r *VoidRenderer) renderString(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) {
|
||
|
if !entering {
|
||
|
return ast.WalkContinue, nil
|
||
|
}
|
||
|
|
||
|
n := node.(*ast.String)
|
||
|
if n.IsCode() {
|
||
|
_, _ = w.Write(n.Value)
|
||
|
} else {
|
||
|
if n.IsRaw() {
|
||
|
r.Writer.RawWrite(w, n.Value)
|
||
|
} else {
|
||
|
r.Writer.Write(w, n.Value)
|
||
|
r.Writer.Write(w, []byte("\n"))
|
||
|
}
|
||
|
}
|
||
|
return ast.WalkContinue, nil
|
||
|
}
|