URI: 
       Add GitHub style code fence support to mmark - hugo - [fork] hugo port for 9front
  HTML git clone git@git.drkhsh.at/hugo.git
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
   DIR README
   DIR LICENSE
       ---
   DIR commit c2c694f136ab285a077eeac32948ae9474badf47
   DIR parent 7ecf2a55c1c9ddddbde35e0b2f8825d7634ef6d3
  HTML Author: Andrew Brampton <bramp@google.com>
       Date:   Mon,  7 Sep 2015 11:41:02 -0700
       
       Add GitHub style code fence support to mmark
       
       Fixes #1258.
       
       Diffstat:
         M helpers/content.go                  |       4 +++-
         M helpers/content_renderer.go         |      17 +++++++++++++++++
         A helpers/content_renderer_test.go    |      64 +++++++++++++++++++++++++++++++
       
       3 files changed, 84 insertions(+), 1 deletion(-)
       ---
   DIR diff --git 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 {
   DIR diff --git 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)
       +        }
       +}
   DIR diff --git a/helpers/content_renderer_test.go 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>", "<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)
       +                }
       +        }
       +}