diff options
author | Helder Pereira <[email protected]> | 2021-08-22 15:03:20 +0100 |
---|---|---|
committer | Bjørn Erik Pedersen <[email protected]> | 2021-08-23 12:28:45 +0200 |
commit | 7a15edafe240471c072d3548b72ccda0271ffd8f (patch) | |
tree | 19617e70943aab2f49f5943bb3c3030c9c4cb4b9 /markup | |
parent | 2f0945bafe501103abe97b2f2b5566b28ec48e52 (diff) | |
download | hugo-7a15edafe240471c072d3548b72ccda0271ffd8f.tar.gz hugo-7a15edafe240471c072d3548b72ccda0271ffd8f.zip |
highlight: Add tabindex when code is not highlighted
Diffstat (limited to 'markup')
-rw-r--r-- | markup/goldmark/convert.go | 71 | ||||
-rw-r--r-- | markup/goldmark/convert_test.go | 6 | ||||
-rw-r--r-- | markup/highlight/highlight.go | 16 |
3 files changed, 51 insertions, 42 deletions
diff --git a/markup/goldmark/convert.go b/markup/goldmark/convert.go index 639fddace..dcaf8d3e1 100644 --- 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 index f2c6efedd..5fe6997e8 100644 --- 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">"Hugo Rocks!"</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 "Hugo Rocks!"\n</code></pre>") + c.Assert(result, qt.Equals, "<pre tabindex=\"0\"><code class=\"language-unknown\" data-lang=\"unknown\">echo "Hugo Rocks!"\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 index 772244a91..319426241 100644 --- 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) } |