mark/renderer/paragraph.go
Manuel Rüger 594c1e4fa0 fix: guard FirstChild() nil in paragraph renderer
A paragraph node with no children causes FirstChild() to return nil,
making both the entering and leaving Kind() checks panic. Cache the
result once and treat nil the same as a non-RawHTML child (emit <p>).

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
2026-03-16 19:18:29 +01:00

46 lines
1.3 KiB
Go

package renderer
import (
"github.com/yuin/goldmark/ast"
"github.com/yuin/goldmark/renderer"
"github.com/yuin/goldmark/renderer/html"
"github.com/yuin/goldmark/util"
)
type ConfluenceParagraphRenderer struct {
html.Config
}
// NewConfluenceRenderer creates a new instance of the ConfluenceRenderer
func NewConfluenceParagraphRenderer(opts ...html.Option) renderer.NodeRenderer {
return &ConfluenceParagraphRenderer{
Config: html.NewConfig(),
}
}
// RegisterFuncs implements NodeRenderer.RegisterFuncs .
func (r *ConfluenceParagraphRenderer) RegisterFuncs(reg renderer.NodeRendererFuncRegisterer) {
reg.Register(ast.KindParagraph, r.renderParagraph)
}
func (r *ConfluenceParagraphRenderer) renderParagraph(w util.BufWriter, source []byte, n ast.Node, entering bool) (ast.WalkStatus, error) {
firstChild := n.FirstChild()
if entering {
if firstChild == nil || firstChild.Kind() != ast.KindRawHTML {
if n.Attributes() != nil {
_, _ = w.WriteString("<p")
html.RenderAttributes(w, n, html.ParagraphAttributeFilter)
_ = w.WriteByte('>')
} else {
_, _ = w.WriteString("<p>")
}
}
} else {
if firstChild == nil || firstChild.Kind() != ast.KindRawHTML {
_, _ = w.WriteString("</p>")
}
_, _ = w.WriteString("\n")
}
return ast.WalkContinue, nil
}