ref: 603b24a16344b1da485043e8a60b0505ad18cee6
parent: e68e7ef96fb7a83319f6d828799524f85c75c5eb
author: Austin Ziegler <[email protected]>
date: Mon Sep 29 06:02:45 EDT 2014
Make each generated page’s footnotes unique. If content pages are fully rendered in a list page, footnotes that use the same reference (`[^fn]`) will have duplicated anchors. This change builds on #526 to put the page filename (`Page.File.Name`) as part of the anchor for a footnote. This would fix discussion [116](http://discuss.gohugo.io/t/footnote-references-are-duplicated-on-list-pages/116).
--- a/hugolib/page.go
+++ b/hugolib/page.go
@@ -119,30 +119,30 @@
}
func (p *Page) renderBytes(content []byte) []byte {
- return renderBytes(content, p.guessMarkupType())
+ return renderBytes(content, p.guessMarkupType(), p.File.Name)
}
func (p *Page) renderContent(content []byte) []byte {
- return renderBytesWithTOC(content, p.guessMarkupType())
+ return renderBytesWithTOC(content, p.guessMarkupType(), p.File.Name)
}
-func renderBytesWithTOC(content []byte, pagefmt string) []byte {
+func renderBytesWithTOC(content []byte, pagefmt string, footnoteref string) []byte {
switch pagefmt {
default:
- return markdownRenderWithTOC(content)
+ return markdownRenderWithTOC(content, footnoteref)
case "markdown":
- return markdownRenderWithTOC(content)
+ return markdownRenderWithTOC(content, footnoteref)
case "rst":
return []byte(getRstContent(content))
}
}
-func renderBytes(content []byte, pagefmt string) []byte {
+func renderBytes(content []byte, pagefmt string, footnoteref string) []byte {
switch pagefmt {
default:
- return markdownRender(content)
+ return markdownRender(content, footnoteref)
case "markdown":
- return markdownRender(content)
+ return markdownRender(content, footnoteref)
case "rst":
return []byte(getRstContent(content))
}
@@ -671,13 +671,18 @@
return nil
}
-func getHtmlRenderer(withTOC bool) blackfriday.Renderer {
+func getHtmlRenderer(defaultFlags int, footnoteref string) blackfriday.Renderer {
renderParameters := blackfriday.HtmlRendererParameters{
FootnoteAnchorPrefix: viper.GetString("FootnoteAnchorPrefix"),
FootnoteReturnLinkContents: viper.GetString("FootnoteReturnLinkContents"),
}
- htmlFlags := 0
+ if len(footnoteref) != 0 {
+ renderParameters.FootnoteAnchorPrefix = footnoteref + ":" +
+ renderParameters.FootnoteAnchorPrefix
+ }
+
+ htmlFlags := defaultFlags
htmlFlags |= blackfriday.HTML_USE_XHTML
htmlFlags |= blackfriday.HTML_USE_SMARTYPANTS
htmlFlags |= blackfriday.HTML_SMARTYPANTS_FRACTIONS
@@ -684,10 +689,6 @@
htmlFlags |= blackfriday.HTML_SMARTYPANTS_LATEX_DASHES
htmlFlags |= blackfriday.HTML_FOOTNOTE_RETURN_LINKS
- if withTOC {
- htmlFlags |= blackfriday.HTML_TOC
- }
-
return blackfriday.HtmlRendererWithParameters(htmlFlags, "", "", renderParameters)
}
@@ -699,13 +700,14 @@
blackfriday.EXTENSION_HEADER_IDS
}
-func markdownRender(content []byte) []byte {
- return blackfriday.Markdown(content, getHtmlRenderer(false),
+func markdownRender(content []byte, footnoteref string) []byte {
+ return blackfriday.Markdown(content, getHtmlRenderer(0, footnoteref),
getMarkdownExtensions())
}
-func markdownRenderWithTOC(content []byte) []byte {
- return blackfriday.Markdown(content, getHtmlRenderer(true),
+func markdownRenderWithTOC(content []byte, footnoteref string) []byte {
+ return blackfriday.Markdown(content,
+ getHtmlRenderer(blackfriday.HTML_TOC, footnoteref),
getMarkdownExtensions())
}
--- a/hugolib/shortcode.go
+++ b/hugolib/shortcode.go
@@ -93,7 +93,7 @@
var data = &ShortcodeWithPage{Params: params, Page: p}
if endStart > 0 {
s := stringToParse[leadEnd+3 : leadEnd+endStart]
- data.Inner = template.HTML(renderBytes([]byte(CleanP(ShortcodesHandle(s, p, t))), p.guessMarkupType()))
+ data.Inner = template.HTML(renderBytes([]byte(CleanP(ShortcodesHandle(s, p, t))), p.guessMarkupType(), p.File.Name))
remainder := CleanP(stringToParse[leadEnd+endEnd:])
return CleanP(stringToParse[:leadStart]) +