Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/gohugoio/hugo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Brampton <bramp@google.com>2015-09-07 21:41:02 +0300
committerspf13 <steve.francia@gmail.com>2015-10-06 00:45:37 +0300
commitc2c694f136ab285a077eeac32948ae9474badf47 (patch)
tree86d86b76f0c1102146c3da2499a22f4fdb95ea1c /helpers
parent7ecf2a55c1c9ddddbde35e0b2f8825d7634ef6d3 (diff)
Add GitHub style code fence support to mmark
Fixes #1258.
Diffstat (limited to 'helpers')
-rw-r--r--helpers/content.go4
-rw-r--r--helpers/content_renderer.go17
-rw-r--r--helpers/content_renderer_test.go64
3 files changed, 84 insertions, 1 deletions
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>", "<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)
+ }
+ }
+}