hugo

Unnamed repository; edit this file 'description' to name the repository.

git clone git://git.shimmy1996.com/hugo.git
commit 7a15edafe240471c072d3548b72ccda0271ffd8f
parent 2f0945bafe501103abe97b2f2b5566b28ec48e52
Author: Helder Pereira <helfper@gmail.com>
Date:   Sun, 22 Aug 2021 15:03:20 +0100

highlight: Add tabindex when code is not highlighted

Diffstat:
Mmarkup/goldmark/convert.go | 71+++++++++++++++++++++++++++++++++++++----------------------------------
Mmarkup/goldmark/convert_test.go | 6+++---
Mmarkup/highlight/highlight.go | 16+++++++++++-----
3 files changed, 51 insertions(+), 42 deletions(-)
diff --git a/markup/goldmark/convert.go b/markup/goldmark/convert.go
@@ -310,49 +310,52 @@ func newHighlighting(cfg highlight.Config) goldmark.Extender {
 		),
 
 		hl.WithWrapperRenderer(func(w util.BufWriter, ctx hl.CodeBlockContext, entering bool) {
-			l, hasLang := ctx.Language()
 			var language string
-			if hasLang {
+			if l, hasLang := ctx.Language(); hasLang {
 				language = string(l)
 			}
 
-			if entering {
-				if !ctx.Highlighted() {
-					w.WriteString(`<pre>`)
-					highlight.WriteCodeTag(w, language)
-					return
+			if ctx.Highlighted() {
+				if entering {
+					writeDivStart(w, ctx)
+				} else {
+					writeDivEnd(w)
 				}
-
-				w.WriteString(`<div class="highlight`)
-
-				var attributes []ast.Attribute
-				if ctx.Attributes() != nil {
-					attributes = ctx.Attributes().All()
+			} else {
+				if entering {
+					highlight.WritePreStart(w, language, "")
+				} else {
+					highlight.WritePreEnd(w)
 				}
+			}
+		}),
+	)
+}
 
-				if attributes != nil {
-					class, found := ctx.Attributes().GetString("class")
-					if found {
-						w.WriteString(" ")
-						w.Write(util.EscapeHTML(class.([]byte)))
+func writeDivStart(w util.BufWriter, ctx hl.CodeBlockContext) {
+	w.WriteString(`<div class="highlight`)
 
-					}
-					_, _ = w.WriteString("\"")
-					renderAttributes(w, true, attributes...)
-				} else {
-					_, _ = w.WriteString("\"")
-				}
+	var attributes []ast.Attribute
+	if ctx.Attributes() != nil {
+		attributes = ctx.Attributes().All()
+	}
 
-				w.WriteString(">")
-				return
-			}
+	if attributes != nil {
+		class, found := ctx.Attributes().GetString("class")
+		if found {
+			w.WriteString(" ")
+			w.Write(util.EscapeHTML(class.([]byte)))
 
-			if !ctx.Highlighted() {
-				w.WriteString(`</code></pre>`)
-				return
-			}
+		}
+		_, _ = w.WriteString("\"")
+		renderAttributes(w, true, attributes...)
+	} else {
+		_, _ = w.WriteString("\"")
+	}
 
-			w.WriteString("</div>")
-		}),
-	)
+	w.WriteString(">")
+}
+
+func writeDivEnd(w util.BufWriter) {
+	w.WriteString("</div>")
 }
diff --git a/markup/goldmark/convert_test.go b/markup/goldmark/convert_test.go
@@ -155,7 +155,7 @@ description
 
 	// Code fences
 	c.Assert(got, qt.Contains, "<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-bash\" data-lang=\"bash\">LINE1\n</code></pre></div>")
-	c.Assert(got, qt.Contains, "Code Fences No Lexer</h2>\n<pre><code class=\"language-moo\" data-lang=\"moo\">LINE1\n</code></pre>")
+	c.Assert(got, qt.Contains, "Code Fences No Lexer</h2>\n<pre tabindex=\"0\"><code class=\"language-moo\" data-lang=\"moo\">LINE1\n</code></pre>")
 
 	// Extensions
 	c.Assert(got, qt.Contains, `Autolink: <a href="https://gohugo.io/">https://gohugo.io/</a>`)
@@ -392,7 +392,7 @@ LINE5
 		c.Assert(result, qt.Equals, `<div class="highlight"><pre tabindex="0" 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 = convertForConfig(c, cfg, `echo "Hugo Rocks!"`, "unknown")
-		c.Assert(result, qt.Equals, "<pre><code class=\"language-unknown\" data-lang=\"unknown\">echo &quot;Hugo Rocks!&quot;\n</code></pre>")
+		c.Assert(result, qt.Equals, "<pre tabindex=\"0\"><code class=\"language-unknown\" data-lang=\"unknown\">echo &quot;Hugo Rocks!&quot;\n</code></pre>")
 	})
 
 	c.Run("Highlight lines, default config", func(c *qt.C) {
@@ -443,7 +443,7 @@ LINE5
 		cfg.LineNumbersInTable = false
 
 		result := convertForConfig(c, cfg, lines, "")
-		c.Assert(result, qt.Contains, "<pre><code>LINE1\n")
+		c.Assert(result, qt.Contains, "<pre tabindex=\"0\"><code>LINE1\n")
 	})
 
 	c.Run("No language, guess syntax", func(c *qt.C) {
diff --git a/markup/highlight/highlight.go b/markup/highlight/highlight.go
@@ -122,17 +122,17 @@ type preWrapper struct {
 }
 
 func (p preWrapper) Start(code bool, styleAttr string) string {
-	w := &strings.Builder{}
-	fmt.Fprintf(w, `<pre tabindex="0"%s>`, styleAttr)
 	var language string
 	if code {
 		language = p.language
 	}
-	WriteCodeTag(w, language)
+	w := &strings.Builder{}
+	WritePreStart(w, language, styleAttr)
 	return w.String()
 }
 
-func WriteCodeTag(w io.Writer, language string) {
+func WritePreStart(w io.Writer, language, styleAttr string) {
+	fmt.Fprintf(w, `<pre tabindex="0"%s>`, styleAttr)
 	fmt.Fprint(w, "<code")
 	if language != "" {
 		fmt.Fprint(w, ` class="language-`+language+`"`)
@@ -141,6 +141,12 @@ func WriteCodeTag(w io.Writer, language string) {
 	fmt.Fprint(w, ">")
 }
 
+const preEnd = "</code></pre>"
+
 func (p preWrapper) End(code bool) string {
-	return "</code></pre>"
+	return preEnd
+}
+
+func WritePreEnd(w io.Writer) {
+	fmt.Fprint(w, preEnd)
 }