shithub: hugo

Download patch

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]) +