Add GitHub style code fence support to mmark
authorAndrew Brampton <bramp@google.com>
Mon, 7 Sep 2015 18:41:02 +0000 (11:41 -0700)
committerspf13 <steve.francia@gmail.com>
Mon, 5 Oct 2015 21:45:37 +0000 (17:45 -0400)
Fixes #1258.

helpers/content.go
helpers/content_renderer.go
helpers/content_renderer_test.go [new file with mode: 0644]

index 6bb7ed4d36ccfafd08b389f0703712f6f972bc9d..8c5c9cc7b2ebb0cbd7bb267231ed7d33775b16a6 100644 (file)
@@ -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 {
index bb5b810aeb586b8845a1584b3dcc0327458aeb22..77db6833c7726c648063e71980a36ed151e6aa1d 100644 (file)
@@ -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 (file)
index 0000000..1f520fd
--- /dev/null
@@ -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>", "<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)
+               }
+       }
+}