mirror of
https://github.com/yuin/goldmark
synced 2025-03-04 23:04:52 +00:00
renderer: Helpful panic for unknown NodeKind
When rendering a Node, Renderer looks up the NodeRenderer for that
node's kind in a slice. That will panic with an "index out of range"
error if a node renderer for that node kind has not been registered.
panic: runtime error: index out of range [1] with length 1
This changes Renderer to panic with a more helpful error message if the
node kind is unrecognized.
panic: unrecognized node kind Document cannot be rendered:
register a renderer for this node kind first
This commit is contained in:
parent
21437947a3
commit
120b8c7c14
2 changed files with 44 additions and 1 deletions
|
|
@ -3,6 +3,7 @@ package renderer
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"bufio"
|
"bufio"
|
||||||
|
"fmt"
|
||||||
"io"
|
"io"
|
||||||
"sync"
|
"sync"
|
||||||
|
|
||||||
|
|
@ -161,7 +162,14 @@ func (r *renderer) Render(w io.Writer, source []byte, n ast.Node) error {
|
||||||
err := ast.Walk(n, func(n ast.Node, entering bool) (ast.WalkStatus, error) {
|
err := ast.Walk(n, func(n ast.Node, entering bool) (ast.WalkStatus, error) {
|
||||||
s := ast.WalkStatus(ast.WalkContinue)
|
s := ast.WalkStatus(ast.WalkContinue)
|
||||||
var err error
|
var err error
|
||||||
f := r.nodeRendererFuncs[n.Kind()]
|
|
||||||
|
k := n.Kind()
|
||||||
|
if int(k) >= len(r.nodeRendererFuncs) {
|
||||||
|
panic(fmt.Sprintf("unrecognized node kind %v cannot be rendered: "+
|
||||||
|
"register a renderer for this node kind first", k))
|
||||||
|
}
|
||||||
|
|
||||||
|
f := r.nodeRendererFuncs[k]
|
||||||
if f != nil {
|
if f != nil {
|
||||||
s, err = f(writer, source, n, entering)
|
s, err = f(writer, source, n, entering)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
35
renderer/renderer_test.go
Normal file
35
renderer/renderer_test.go
Normal file
|
|
@ -0,0 +1,35 @@
|
||||||
|
package renderer
|
||||||
|
|
||||||
|
import (
|
||||||
|
"io/ioutil"
|
||||||
|
"strings"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/yuin/goldmark/parser"
|
||||||
|
"github.com/yuin/goldmark/text"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestRenderUnknownNode(t *testing.T) {
|
||||||
|
defer func() {
|
||||||
|
r := recover()
|
||||||
|
if r == nil {
|
||||||
|
t.Errorf("Render() should panic")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
msg, ok := r.(string)
|
||||||
|
if !ok {
|
||||||
|
t.Errorf("Render() should panic with a string")
|
||||||
|
}
|
||||||
|
|
||||||
|
if !strings.Contains(msg, "unrecognized node kind Document") {
|
||||||
|
t.Errorf("Render() panicked with unexpected message: %v", msg)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
src := []byte("# Foo\n\nHello world")
|
||||||
|
node := parser.NewParser().Parse(text.NewReader(src))
|
||||||
|
|
||||||
|
r := NewRenderer()
|
||||||
|
r.Render(ioutil.Discard, src, node)
|
||||||
|
}
|
||||||
Loading…
Reference in a new issue