highlight: Add tabindex when code is not highlighted
authorHelder Pereira <helfper@gmail.com>
Sun, 22 Aug 2021 14:03:20 +0000 (15:03 +0100)
committerBjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Mon, 23 Aug 2021 10:28:45 +0000 (12:28 +0200)
markup/goldmark/convert.go
markup/goldmark/convert_test.go
markup/highlight/highlight.go

index 639fddaceaf96dd984acb8640cac717d98986b9c..dcaf8d3e17950e8418689f636f7dd26e83590eae 100644 (file)
@@ -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>")
 }
index f2c6efedd134a657030cec3975bde8e36cd44252..5fe6997e88e9882dc8f55cd053932864ca468323 100644 (file)
@@ -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) {
index 772244a916f5accffb74feda1f3c0abc0dbead14..319426241d562c11a2fa63ab0827d5c28c89e88b 100644 (file)
@@ -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)
 }