aboutsummaryrefslogtreecommitdiffhomepage
path: root/markup
diff options
context:
space:
mode:
authorHelder Pereira <[email protected]>2021-08-22 15:03:20 +0100
committerBjørn Erik Pedersen <[email protected]>2021-08-23 12:28:45 +0200
commit7a15edafe240471c072d3548b72ccda0271ffd8f (patch)
tree19617e70943aab2f49f5943bb3c3030c9c4cb4b9 /markup
parent2f0945bafe501103abe97b2f2b5566b28ec48e52 (diff)
downloadhugo-7a15edafe240471c072d3548b72ccda0271ffd8f.tar.gz
hugo-7a15edafe240471c072d3548b72ccda0271ffd8f.zip
highlight: Add tabindex when code is not highlighted
Diffstat (limited to 'markup')
-rw-r--r--markup/goldmark/convert.go71
-rw-r--r--markup/goldmark/convert_test.go6
-rw-r--r--markup/highlight/highlight.go16
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">&#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
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)
}