highlight_test.go (5214B)
1 // Copyright 2019 The Hugo Authors. All rights reserved.
2 //
3 // Licensed under the Apache License, Version 2.0 (the "License");
4 // you may not use this file except in compliance with the License.
5 // You may obtain a copy of the License at
6 // http://www.apache.org/licenses/LICENSE-2.0
7 //
8 // Unless required by applicable law or agreed to in writing, software
9 // distributed under the License is distributed on an "AS IS" BASIS,
10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11 // See the License for the specific language governing permissions and
12 // limitations under the License.
13
14 // Package highlight provides code highlighting.
15 package highlight
16
17 import (
18 "testing"
19
20 qt "github.com/frankban/quicktest"
21 )
22
23 func TestHighlight(t *testing.T) {
24 c := qt.New(t)
25
26 lines := `LINE1
27 LINE2
28 LINE3
29 LINE4
30 LINE5
31 `
32 coalesceNeeded := `GET /foo HTTP/1.1
33 Content-Type: application/json
34 User-Agent: foo
35
36 {
37 "hello": "world"
38 }`
39
40 c.Run("Basic", func(c *qt.C) {
41 cfg := DefaultConfig
42 cfg.NoClasses = false
43 h := New(cfg)
44
45 result, _ := h.Highlight(`echo "Hugo Rocks!"`, "bash", "")
46 c.Assert(result, qt.Equals, `<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl"><span class="nb">echo</span> <span class="s2">"Hugo Rocks!"</span></span></span></code></pre></div>`)
47 result, _ = h.Highlight(`echo "Hugo Rocks!"`, "unknown", "")
48 c.Assert(result, qt.Equals, `<pre tabindex="0"><code class="language-unknown" data-lang="unknown">echo "Hugo Rocks!"</code></pre>`)
49 })
50
51 c.Run("Highlight lines, default config", func(c *qt.C) {
52 cfg := DefaultConfig
53 cfg.NoClasses = false
54 h := New(cfg)
55
56 result, _ := h.Highlight(lines, "bash", "linenos=table,hl_lines=2 4-5,linenostart=3")
57 c.Assert(result, qt.Contains, "<div class=\"highlight\"><div class=\"chroma\">\n<table class=\"lntable\"><tr><td class=\"lntd\">\n<pre tabindex=\"0\" class=\"chroma\"><code><span class")
58 c.Assert(result, qt.Contains, "<span class=\"hl\"><span class=\"lnt\">4")
59
60 result, _ = h.Highlight(lines, "bash", "linenos=inline,hl_lines=2")
61 c.Assert(result, qt.Contains, "<span class=\"ln\">2</span><span class=\"cl\">LINE2\n</span></span>")
62 c.Assert(result, qt.Not(qt.Contains), "<table")
63
64 result, _ = h.Highlight(lines, "bash", "linenos=true,hl_lines=2")
65 c.Assert(result, qt.Contains, "<table")
66 c.Assert(result, qt.Contains, "<span class=\"hl\"><span class=\"lnt\">2\n</span>")
67 })
68
69 c.Run("Highlight lines, linenumbers default on", func(c *qt.C) {
70 cfg := DefaultConfig
71 cfg.NoClasses = false
72 cfg.LineNos = true
73 h := New(cfg)
74
75 result, _ := h.Highlight(lines, "bash", "")
76 c.Assert(result, qt.Contains, "<span class=\"lnt\">2\n</span>")
77 result, _ = h.Highlight(lines, "bash", "linenos=false,hl_lines=2")
78 c.Assert(result, qt.Not(qt.Contains), "class=\"lnt\"")
79 })
80
81 c.Run("Highlight lines, linenumbers default on, anchorlinenumbers default on", func(c *qt.C) {
82 cfg := DefaultConfig
83 cfg.NoClasses = false
84 cfg.LineNos = true
85 cfg.AnchorLineNos = true
86 h := New(cfg)
87
88 result, _ := h.Highlight(lines, "bash", "")
89 // From Chroma v0.8.2 this is linkable: https://github.com/alecthomas/chroma/commit/ab61726cdb54d5a98b6efe7ed76af6aa0698ab4a
90 c.Assert(result, qt.Contains, "<span class=\"lnt\" id=\"2\"><a style=\"outline: none; text-decoration:none; color:inherit\" href=\"#2\">2</a>\n</span>")
91 result, _ = h.Highlight(lines, "bash", "lineanchors=test")
92 result, _ = h.Highlight(lines, "bash", "anchorlinenos=false,hl_lines=2")
93 c.Assert(result, qt.Not(qt.Contains), "id=\"2\"")
94 })
95
96 c.Run("Highlight lines, linenumbers default on, linenumbers in table default off", func(c *qt.C) {
97 cfg := DefaultConfig
98 cfg.NoClasses = false
99 cfg.LineNos = true
100 cfg.LineNumbersInTable = false
101 h := New(cfg)
102
103 result, _ := h.Highlight(lines, "bash", "")
104 c.Assert(result, qt.Contains, "<span class=\"cl\">LINE2\n</span></span>")
105 result, _ = h.Highlight(lines, "bash", "linenos=table")
106 c.Assert(result, qt.Contains, "<span class=\"lnt\">1\n</span>")
107 })
108
109 c.Run("No language", func(c *qt.C) {
110 cfg := DefaultConfig
111 cfg.NoClasses = false
112 cfg.LineNos = true
113 h := New(cfg)
114
115 result, _ := h.Highlight(lines, "", "")
116 c.Assert(result, qt.Equals, "<pre tabindex=\"0\"><code>LINE1\nLINE2\nLINE3\nLINE4\nLINE5\n</code></pre>")
117 })
118
119 c.Run("No language, guess syntax", func(c *qt.C) {
120 cfg := DefaultConfig
121 cfg.NoClasses = false
122 cfg.GuessSyntax = true
123 cfg.LineNos = true
124 cfg.LineNumbersInTable = false
125 h := New(cfg)
126
127 result, _ := h.Highlight(lines, "", "")
128 c.Assert(result, qt.Contains, "<span class=\"cl\">LINE2\n</span></span>")
129 })
130
131 c.Run("No language, Escape HTML string", func(c *qt.C) {
132 cfg := DefaultConfig
133 cfg.NoClasses = false
134 h := New(cfg)
135
136 result, _ := h.Highlight("Escaping less-than in code block? <fail>", "", "")
137 c.Assert(result, qt.Contains, "<fail>")
138 })
139
140 c.Run("Highlight lines, default config", func(c *qt.C) {
141 cfg := DefaultConfig
142 cfg.NoClasses = false
143 h := New(cfg)
144
145 result, _ := h.Highlight(coalesceNeeded, "http", "linenos=true,hl_lines=2")
146 c.Assert(result, qt.Contains, "hello")
147 c.Assert(result, qt.Contains, "}")
148 })
149 }