shithub: hugo

Download patch

ref: c2c694f136ab285a077eeac32948ae9474badf47
parent: 7ecf2a55c1c9ddddbde35e0b2f8825d7634ef6d3
author: Andrew Brampton <[email protected]>
date: Mon Sep 7 07:41:02 EDT 2015

Add GitHub style code fence support to mmark

Fixes #1258.

--- a/helpers/content.go
+++ b/helpers/content.go
@@ -227,7 +227,9 @@
 	htmlFlags := defaultFlags
 	htmlFlags |= mmark.HTML_FOOTNOTE_RETURN_LINKS
 
-	return mmark.HtmlRendererWithParameters(htmlFlags, "", "", renderParameters)
+	return &HugoMmarkHtmlRenderer{
+		mmark.HtmlRendererWithParameters(htmlFlags, "", "", renderParameters),
+	}
 }
 
 func GetMmarkExtensions(ctx *RenderingContext) int {
--- a/helpers/content_renderer.go
+++ b/helpers/content_renderer.go
@@ -6,9 +6,11 @@
 
 	"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
 }
@@ -19,5 +21,20 @@
 		out.WriteString(Highlight(str, lang, ""))
 	} else {
 		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)
 	}
 }
--- /dev/null
+++ b/helpers/content_renderer_test.go
@@ -1,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>", "<div class=\"highlight\"><pre><span class=\"nt\">&lt;html&gt;&lt;/html&gt;</span>\n</pre></div>\n"},
+		{false, "<html></html>", "<pre><code class=\"language-html\">&lt;html&gt;&lt;/html&gt;</code></pre>\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)
+		}
+	}
+}