diff --git a/helpers/content.go b/helpers/content.go index 6bb7ed4d3..8c5c9cc7b 100644 --- a/helpers/content.go +++ b/helpers/content.go @@ -227,7 +227,9 @@ func GetMmarkHtmlRenderer(defaultFlags int, ctx *RenderingContext) mmark.Rendere htmlFlags := defaultFlags htmlFlags |= mmark.HTML_FOOTNOTE_RETURN_LINKS - return mmark.HtmlRendererWithParameters(htmlFlags, "", "", renderParameters) + return &HugoMmarkHtmlRenderer{ + mmark.HtmlRendererWithParameters(htmlFlags, "", "", renderParameters), + } } func GetMmarkExtensions(ctx *RenderingContext) int { diff --git a/helpers/content_renderer.go b/helpers/content_renderer.go index bb5b810ae..77db6833c 100644 --- a/helpers/content_renderer.go +++ b/helpers/content_renderer.go @@ -6,9 +6,11 @@ import ( "github.com/russross/blackfriday" "github.com/spf13/viper" + "github.com/miekg/mmark" ) // Wraps a blackfriday.Renderer, typically a blackfriday.Html +// Enabling Hugo to customise the rendering experience type HugoHtmlRenderer struct { blackfriday.Renderer } @@ -21,3 +23,18 @@ func (renderer *HugoHtmlRenderer) BlockCode(out *bytes.Buffer, text []byte, lang renderer.Renderer.BlockCode(out, text, lang) } } + +// Wraps a mmark.Renderer, typically a mmark.html +// Enabling Hugo to customise the rendering experience +type HugoMmarkHtmlRenderer struct { + mmark.Renderer +} + +func (renderer *HugoMmarkHtmlRenderer) BlockCode(out *bytes.Buffer, text []byte, lang string, caption []byte, subfigure bool, callouts bool) { + if viper.GetBool("PygmentsCodeFences") { + str := html.UnescapeString(string(text)) + out.WriteString(Highlight(str, lang, "")) + } else { + renderer.Renderer.BlockCode(out, text, lang, caption, subfigure, callouts) + } +} diff --git a/helpers/content_renderer_test.go b/helpers/content_renderer_test.go new file mode 100644 index 000000000..1f520fd0e --- /dev/null +++ b/helpers/content_renderer_test.go @@ -0,0 +1,64 @@ +package helpers +import ( + "testing" + "github.com/spf13/viper" + "bytes" +) + +// Renders a codeblock using Blackfriday +func render(input string) string { + ctx := &RenderingContext{}; + render := GetHTMLRenderer(0, ctx); + + buf := &bytes.Buffer{} + render.BlockCode(buf, []byte(input), "html") + return buf.String() +} + +// Renders a codeblock using Mmark +func renderWithMmark(input string) string { + ctx := &RenderingContext{}; + render := GetMmarkHtmlRenderer(0, ctx); + + buf := &bytes.Buffer{} + render.BlockCode(buf, []byte(input), "html", []byte(""), false, false) + return buf.String() +} + + +func TestCodeFence(t *testing.T) { + + if !HasPygments() { + t.Skip("Skipping Pygments test as Pygments is not installed or available.") + return + } + + type test struct { + enabled bool + input, expected string + } + data := []test{ + {true, "", "
<html></html>\n
\n"}, + {false, "", "
<html></html>
\n"}, + } + + viper.Reset() + defer viper.Reset() + + viper.Set("PygmentsStyle", "monokai") + viper.Set("PygmentsUseClasses", true) + + for i, d := range data { + viper.Set("PygmentsCodeFences", d.enabled) + + result := render(d.input) + if result != d.expected { + t.Errorf("Test %d failed. BlackFriday enabled:%t, Expected:\n%q got:\n%q", i, d.enabled, d.expected, result) + } + + result = renderWithMmark(d.input) + if result != d.expected { + t.Errorf("Test %d failed. Mmark enabled:%t, Expected:\n%q got:\n%q", i, d.enabled, d.expected, result) + } + } +}