package renderer
import (
"strings"
"github.com/kovetskiy/mark/stdlib"
"github.com/yuin/goldmark/ast"
"github.com/yuin/goldmark/renderer"
"github.com/yuin/goldmark/renderer/html"
"github.com/yuin/goldmark/util"
)
type ConfluenceHTMLBlockRenderer struct {
html.Config
}
// NewConfluenceRenderer creates a new instance of the ConfluenceRenderer
func NewConfluenceHTMLBlockRenderer(stdlib *stdlib.Lib, opts ...html.Option) renderer.NodeRenderer {
return &ConfluenceHTMLBlockRenderer{
Config: html.NewConfig(),
}
}
// RegisterFuncs implements NodeRenderer.RegisterFuncs .
func (r *ConfluenceHTMLBlockRenderer) RegisterFuncs(reg renderer.NodeRendererFuncRegisterer) {
reg.Register(ast.KindHTMLBlock, r.renderHTMLBlock)
}
func (r *ConfluenceHTMLBlockRenderer) renderHTMLBlock(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) {
if !entering {
return r.goldmarkRenderHTMLBlock(w, source, node, entering)
}
n := node.(*ast.HTMLBlock)
l := n.Lines().Len()
for i := 0; i < l; i++ {
line := n.Lines().At(i)
switch strings.Trim(string(line.Value(source)), "\n") {
case "":
_, _ = w.WriteString("\n")
return ast.WalkContinue, nil
case "":
_, _ = w.WriteString("\n")
return ast.WalkContinue, nil
case "":
_, _ = w.WriteString("\n")
return ast.WalkContinue, nil
case "":
_, _ = w.WriteString("\n")
return ast.WalkContinue, nil
case "":
_, _ = w.WriteString("\n")
return ast.WalkContinue, nil
case "":
_, _ = w.WriteString("\n")
return ast.WalkContinue, nil
case "":
_, _ = w.WriteString("\n")
return ast.WalkContinue, nil
case "":
_, _ = w.WriteString("\n")
return ast.WalkContinue, nil
case "":
_, _ = w.WriteString("\n")
return ast.WalkContinue, nil
case "":
_, _ = w.WriteString("\n")
return ast.WalkContinue, nil
case "":
_, _ = w.WriteString("\n")
return ast.WalkContinue, nil
case "":
_, _ = w.WriteString("\n")
return ast.WalkContinue, nil
case "":
_, _ = w.WriteString("\n")
return ast.WalkContinue, nil
}
}
return r.goldmarkRenderHTMLBlock(w, source, node, entering)
}
func (r *ConfluenceHTMLBlockRenderer) goldmarkRenderHTMLBlock(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) {
n := node.(*ast.HTMLBlock)
if entering {
if r.Unsafe {
l := n.Lines().Len()
for i := 0; i < l; i++ {
line := n.Lines().At(i)
r.Writer.SecureWrite(w, line.Value(source))
}
} else {
_, _ = w.WriteString("\n")
}
} else {
if n.HasClosure() {
if r.Unsafe {
closure := n.ClosureLine
r.Writer.SecureWrite(w, closure.Value(source))
} else {
_, _ = w.WriteString("\n")
}
}
}
return ast.WalkContinue, nil
}