integration_test.go (7747B)
1 // Copyright 2022 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 codeblocks_test
15
16 import (
17 "path/filepath"
18 "strings"
19 "testing"
20
21 "github.com/gohugoio/hugo/hugolib"
22 )
23
24 func TestCodeblocks(t *testing.T) {
25 t.Parallel()
26
27 files := `
28 -- config.toml --
29 [markup]
30 [markup.highlight]
31 anchorLineNos = false
32 codeFences = true
33 guessSyntax = false
34 hl_Lines = ''
35 lineAnchors = ''
36 lineNoStart = 1
37 lineNos = false
38 lineNumbersInTable = true
39 noClasses = false
40 style = 'monokai'
41 tabWidth = 4
42 -- layouts/_default/_markup/render-codeblock-goat.html --
43 {{ $diagram := diagrams.Goat .Inner }}
44 Goat SVG:{{ substr $diagram.Wrapped 0 100 | safeHTML }} }}|
45 Goat Attribute: {{ .Attributes.width}}|
46 -- layouts/_default/_markup/render-codeblock-go.html --
47 Go Code: {{ .Inner | safeHTML }}|
48 Go Language: {{ .Type }}|
49 -- layouts/_default/single.html --
50 {{ .Content }}
51 -- content/p1.md --
52 ---
53 title: "p1"
54 ---
55
56 ## Ascii Diagram
57
58 §§§goat { width="600" }
59 --->
60 §§§
61
62 ## Go Code
63
64 §§§go
65 fmt.Println("Hello, World!");
66 §§§
67
68 ## Golang Code
69
70 §§§golang
71 fmt.Println("Hello, Golang!");
72 §§§
73
74 ## Bash Code
75
76 §§§bash { linenos=inline,hl_lines=[2,"5-6"],linenostart=32 class=blue }
77 echo "l1";
78 echo "l2";
79 echo "l3";
80 echo "l4";
81 echo "l5";
82 echo "l6";
83 echo "l7";
84 echo "l8";
85 §§§
86 `
87
88 b := hugolib.NewIntegrationTestBuilder(
89 hugolib.IntegrationTestConfig{
90 T: t,
91 TxtarString: files,
92 NeedsOsFS: false,
93 },
94 ).Build()
95
96 b.AssertFileContent("public/p1/index.html", `
97 Goat SVG:<svg class='diagram'
98 Goat Attribute: 600|
99
100 Go Language: go|
101 Go Code: fmt.Println("Hello, World!");
102
103 Go Code: fmt.Println("Hello, Golang!");
104 Go Language: golang|
105
106
107 `,
108 "Goat SVG:<svg class='diagram' xmlns='http://www.w3.org/2000/svg' version='1.1' height='25' width='40'",
109 "Goat Attribute: 600|",
110 "<h2 id=\"go-code\">Go Code</h2>\nGo Code: fmt.Println(\"Hello, World!\");\n|\nGo Language: go|",
111 "<h2 id=\"golang-code\">Golang Code</h2>\nGo Code: fmt.Println(\"Hello, Golang!\");\n|\nGo Language: golang|",
112 "<h2 id=\"bash-code\">Bash Code</h2>\n<div class=\"highlight blue\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-bash\" data-lang=\"bash\"><span class=\"line\"><span class=\"ln\">32</span><span class=\"cl\"><span class=\"nb\">echo</span> <span class=\"s2\">"l1"</span><span class=\"p\">;</span>\n</span></span><span class=\"line hl\"><span class=\"ln\">33</span>",
113 )
114 }
115
116 func TestHighlightCodeblock(t *testing.T) {
117 t.Parallel()
118
119 files := `
120 -- config.toml --
121 [markup]
122 [markup.highlight]
123 anchorLineNos = false
124 codeFences = true
125 guessSyntax = false
126 hl_Lines = ''
127 lineAnchors = ''
128 lineNoStart = 1
129 lineNos = false
130 lineNumbersInTable = true
131 noClasses = false
132 style = 'monokai'
133 tabWidth = 4
134 -- layouts/_default/_markup/render-codeblock.html --
135 {{ $result := transform.HighlightCodeBlock . }}
136 Inner: |{{ $result.Inner | safeHTML }}|
137 Wrapped: |{{ $result.Wrapped | safeHTML }}|
138 -- layouts/_default/single.html --
139 {{ .Content }}
140 -- content/p1.md --
141 ---
142 title: "p1"
143 ---
144
145 ## Go Code
146
147 §§§go
148 fmt.Println("Hello, World!");
149 §§§
150
151 `
152
153 b := hugolib.NewIntegrationTestBuilder(
154 hugolib.IntegrationTestConfig{
155 T: t,
156 TxtarString: files,
157 NeedsOsFS: false,
158 },
159 ).Build()
160
161 b.AssertFileContent("public/p1/index.html",
162 "Inner: |<span class=\"line\"><span class=\"cl\"><span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">"Hello, World!"</span><span class=\"p\">);</span></span></span>|",
163 "Wrapped: |<div class=\"highlight\"><pre tabindex=\"0\" class=\"chroma\"><code class=\"language-go\" data-lang=\"go\"><span class=\"line\"><span class=\"cl\"><span class=\"nx\">fmt</span><span class=\"p\">.</span><span class=\"nf\">Println</span><span class=\"p\">(</span><span class=\"s\">"Hello, World!"</span><span class=\"p\">);</span></span></span></code></pre></div>|",
164 )
165 }
166
167 func TestCodeblocksBugs(t *testing.T) {
168 t.Parallel()
169
170 files := `
171 -- config.toml --
172 -- layouts/_default/_markup/render-codeblock.html --
173 {{ .Position | safeHTML }}
174 -- layouts/_default/single.html --
175 {{ .Content }}
176 -- content/p1.md --
177 ---
178 title: "p1"
179 ---
180
181 ## Issue 9627
182
183 §§§text
184 {{</* foo */>}}
185 §§§
186
187 `
188
189 b := hugolib.NewIntegrationTestBuilder(
190 hugolib.IntegrationTestConfig{
191 T: t,
192 TxtarString: files,
193 NeedsOsFS: false,
194 },
195 ).Build()
196
197 b.AssertFileContent("public/p1/index.html", `
198 # Issue 9627: For the Position in code blocks we try to match the .Inner with the original source. This isn't always possible.
199 p1.md:0:0
200 `,
201 )
202 }
203
204 func TestCodeChomp(t *testing.T) {
205 t.Parallel()
206
207 files := `
208 -- config.toml --
209 -- content/p1.md --
210 ---
211 title: "p1"
212 ---
213
214 §§§bash
215 echo "p1";
216 §§§
217 -- layouts/_default/single.html --
218 {{ .Content }}
219 -- layouts/_default/_markup/render-codeblock.html --
220 |{{ .Inner | safeHTML }}|
221
222 `
223
224 b := hugolib.NewIntegrationTestBuilder(
225 hugolib.IntegrationTestConfig{
226 T: t,
227 TxtarString: files,
228 NeedsOsFS: false,
229 },
230 ).Build()
231
232 b.AssertFileContent("public/p1/index.html", "|echo \"p1\";|")
233 }
234
235 func TestCodePosition(t *testing.T) {
236 t.Parallel()
237
238 files := `
239 -- config.toml --
240 -- content/p1.md --
241 ---
242 title: "p1"
243 ---
244
245 ## Code
246
247 §§§
248 echo "p1";
249 §§§
250 -- layouts/_default/single.html --
251 {{ .Content }}
252 -- layouts/_default/_markup/render-codeblock.html --
253 Position: {{ .Position | safeHTML }}
254
255
256 `
257
258 b := hugolib.NewIntegrationTestBuilder(
259 hugolib.IntegrationTestConfig{
260 T: t,
261 TxtarString: files,
262 },
263 ).Build()
264
265 b.AssertFileContent("public/p1/index.html", filepath.FromSlash("Position: \"/content/p1.md:7:1\""))
266 }
267
268 // Issue 9571
269 func TestAttributesChroma(t *testing.T) {
270 t.Parallel()
271
272 files := `
273 -- config.toml --
274 -- content/p1.md --
275 ---
276 title: "p1"
277 ---
278
279 ## Code
280
281 §§§LANGUAGE {style=monokai}
282 echo "p1";
283 §§§
284 -- layouts/_default/single.html --
285 {{ .Content }}
286 -- layouts/_default/_markup/render-codeblock.html --
287 Attributes: {{ .Attributes }}|Options: {{ .Options }}|
288
289
290 `
291 testLanguage := func(language, expect string) {
292 b := hugolib.NewIntegrationTestBuilder(
293 hugolib.IntegrationTestConfig{
294 T: t,
295 TxtarString: strings.ReplaceAll(files, "LANGUAGE", language),
296 },
297 ).Build()
298
299 b.AssertFileContent("public/p1/index.html", expect)
300 }
301
302 testLanguage("bash", "Attributes: map[]|Options: map[style:monokai]|")
303 testLanguage("hugo", "Attributes: map[style:monokai]|Options: map[]|")
304 }
305
306 func TestPanics(t *testing.T) {
307
308 files := `
309 -- config.toml --
310 [markup]
311 [markup.goldmark]
312 [markup.goldmark.parser]
313 autoHeadingID = true
314 autoHeadingIDType = "github"
315 [markup.goldmark.parser.attribute]
316 block = true
317 title = true
318 -- content/p1.md --
319 ---
320 title: "p1"
321 ---
322
323 BLOCK
324
325 Common
326
327 -- layouts/_default/single.html --
328 {{ .Content }}
329
330
331 `
332
333 for _, test := range []struct {
334 name string
335 markdown string
336 }{
337 {"issue-9819", "asdf\n: {#myid}"},
338 } {
339 t.Run(test.name, func(t *testing.T) {
340 t.Parallel()
341 b := hugolib.NewIntegrationTestBuilder(
342 hugolib.IntegrationTestConfig{
343 T: t,
344 TxtarString: strings.ReplaceAll(files, "BLOCK", test.markdown),
345 },
346 ).Build()
347
348 b.AssertFileContent("public/p1/index.html", "Common")
349 })
350 }
351
352 }