67 | 67 |
|
68 | 68 |
if strings.TrimSpace(buffer.String()) != strings.TrimSpace(`
|
69 | 69 |
<h1>Title</h1>
|
70 | |
<div class="highlight"><pre class="chroma"><span class="ln">1</span><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
|
71 | |
<span class="ln">2</span> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">"ok"</span><span class="p">)</span>
|
72 | |
<span class="ln">3</span><span class="p">}</span>
|
73 | |
</pre></div>
|
|
70 |
<div class="highlight"><pre tabindex="0" class="chroma"><code><span class="line"><span class="ln">1</span><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
|
|
71 |
</span></span><span class="line"><span class="ln">2</span><span class="cl"> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">"ok"</span><span class="p">)</span>
|
|
72 |
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="p">}</span>
|
|
73 |
</span></span></code></pre></div>
|
74 | 74 |
`) {
|
75 | |
t.Error("failed to render HTML")
|
76 | |
}
|
77 | |
|
78 | |
expected := strings.TrimSpace(`/* Background */ .chroma { color: #f8f8f2; background-color: #272822 }
|
|
75 |
t.Error("failed to render HTML\n")
|
|
76 |
}
|
|
77 |
|
|
78 |
expected := strings.TrimSpace(`/* Background */ .bg { color: #f8f8f2; background-color: #272822 }
|
|
79 |
/* PreWrapper */ .chroma { color: #f8f8f2; background-color: #272822; }
|
79 | 80 |
/* LineNumbers targeted by URL anchor */ .chroma .ln:target { color: #f8f8f2; background-color: #3c3d38 }
|
80 | 81 |
/* LineNumbersTable targeted by URL anchor */ .chroma .lnt:target { color: #f8f8f2; background-color: #3c3d38 }
|
81 | 82 |
/* Error */ .chroma .err { color: #960050; background-color: #1e0010 }
|
82 | 83 |
/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; }
|
83 | |
/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; width: auto; overflow: auto; display: block; }
|
84 | |
/* LineHighlight */ .chroma .hl { display: block; width: 100%;background-color: #3c3d38 }
|
85 | |
/* LineNumbersTable */ .chroma .lnt { margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f }
|
86 | |
/* LineNumbers */ .chroma .ln { margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f }
|
|
84 |
/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; }
|
|
85 |
/* LineHighlight */ .chroma .hl { background-color: #3c3d38 }
|
|
86 |
/* LineNumbersTable */ .chroma .lnt { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f }
|
|
87 |
/* LineNumbers */ .chroma .ln { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #7f7f7f }
|
|
88 |
/* Line */ .chroma .line { display: flex; }
|
87 | 89 |
/* Keyword */ .chroma .k { color: #66d9ef }
|
88 | 90 |
/* KeywordConstant */ .chroma .kc { color: #66d9ef }
|
89 | 91 |
/* KeywordDeclaration */ .chroma .kd { color: #66d9ef }
|
|
197 | 199 |
}
|
198 | 200 |
if strings.TrimSpace(buffer.String()) != strings.TrimSpace(`
|
199 | 201 |
<h1>Title</h1>
|
200 | |
<pre style="background-color:#fff"><span style="display:block;width:100%;background-color:#e5e5e5"><span style="color:#999;font-weight:bold;font-style:italic">#include</span> <span style="color:#999;font-weight:bold;font-style:italic"><iostream></span><span style="color:#999;font-weight:bold;font-style:italic">
|
201 | |
</span></span><span style="display:block;width:100%;background-color:#e5e5e5"><span style="color:#999;font-weight:bold;font-style:italic"></span><span style="color:#458;font-weight:bold">int</span> <span style="color:#900;font-weight:bold">main</span>() {
|
202 | |
</span> std<span style="color:#000;font-weight:bold">::</span>cout<span style="color:#000;font-weight:bold"><<</span> <span style="color:#d14">"hello"</span> <span style="color:#000;font-weight:bold"><<</span> std<span style="color:#000;font-weight:bold">::</span>endl;
|
203 | |
}
|
204 | |
</pre>
|
|
202 |
<pre tabindex="0" style="background-color:#fff;display:grid;"><code><span style="display:flex; background-color:#e5e5e5"><span><span style="color:#999;font-weight:bold;font-style:italic">#include</span> <span style="color:#999;font-weight:bold;font-style:italic"><iostream></span><span style="color:#999;font-weight:bold;font-style:italic">
|
|
203 |
</span></span></span><span style="display:flex; background-color:#e5e5e5"><span><span style="color:#999;font-weight:bold;font-style:italic"></span><span style="color:#458;font-weight:bold">int</span> <span style="color:#900;font-weight:bold">main</span>() {
|
|
204 |
</span></span><span style="display:flex;"><span> std<span style="color:#000;font-weight:bold">::</span>cout<span style="color:#000;font-weight:bold"><<</span> <span style="color:#d14">"hello"</span> <span style="color:#000;font-weight:bold"><<</span> std<span style="color:#000;font-weight:bold">::</span>endl;
|
|
205 |
</span></span><span style="display:flex;"><span>}
|
|
206 |
</span></span></code></pre>
|
205 | 207 |
`) {
|
206 | 208 |
t.Error("failed to render HTML")
|
207 | 209 |
}
|
|
295 | 297 |
|
296 | 298 |
if strings.TrimSpace(buffer.String()) != strings.TrimSpace(`
|
297 | 299 |
<h1>Title</h1>
|
298 | |
<div class="highlight"><pre class="chroma"><span class="ln">1</span><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
|
299 | |
<span class="ln">2</span> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">"ok"</span><span class="p">)</span>
|
300 | |
<span class="ln">3</span><span class="p">}</span>
|
301 | |
</pre></div>
|
|
300 |
<div class="highlight"><pre tabindex="0" class="chroma"><code><span class="line"><span class="ln">1</span><span class="cl"><span class="kd">func</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
|
|
301 |
</span></span><span class="line"><span class="ln">2</span><span class="cl"> <span class="nx">fmt</span><span class="p">.</span><span class="nf">Println</span><span class="p">(</span><span class="s">"ok"</span><span class="p">)</span>
|
|
302 |
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="p">}</span>
|
|
303 |
</span></span></code></pre></div>
|
302 | 304 |
`) {
|
303 | |
t.Error("failed to render HTML")
|
304 | |
}
|
305 | |
|
306 | |
expected := strings.TrimSpace(`/* Background */ .chroma { color: #cccccc; background-color: #1d1d1d }
|
|
305 |
t.Error("failed to render HTML", buffer.String())
|
|
306 |
}
|
|
307 |
|
|
308 |
expected := strings.TrimSpace(`/* Background */ .bg { color: #cccccc; background-color: #1d1d1d }
|
|
309 |
/* PreWrapper */ .chroma { color: #cccccc; background-color: #1d1d1d; }
|
307 | 310 |
/* LineNumbers targeted by URL anchor */ .chroma .ln:target { color: #cccccc; background-color: #333333 }
|
308 | 311 |
/* LineNumbersTable targeted by URL anchor */ .chroma .lnt:target { color: #cccccc; background-color: #333333 }
|
309 | 312 |
/* Error */ .chroma .err { }
|
310 | 313 |
/* LineTableTD */ .chroma .lntd { vertical-align: top; padding: 0; margin: 0; border: 0; }
|
311 | |
/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; width: auto; overflow: auto; display: block; }
|
312 | |
/* LineHighlight */ .chroma .hl { display: block; width: 100%;background-color: #333333 }
|
313 | |
/* LineNumbersTable */ .chroma .lnt { margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #666666 }
|
314 | |
/* LineNumbers */ .chroma .ln { margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #666666 }
|
|
314 |
/* LineTable */ .chroma .lntable { border-spacing: 0; padding: 0; margin: 0; border: 0; }
|
|
315 |
/* LineHighlight */ .chroma .hl { background-color: #333333 }
|
|
316 |
/* LineNumbersTable */ .chroma .lnt { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #666666 }
|
|
317 |
/* LineNumbers */ .chroma .ln { white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;color: #666666 }
|
|
318 |
/* Line */ .chroma .line { display: flex; }
|
315 | 319 |
/* Keyword */ .chroma .k { color: #cc99cd }
|
316 | 320 |
/* KeywordConstant */ .chroma .kc { color: #cc99cd }
|
317 | 321 |
/* KeywordDeclaration */ .chroma .kd { color: #cc99cd }
|
|
392 | 396 |
{`hl_lines=["2"]`, []int{2}},
|
393 | 397 |
{`hl_lines=["2-3",5],linenostart=5`, []int{2, 3, 5}},
|
394 | 398 |
{`hl_lines=["2-3"]`, []int{2, 3}},
|
|
399 |
{`hl_lines=["2-3",5],linenostart="5"`, []int{2, 3}}, // linenostart must be a number. string values are ignored
|
395 | 400 |
} {
|
396 | 401 |
t.Run(fmt.Sprint(i), func(t *testing.T) {
|
397 | 402 |
var buffer bytes.Buffer
|
|
413 | 418 |
}
|
414 | 419 |
|
415 | 420 |
for _, line := range test.expect {
|
416 | |
expectStr := fmt.Sprintf("<span class=\"hl\">LINE%d\n</span>", line)
|
|
421 |
expectStr := fmt.Sprintf("<span class=\"line hl\"><span class=\"cl\">LINE%d\n</span></span>", line)
|
417 | 422 |
if !strings.Contains(buffer.String(), expectStr) {
|
418 | 423 |
t.Fatal("got\n", buffer.String(), "\nexpected\n", expectStr)
|
419 | 424 |
}
|
|
428 | 433 |
<span class="lnt">1
|
429 | 434 |
</span></td>
|
430 | 435 |
<td class="lntd">
|
431 | |
LINE1
|
432 | |
</td></tr></table>
|
|
436 |
<span class="line"><span class="cl">LINE1
|
|
437 |
</span></span></td></tr></table>
|
433 | 438 |
</div>`
|
434 | 439 |
|
435 | 440 |
for i, test := range []struct {
|
|
438 | 443 |
lineNumbersInTable bool
|
439 | 444 |
expect string
|
440 | 445 |
}{
|
441 | |
{`linenos=true`, false, false, `<span class="ln">1</span>LINE1`},
|
442 | |
{`linenos=false`, false, false, `LINE1`},
|
443 | |
{``, true, false, `<span class="ln">1</span>LINE1`},
|
|
446 |
{`linenos=true`, false, false, `<span class="line"><span class="ln">1</span><span class="cl">LINE1
|
|
447 |
</span></span>`},
|
|
448 |
{`linenos=false`, false, false, `<span class="line"><span class="cl">LINE1
|
|
449 |
</span></span>`},
|
|
450 |
{``, true, false, `<span class="line"><span class="ln">1</span><span class="cl">LINE1
|
|
451 |
</span></span>`},
|
444 | 452 |
{``, true, true, outputLineNumbersInTable},
|
445 | |
{`linenos=inline`, true, true, `<span class="ln">1</span>LINE1`},
|
446 | |
{`linenos=foo`, false, false, `<span class="ln">1</span>LINE1`},
|
|
453 |
{`linenos=inline`, true, true, `<span class="line"><span class="ln">1</span><span class="cl">LINE1
|
|
454 |
</span></span>`},
|
|
455 |
{`linenos=foo`, false, false, `<span class="line"><span class="ln">1</span><span class="cl">LINE1
|
|
456 |
</span></span>`},
|
447 | 457 |
{`linenos=table`, false, false, outputLineNumbersInTable},
|
448 | 458 |
} {
|
449 | 459 |
t.Run(fmt.Sprint(i), func(t *testing.T) {
|
|
499 | 509 |
t.Fatal(err)
|
500 | 510 |
}
|
501 | 511 |
if strings.TrimSpace(buffer.String()) != strings.TrimSpace(`
|
502 | |
<pre class="chroma"><span class="ln">1</span>LINE
|
503 | |
</pre>
|
|
512 |
<pre tabindex="0" class="chroma"><code><span class="line"><span class="ln">1</span><span class="cl">LINE
|
|
513 |
</span></span></code></pre>
|
504 | 514 |
`) {
|
505 | 515 |
t.Errorf("render mismatch, got\n%s", buffer.String())
|
506 | 516 |
}
|
|
531 | 541 |
t.Fatal(err)
|
532 | 542 |
}
|
533 | 543 |
if strings.TrimSpace(buffer.String()) != strings.TrimSpace(`
|
534 | |
<pre class="chroma"><span class="ln">1</span><span class="nf">GET</span> <span class="nn">/foo</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
|
535 | |
<span class="ln">2</span><span class="n">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
|
536 | |
<span class="ln">3</span><span class="n">User-Agent</span><span class="o">:</span> <span class="l">foo</span>
|
537 | |
<span class="ln">4</span>
|
538 | |
<span class="ln">5</span><span class="p">{</span>
|
539 | |
<span class="ln">6</span> <span class="nt">"hello"</span><span class="p">:</span> <span class="s2">"world"</span>
|
540 | |
<span class="ln">7</span><span class="p">}</span>
|
541 | |
</pre>
|
|
544 |
<pre tabindex="0" class="chroma"><code><span class="line"><span class="ln">1</span><span class="cl"><span class="nf">GET</span> <span class="nn">/foo</span> <span class="kr">HTTP</span><span class="o">/</span><span class="m">1.1</span>
|
|
545 |
</span></span><span class="line"><span class="ln">2</span><span class="cl"><span class="n">Content-Type</span><span class="o">:</span> <span class="l">application/json</span>
|
|
546 |
</span></span><span class="line"><span class="ln">3</span><span class="cl"><span class="n">User-Agent</span><span class="o">:</span> <span class="l">foo</span>
|
|
547 |
</span></span><span class="line"><span class="ln">4</span><span class="cl">
|
|
548 |
</span></span><span class="line"><span class="ln">5</span><span class="cl"><span class="p">{</span>
|
|
549 |
</span></span><span class="line"><span class="ln">6</span><span class="cl"> <span class="nt">"hello"</span><span class="p">:</span> <span class="s2">"world"</span>
|
|
550 |
</span></span><span class="line"><span class="ln">7</span><span class="cl"><span class="p">}</span>
|
|
551 |
</span></span></code></pre>
|
542 | 552 |
`) {
|
543 | 553 |
t.Errorf("render mismatch, got\n%s", buffer.String())
|
544 | 554 |
}
|