shithub: hugo

Download patch

ref: 3c568ad0139c79e5c0596ca40637512d71401afc
parent: 54bdcaacaedec178554e696f34647801bbe61362
author: satotake <[email protected]>
date: Mon Feb 17 17:59:26 EST 2020

markup/highlight: Fix chroma highlight

* Use chroma.Coalesce
* Escape code strings if lexer is nil

Fixes #6877
Fixes #6856

--- a/markup/highlight/highlight.go
+++ b/markup/highlight/highlight.go
@@ -15,6 +15,7 @@
 
 import (
 	"fmt"
+	gohtml "html"
 	"io"
 	"strings"
 
@@ -63,7 +64,7 @@
 	if lexer == nil {
 		wrapper := getPreWrapper(lang)
 		fmt.Fprint(w, wrapper.Start(true, ""))
-		fmt.Fprint(w, code)
+		fmt.Fprint(w, gohtml.EscapeString(code))
 		fmt.Fprint(w, wrapper.End(true))
 		return w.String(), nil
 	}
@@ -72,6 +73,7 @@
 	if style == nil {
 		style = styles.Fallback
 	}
+	lexer = chroma.Coalesce(lexer)
 
 	iterator, err := lexer.Tokenise(nil, code)
 	if err != nil {
--- a/markup/highlight/highlight_test.go
+++ b/markup/highlight/highlight_test.go
@@ -29,7 +29,14 @@
 LINE4
 LINE5
 `
+	coalesceNeeded := `GET /foo HTTP/1.1
+Content-Type: application/json
+User-Agent: foo
 
+{
+  "hello": "world"
+}`
+
 	c.Run("Basic", func(c *qt.C) {
 		cfg := DefaultConfig
 		cfg.NoClasses = false
@@ -38,7 +45,7 @@
 		result, _ := h.Highlight(`echo "Hugo Rocks!"`, "bash", "")
 		c.Assert(result, qt.Equals, `<div class="highlight"><pre class="chroma"><code class="language-bash" data-lang="bash"><span class="nb">echo</span> <span class="s2">&#34;Hugo Rocks!&#34;</span></code></pre></div>`)
 		result, _ = h.Highlight(`echo "Hugo Rocks!"`, "unknown", "")
-		c.Assert(result, qt.Equals, `<pre><code class="language-unknown" data-lang="unknown">echo "Hugo Rocks!"</code></pre>`)
+		c.Assert(result, qt.Equals, `<pre><code class="language-unknown" data-lang="unknown">echo &#34;Hugo Rocks!&#34;</code></pre>`)
 
 	})
 
@@ -106,4 +113,24 @@
 		result, _ := h.Highlight(lines, "", "")
 		c.Assert(result, qt.Contains, "<span class=\"ln\">2</span>LINE2\n<")
 	})
+
+	c.Run("No language, Escape HTML string", func(c *qt.C) {
+		cfg := DefaultConfig
+		cfg.NoClasses = false
+		h := New(cfg)
+
+		result, _ := h.Highlight("Escaping less-than in code block? <fail>", "", "")
+		c.Assert(result, qt.Contains, "&lt;fail&gt;")
+	})
+
+	c.Run("Highlight lines, default config", func(c *qt.C) {
+		cfg := DefaultConfig
+		cfg.NoClasses = false
+		h := New(cfg)
+
+		result, _ := h.Highlight(coalesceNeeded, "http", "linenos=true,hl_lines=2")
+		c.Assert(result, qt.Contains, "hello")
+		c.Assert(result, qt.Contains, "}")
+	})
+
 }