|
|
|
package markdown
|
|
|
|
|
|
|
|
import (
|
|
|
|
"testing"
|
|
|
|
|
|
|
|
"github.com/mickael-menu/zk/core/note"
|
|
|
|
"github.com/mickael-menu/zk/util/opt"
|
|
|
|
"github.com/mickael-menu/zk/util/test/assert"
|
|
|
|
)
|
|
|
|
|
|
|
|
func TestParseTitle(t *testing.T) {
|
|
|
|
test := func(source string, expectedTitle string) {
|
|
|
|
content := parse(t, source)
|
|
|
|
assert.Equal(t, content.Title, opt.NewNotEmptyString(expectedTitle))
|
|
|
|
}
|
|
|
|
|
|
|
|
test("", "")
|
|
|
|
test("# ", "")
|
|
|
|
test("#A title", "")
|
|
|
|
test(" # A title", "A title")
|
|
|
|
test("# A title", "A title")
|
|
|
|
test("# A title ", "A title")
|
|
|
|
test("## A title", "A title")
|
|
|
|
test("Paragraph \n\n## A title\nBody", "A title")
|
|
|
|
test("# Heading 1\n## Heading 1.a\n# Heading 2", "Heading 1")
|
|
|
|
test("## Small Heading\n# Bigger Heading", "Bigger Heading")
|
|
|
|
test("# A **title** with [formatting](http://stripped)", "A title with formatting")
|
|
|
|
|
|
|
|
// From a YAML frontmatter
|
|
|
|
test(`---
|
|
|
|
Title: A title
|
|
|
|
Tags:
|
|
|
|
- tag1
|
|
|
|
- tag2
|
|
|
|
---
|
|
|
|
|
|
|
|
# Heading
|
|
|
|
`, "A title")
|
|
|
|
test(`---
|
|
|
|
title: lowercase key
|
|
|
|
---
|
|
|
|
Paragraph
|
|
|
|
`, "lowercase key")
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestParseBody(t *testing.T) {
|
|
|
|
test := func(source string, expectedBody string) {
|
|
|
|
content := parse(t, source)
|
|
|
|
assert.Equal(t, content.Body, opt.NewNotEmptyString(expectedBody))
|
|
|
|
}
|
|
|
|
|
|
|
|
test("", "")
|
|
|
|
test("# A title\n \n", "")
|
|
|
|
test("Paragraph \n\n# A title", "")
|
|
|
|
test("Paragraph \n\n# A title\nBody", "Body")
|
|
|
|
|
|
|
|
test(
|
|
|
|
`## Small Heading
|
|
|
|
# Bigger Heading
|
|
|
|
|
|
|
|
## Smaller Heading
|
|
|
|
Body
|
|
|
|
several lines
|
|
|
|
# Body heading
|
|
|
|
|
|
|
|
Paragraph:
|
|
|
|
|
|
|
|
* item1
|
|
|
|
* item2
|
|
|
|
|
|
|
|
`,
|
|
|
|
`## Smaller Heading
|
|
|
|
Body
|
|
|
|
several lines
|
|
|
|
# Body heading
|
|
|
|
|
|
|
|
Paragraph:
|
|
|
|
|
|
|
|
* item1
|
|
|
|
* item2`,
|
|
|
|
)
|
|
|
|
test(`---
|
|
|
|
title: A title
|
|
|
|
---
|
|
|
|
|
|
|
|
Paragraph
|
|
|
|
`, "Paragraph")
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestParseLead(t *testing.T) {
|
|
|
|
test := func(source string, expectedLead string) {
|
|
|
|
content := parse(t, source)
|
|
|
|
assert.Equal(t, content.Lead, opt.NewNotEmptyString(expectedLead))
|
|
|
|
}
|
|
|
|
|
|
|
|
test("", "")
|
|
|
|
test("# A title\n \n", "")
|
|
|
|
|
|
|
|
test(
|
|
|
|
`Paragraph
|
|
|
|
# A title`,
|
|
|
|
"",
|
|
|
|
)
|
|
|
|
|
|
|
|
test(
|
|
|
|
`Paragraph
|
|
|
|
# A title
|
|
|
|
Lead`,
|
|
|
|
"Lead",
|
|
|
|
)
|
|
|
|
|
|
|
|
test(
|
|
|
|
`# A title
|
|
|
|
Lead
|
|
|
|
multiline
|
|
|
|
|
|
|
|
other`,
|
|
|
|
"Lead\nmultiline",
|
|
|
|
)
|
|
|
|
|
|
|
|
test(
|
|
|
|
`# A title
|
|
|
|
|
|
|
|
Lead
|
|
|
|
multiline
|
|
|
|
|
|
|
|
## Heading`,
|
|
|
|
"Lead\nmultiline",
|
|
|
|
)
|
|
|
|
|
|
|
|
test(
|
|
|
|
`# A title
|
|
|
|
|
|
|
|
## Heading
|
|
|
|
Lead
|
|
|
|
multiline
|
|
|
|
|
|
|
|
other`,
|
|
|
|
`## Heading
|
|
|
|
Lead
|
|
|
|
multiline`,
|
|
|
|
)
|
|
|
|
|
|
|
|
test(
|
|
|
|
`# A title
|
|
|
|
|
|
|
|
* item1
|
|
|
|
* item2
|
|
|
|
|
|
|
|
Paragraph`,
|
|
|
|
`* item1
|
|
|
|
* item2`,
|
|
|
|
)
|
|
|
|
}
|
|
|
|
|
|
|
|
func TestParseLinks(t *testing.T) {
|
|
|
|
test := func(source string, links []note.Link) {
|
|
|
|
content := parse(t, source)
|
|
|
|
assert.Equal(t, content.Links, links)
|
|
|
|
}
|
|
|
|
|
|
|
|
test("", []note.Link{})
|
|
|
|
test("No links around here", []note.Link{})
|
|
|
|
|
|
|
|
test(`
|
|
|
|
# Heading with a [link](heading)
|
|
|
|
|
|
|
|
Paragraph containing [multiple **links**](stripped-formatting), here's one [relative](../other).
|
|
|
|
A link can have [one relation](one "rel-1") or [several relations](several "rel-1 rel-2").
|
|
|
|
|
|
|
|
[External links](http://example.com) are marked [as such](ftp://domain).
|
|
|
|
`, []note.Link{
|
|
|
|
{
|
|
|
|
Title: "link",
|
|
|
|
Href: "heading",
|
|
|
|
Rels: []string{},
|
|
|
|
External: false,
|
|
|
|
Snippet: "Heading with a [link](heading)",
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Title: "multiple links",
|
|
|
|
Href: "stripped-formatting",
|
|
|
|
Rels: []string{},
|
|
|
|
External: false,
|
|
|
|
Snippet: `Paragraph containing [multiple **links**](stripped-formatting), here's one [relative](../other).
|
|
|
|
A link can have [one relation](one "rel-1") or [several relations](several "rel-1 rel-2").`,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Title: "relative",
|
|
|
|
Href: "../other",
|
|
|
|
Rels: []string{},
|
|
|
|
External: false,
|
|
|
|
Snippet: `Paragraph containing [multiple **links**](stripped-formatting), here's one [relative](../other).
|
|
|
|
A link can have [one relation](one "rel-1") or [several relations](several "rel-1 rel-2").`,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Title: "one relation",
|
|
|
|
Href: "one",
|
|
|
|
Rels: []string{"rel-1"},
|
|
|
|
External: false,
|
|
|
|
Snippet: `Paragraph containing [multiple **links**](stripped-formatting), here's one [relative](../other).
|
|
|
|
A link can have [one relation](one "rel-1") or [several relations](several "rel-1 rel-2").`,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Title: "several relations",
|
|
|
|
Href: "several",
|
|
|
|
Rels: []string{"rel-1", "rel-2"},
|
|
|
|
External: false,
|
|
|
|
Snippet: `Paragraph containing [multiple **links**](stripped-formatting), here's one [relative](../other).
|
|
|
|
A link can have [one relation](one "rel-1") or [several relations](several "rel-1 rel-2").`,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Title: "External links",
|
|
|
|
Href: "http://example.com",
|
|
|
|
Rels: []string{},
|
|
|
|
External: true,
|
|
|
|
Snippet: `[External links](http://example.com) are marked [as such](ftp://domain).`,
|
|
|
|
},
|
|
|
|
{
|
|
|
|
Title: "as such",
|
|
|
|
Href: "ftp://domain",
|
|
|
|
Rels: []string{},
|
|
|
|
External: true,
|
|
|
|
Snippet: `[External links](http://example.com) are marked [as such](ftp://domain).`,
|
|
|
|
},
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
func parse(t *testing.T, source string) note.Content {
|
|
|
|
content, err := NewParser().Parse(source)
|
|
|
|
assert.Nil(t, err)
|
|
|
|
return *content
|
|
|
|
}
|