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 }