diff --git a/tpl/template_funcs.go b/tpl/template_funcs.go index 55b7474a5..f495adf91 100644 --- a/tpl/template_funcs.go +++ b/tpl/template_funcs.go @@ -1132,15 +1132,14 @@ func returnWhenSet(a, k interface{}) interface{} { } // highlight returns an HTML string with syntax highlighting applied. -func highlight(in interface{}, lang, opts string) template.HTML { - var str string - av := reflect.ValueOf(in) - switch av.Kind() { - case reflect.String: - str = av.String() +func highlight(in interface{}, lang, opts string) (template.HTML, error) { + str, err := cast.ToStringE(in) + + if err != nil { + return "", err } - return template.HTML(helpers.Highlight(html.UnescapeString(str), lang, opts)) + return template.HTML(helpers.Highlight(html.UnescapeString(str), lang, opts)), nil } var markdownTrimPrefix = []byte("

") diff --git a/tpl/template_funcs_test.go b/tpl/template_funcs_test.go index 8d9eb9e79..3dbfe6204 100644 --- a/tpl/template_funcs_test.go +++ b/tpl/template_funcs_test.go @@ -25,6 +25,7 @@ import ( "path" "reflect" "runtime" + "strings" "testing" "time" ) @@ -1533,6 +1534,26 @@ func TestChomp(t *testing.T) { } } +func TestHighlight(t *testing.T) { + code := "func boo() {}" + highlighted, err := highlight(code, "go", "") + + if err != nil { + t.Fatal("Highlight returned error:", err) + } + + // this depends on a Pygments installation, but will always contain the function name. + if !strings.Contains(string(highlighted), "boo") { + t.Errorf("Highlight mismatch, got %v", highlighted) + } + + _, err = highlight(t, "go", "") + + if err == nil { + t.Error("Expected highlight error") + } +} + func TestInflect(t *testing.T) { for i, this := range []struct { inflectFunc func(i interface{}) (string, error)