mirror of
https://github.com/gohugoio/hugo.git
synced 2024-11-21 20:46:30 -05:00
Enable descriptive header IDs.
Enable blackfriday.EXTENSION_AUTO_HEADER_IDS to generate the name of the header ID from the text in the header. Works for prefix and underline headers. - TOC extraction had to be modified to look for `<li><a href="#`> instead of `#toc_` because of this change. - Fixed a number of tests that depended on the presence of `toc_` with as an `id` or as a `href` value. - Renames the earlier parameter `footnoteref` to `documentId` as it more accurately represents the nature of the parameter. The `documentId` is appended to all generated headers through the new HTML renderer parameter `HeaderIDSuffix`.
This commit is contained in:
parent
0282c922b4
commit
8f9cea7f58
4 changed files with 25 additions and 25 deletions
|
@ -69,15 +69,15 @@ func BytesToHTML(b []byte) template.HTML {
|
|||
return template.HTML(string(b))
|
||||
}
|
||||
|
||||
func GetHtmlRenderer(defaultFlags int, footnoteref string) blackfriday.Renderer {
|
||||
func GetHtmlRenderer(defaultFlags int, documentId string) blackfriday.Renderer {
|
||||
renderParameters := blackfriday.HtmlRendererParameters{
|
||||
FootnoteAnchorPrefix: viper.GetString("FootnoteAnchorPrefix"),
|
||||
FootnoteReturnLinkContents: viper.GetString("FootnoteReturnLinkContents"),
|
||||
}
|
||||
|
||||
if len(footnoteref) != 0 {
|
||||
renderParameters.FootnoteAnchorPrefix = footnoteref + ":" +
|
||||
renderParameters.FootnoteAnchorPrefix
|
||||
if len(documentId) != 0 {
|
||||
renderParameters.FootnoteAnchorPrefix = documentId + ":" + renderParameters.FootnoteAnchorPrefix
|
||||
renderParameters.HeaderIDSuffix = ":" + documentId
|
||||
}
|
||||
|
||||
htmlFlags := defaultFlags
|
||||
|
@ -95,17 +95,17 @@ func GetMarkdownExtensions() int {
|
|||
blackfriday.EXTENSION_TABLES | blackfriday.EXTENSION_FENCED_CODE |
|
||||
blackfriday.EXTENSION_AUTOLINK | blackfriday.EXTENSION_STRIKETHROUGH |
|
||||
blackfriday.EXTENSION_SPACE_HEADERS | blackfriday.EXTENSION_FOOTNOTES |
|
||||
blackfriday.EXTENSION_HEADER_IDS
|
||||
blackfriday.EXTENSION_HEADER_IDS | blackfriday.EXTENSION_AUTO_HEADER_IDS
|
||||
}
|
||||
|
||||
func MarkdownRender(content []byte, footnoteref string) []byte {
|
||||
return blackfriday.Markdown(content, GetHtmlRenderer(0, footnoteref),
|
||||
func MarkdownRender(content []byte, documentId string) []byte {
|
||||
return blackfriday.Markdown(content, GetHtmlRenderer(0, documentId),
|
||||
GetMarkdownExtensions())
|
||||
}
|
||||
|
||||
func MarkdownRenderWithTOC(content []byte, footnoteref string) []byte {
|
||||
func MarkdownRenderWithTOC(content []byte, documentId string) []byte {
|
||||
return blackfriday.Markdown(content,
|
||||
GetHtmlRenderer(blackfriday.HTML_TOC, footnoteref),
|
||||
GetHtmlRenderer(blackfriday.HTML_TOC, documentId),
|
||||
GetMarkdownExtensions())
|
||||
}
|
||||
|
||||
|
@ -132,7 +132,7 @@ func ExtractTOC(content []byte) (newcontent []byte, toc []byte) {
|
|||
return StripEmptyNav(content), toc
|
||||
}
|
||||
// Need to peek ahead to see if this nav element is actually the right one.
|
||||
correctNav := bytes.Index(content[startOfTOC:peekEnd], []byte(`#toc_0`))
|
||||
correctNav := bytes.Index(content[startOfTOC:peekEnd], []byte(`<li><a href="#`))
|
||||
if correctNav < 0 { // no match found
|
||||
return content, toc
|
||||
}
|
||||
|
@ -144,23 +144,23 @@ func ExtractTOC(content []byte) (newcontent []byte, toc []byte) {
|
|||
return
|
||||
}
|
||||
|
||||
func RenderBytesWithTOC(content []byte, pagefmt string, footnoteref string) []byte {
|
||||
func RenderBytesWithTOC(content []byte, pagefmt string, documentId string) []byte {
|
||||
switch pagefmt {
|
||||
default:
|
||||
return MarkdownRenderWithTOC(content, footnoteref)
|
||||
return MarkdownRenderWithTOC(content, documentId)
|
||||
case "markdown":
|
||||
return MarkdownRenderWithTOC(content, footnoteref)
|
||||
return MarkdownRenderWithTOC(content, documentId)
|
||||
case "rst":
|
||||
return []byte(GetRstContent(content))
|
||||
}
|
||||
}
|
||||
|
||||
func RenderBytes(content []byte, pagefmt string, footnoteref string) []byte {
|
||||
func RenderBytes(content []byte, pagefmt string, documentId string) []byte {
|
||||
switch pagefmt {
|
||||
default:
|
||||
return MarkdownRender(content, footnoteref)
|
||||
return MarkdownRender(content, documentId)
|
||||
case "markdown":
|
||||
return MarkdownRender(content, footnoteref)
|
||||
return MarkdownRender(content, documentId)
|
||||
case "rst":
|
||||
return []byte(GetRstContent(content))
|
||||
}
|
||||
|
|
|
@ -368,8 +368,8 @@ func TestTableOfContents(t *testing.T) {
|
|||
if err != nil {
|
||||
t.Fatalf("Unable to create a page with frontmatter and body content: %s", err)
|
||||
}
|
||||
checkPageContent(t, p, "\n\n<p>For some moments the old man did not reply. He stood with bowed head, buried in deep thought. But at last he spoke.</p>\n\n<h2 id=\"toc_0\">AA</h2>\n\n<p>I have no idea, of course, how long it took me to reach the limit of the plain,\nbut at last I entered the foothills, following a pretty little canyon upward\ntoward the mountains. Beside me frolicked a laughing brooklet, hurrying upon\nits noisy way down to the silent sea. In its quieter pools I discovered many\nsmall fish, of four-or five-pound weight I should imagine. In appearance,\nexcept as to size and color, they were not unlike the whale of our own seas. As\nI watched them playing about I discovered, not only that they suckled their\nyoung, but that at intervals they rose to the surface to breathe as well as to\nfeed upon certain grasses and a strange, scarlet lichen which grew upon the\nrocks just above the water line.</p>\n\n<h3 id=\"toc_1\">AAA</h3>\n\n<p>I remember I felt an extraordinary persuasion that I was being played with,\nthat presently, when I was upon the very verge of safety, this mysterious\ndeath–as swift as the passage of light–would leap after me from the pit about\nthe cylinder and strike me down. ## BB</p>\n\n<h3 id=\"toc_2\">BBB</h3>\n\n<p>“You’re a great Granser,” he cried delightedly, “always making believe them little marks mean something.”</p>\n")
|
||||
checkPageTOC(t, p, "<nav id=\"TableOfContents\">\n<ul>\n<li>\n<ul>\n<li><a href=\"#toc_0\">AA</a>\n<ul>\n<li><a href=\"#toc_1\">AAA</a></li>\n<li><a href=\"#toc_2\">BBB</a></li>\n</ul></li>\n</ul></li>\n</ul>\n</nav>")
|
||||
checkPageContent(t, p, "\n\n<p>For some moments the old man did not reply. He stood with bowed head, buried in deep thought. But at last he spoke.</p>\n\n<h2 id=\"aa:90b9174a5bdb091a9625b04adac96ca6\">AA</h2>\n\n<p>I have no idea, of course, how long it took me to reach the limit of the plain,\nbut at last I entered the foothills, following a pretty little canyon upward\ntoward the mountains. Beside me frolicked a laughing brooklet, hurrying upon\nits noisy way down to the silent sea. In its quieter pools I discovered many\nsmall fish, of four-or five-pound weight I should imagine. In appearance,\nexcept as to size and color, they were not unlike the whale of our own seas. As\nI watched them playing about I discovered, not only that they suckled their\nyoung, but that at intervals they rose to the surface to breathe as well as to\nfeed upon certain grasses and a strange, scarlet lichen which grew upon the\nrocks just above the water line.</p>\n\n<h3 id=\"aaa:90b9174a5bdb091a9625b04adac96ca6\">AAA</h3>\n\n<p>I remember I felt an extraordinary persuasion that I was being played with,\nthat presently, when I was upon the very verge of safety, this mysterious\ndeath–as swift as the passage of light–would leap after me from the pit about\nthe cylinder and strike me down. ## BB</p>\n\n<h3 id=\"bbb:90b9174a5bdb091a9625b04adac96ca6\">BBB</h3>\n\n<p>“You’re a great Granser,” he cried delightedly, “always making believe them little marks mean something.”</p>\n")
|
||||
checkPageTOC(t, p, "<nav id=\"TableOfContents\">\n<ul>\n<li>\n<ul>\n<li><a href=\"#aa:90b9174a5bdb091a9625b04adac96ca6\">AA</a>\n<ul>\n<li><a href=\"#aaa:90b9174a5bdb091a9625b04adac96ca6\">AAA</a></li>\n<li><a href=\"#bbb:90b9174a5bdb091a9625b04adac96ca6\">BBB</a></li>\n</ul></li>\n</ul></li>\n</ul>\n</nav>")
|
||||
}
|
||||
|
||||
func TestPageWithMoreTag(t *testing.T) {
|
||||
|
|
|
@ -74,7 +74,7 @@ func TestInnerSCWithMarkdown(t *testing.T) {
|
|||
|
||||
[link](http://spf13.com) and text
|
||||
|
||||
{{% /inside %}}`, "<div><h1>More Here</h1>\n\n<p><a href=\"http://spf13.com\">link</a> and text</p>\n</div>", tem)
|
||||
{{% /inside %}}`, "<div><h1 id=\"more-here:bec3ed8ba720b9073ab75abcf3ba5d97\">More Here</h1>\n\n<p><a href=\"http://spf13.com\">link</a> and text</p>\n</div>", tem)
|
||||
}
|
||||
|
||||
func TestInnerSCWithAndWithoutMarkdown(t *testing.T) {
|
||||
|
@ -96,7 +96,7 @@ And then:
|
|||
This is **plain** text.
|
||||
|
||||
{{< /inside >}}
|
||||
`, "<div><h1>More Here</h1>\n\n<p><a href=\"http://spf13.com\">link</a> and text</p>\n</div>\n\nAnd then:\n\n<div>\n# More Here\n\nThis is **plain** text.\n\n</div>\n", tem)
|
||||
`, "<div><h1 id=\"more-here:bec3ed8ba720b9073ab75abcf3ba5d97\">More Here</h1>\n\n<p><a href=\"http://spf13.com\">link</a> and text</p>\n</div>\n\nAnd then:\n\n<div>\n# More Here\n\nThis is **plain** text.\n\n</div>\n", tem)
|
||||
}
|
||||
|
||||
func TestEmbeddedSC(t *testing.T) {
|
||||
|
|
|
@ -112,7 +112,7 @@ func TestRenderThing(t *testing.T) {
|
|||
}{
|
||||
{PAGE_SIMPLE_TITLE, TEMPLATE_TITLE, "simple template"},
|
||||
{PAGE_SIMPLE_TITLE, TEMPLATE_FUNC, "simple-template"},
|
||||
{PAGE_WITH_MD, TEMPLATE_CONTENT, "\n\n<h1 id=\"toc_0\">heading 1</h1>\n\n<p>text</p>\n\n<h2 id=\"toc_1\">heading 2</h2>\n\n<p>more text</p>\n"},
|
||||
{PAGE_WITH_MD, TEMPLATE_CONTENT, "\n\n<h1 id=\"heading-1:91b5c4a22fc6103c73bb91e4a40568f8\">heading 1</h1>\n\n<p>text</p>\n\n<h2 id=\"heading-2:91b5c4a22fc6103c73bb91e4a40568f8\">heading 2</h2>\n\n<p>more text</p>\n"},
|
||||
{SIMPLE_PAGE_RFC3339_DATE, TEMPLATE_DATE, "2013-05-17 16:59:30 +0000 UTC"},
|
||||
}
|
||||
|
||||
|
@ -337,14 +337,14 @@ func TestSkipRender(t *testing.T) {
|
|||
doc string
|
||||
expected string
|
||||
}{
|
||||
{"sect/doc1.html", "\n\n<h1 id=\"toc_0\">title</h1>\n\n<p>some <em>content</em></p>\n"},
|
||||
{"sect/doc1.html", "\n\n<h1 id=\"title:5d74edbb89ef198cd37882b687940cda\">title</h1>\n\n<p>some <em>content</em></p>\n"},
|
||||
{"sect/doc2.html", "<!doctype html><html><body>more content</body></html>"},
|
||||
{"sect/doc3.html", "\n\n<h1 id=\"toc_0\">doc3</h1>\n\n<p><em>some</em> content</p>\n"},
|
||||
{"sect/doc4.html", "\n\n<h1 id=\"toc_0\">doc4</h1>\n\n<p><em>some content</em></p>\n"},
|
||||
{"sect/doc3.html", "\n\n<h1 id=\"doc3:28c75a9e2162b8eccda73a1ab9ce80b4\">doc3</h1>\n\n<p><em>some</em> content</p>\n"},
|
||||
{"sect/doc4.html", "\n\n<h1 id=\"doc4:f8e6806123f341b8975509637645a4d3\">doc4</h1>\n\n<p><em>some content</em></p>\n"},
|
||||
{"sect/doc5.html", "<!doctype html><html><head><script src=\"script.js\"></script></head><body>body5</body></html>"},
|
||||
{"sect/doc6.html", "<!doctype html><html><head><script src=\"http://auth/bub/script.js\"></script></head><body>body5</body></html>"},
|
||||
{"doc7.html", "<html><body>doc7 content</body></html>"},
|
||||
{"sect/doc8.html", "\n\n<h1 id=\"toc_0\">title</h1>\n\n<p>some <em>content</em></p>\n"},
|
||||
{"sect/doc8.html", "\n\n<h1 id=\"title:0ae308ad73e2f37bd09874105281b5d8\">title</h1>\n\n<p>some <em>content</em></p>\n"},
|
||||
}
|
||||
|
||||
for _, test := range tests {
|
||||
|
|
Loading…
Reference in a new issue