Files

98 lines
4.2 KiB
Go
Raw Permalink Normal View History

// Copyright (c) 2026 Petr Balvín <opensource@petrbalvin.org> (https://petrbalvin.org)
// SPDX-License-Identifier: MIT
package markdown
import "testing"
func TestFootnotes(t *testing.T) {
cases := []struct {
name string
input string
want string
}{
{"basic footnote", "Here is a reference.[^1]\n\n[^1]: Here is the note.",
"<p>Here is a reference." +
`<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup>` +
"</p>\n" +
"<section class=\"footnotes\" data-footnotes>\n<ol>\n" +
"<li id=\"fn-1\">\n" +
"<p>Here is the note." +
` <a href="#fnref-1" class="data-footnote-backref" aria-label="Back to reference 1">` + "↩" + `</a>` +
"</p>\n" +
"</li>\n</ol>\n</section>\n"},
{"unreferenced definition renders nothing", "[^1]: the note", ""},
{"undefined reference stays text", "Text[^missing]", "<p>Text[^missing]</p>\n"},
{"numbered by reference order", "[^b] and [^a]\n\n[^a]: A\n[^b]: B",
"<p>" +
`<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup>` + " and " +
`<sup class="footnote-ref"><a href="#fn-2" id="fnref-2" data-footnote-ref>2</a></sup>` +
"</p>\n" +
"<section class=\"footnotes\" data-footnotes>\n<ol>\n" +
"<li id=\"fn-1\">\n<p>B" +
` <a href="#fnref-1" class="data-footnote-backref" aria-label="Back to reference 1">` + "↩" + `</a>` +
"</p>\n</li>\n" +
"<li id=\"fn-2\">\n<p>A" +
` <a href="#fnref-2" class="data-footnote-backref" aria-label="Back to reference 2">` + "↩" + `</a>` +
"</p>\n</li>\n" +
"</ol>\n</section>\n"},
{"repeated reference ids", "[^a] again [^a]\n\n[^a]: A",
"<p>" +
`<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup>` + " again " +
`<sup class="footnote-ref"><a href="#fn-1" id="fnref-1-2" data-footnote-ref>1</a></sup>` +
"</p>\n" +
"<section class=\"footnotes\" data-footnotes>\n<ol>\n" +
"<li id=\"fn-1\">\n<p>A" +
` <a href="#fnref-1" class="data-footnote-backref" aria-label="Back to reference 1">` + "↩" + `</a>` +
"</p>\n</li>\n</ol>\n</section>\n"},
{"multi block definition", "Ref.[^1]\n\n[^1]: first\n\n second",
"<p>Ref." +
`<sup class="footnote-ref"><a href="#fn-1" id="fnref-1" data-footnote-ref>1</a></sup>` +
"</p>\n" +
"<section class=\"footnotes\" data-footnotes>\n<ol>\n" +
"<li id=\"fn-1\">\n<p>first</p>\n<p>second" +
` <a href="#fnref-1" class="data-footnote-backref" aria-label="Back to reference 1">` + "↩" + `</a>` +
"</p>\n</li>\n</ol>\n</section>\n"},
}
for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
got := string(RenderHTML([]byte(tc.input)))
if got != tc.want {
t.Errorf("input %q\ngot: %q\nwant: %q", tc.input, got, tc.want)
}
})
}
}
func TestDefinitionLists(t *testing.T) {
cases := []struct {
name string
input string
want string
}{
{"definition basic", "Term\n: Definition", "<dl>\n<dt>Term</dt>\n<dd>Definition</dd>\n</dl>\n"},
{"definition two entries", "Term 1\n: Def 1\n\nTerm 2\n: Def 2",
"<dl>\n<dt>Term 1</dt>\n<dd>\n<p>Def 1</p>\n</dd>\n<dt>Term 2</dt>\n<dd>\n<p>Def 2</p>\n</dd>\n</dl>\n"},
{"definition two definitions", "Term\n: Def a\n: Def b",
"<dl>\n<dt>Term</dt>\n<dd>Def a</dd>\n<dd>Def b</dd>\n</dl>\n"},
{"definition multiline terms", "Term 1\nTerm 2\n: Def",
"<dl>\n<dt>Term 1</dt>\n<dt>Term 2</dt>\n<dd>Def</dd>\n</dl>\n"},
{"definition second paragraph", "Term\n: Def\n\n more",
"<dl>\n<dt>Term</dt>\n<dd>\n<p>Def</p>\n<p>more</p>\n</dd>\n</dl>\n"},
{"definition inline content", "Term\n: A *bold* claim",
"<dl>\n<dt>Term</dt>\n<dd>A <em>bold</em> claim</dd>\n</dl>\n"},
{"definition paragraph after list", "Term\n: Definition\n\nParagraph after.",
"<dl>\n<dt>Term</dt>\n<dd>Definition</dd>\n</dl>\n<p>Paragraph after.</p>\n"},
{"definition paragraph between lists", "Term\n: Def\n\nBetween\n\nTerm 2\n: Def 2",
"<dl>\n<dt>Term</dt>\n<dd>Def</dd>\n</dl>\n<p>Between</p>\n<dl>\n<dt>Term 2</dt>\n<dd>Def 2</dd>\n</dl>\n"},
}
for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
got := string(RenderHTML([]byte(tc.input)))
if got != tc.want {
t.Errorf("input %q\ngot: %q\nwant: %q", tc.input, got, tc.want)
}
})
}
}