From 603b24a16344b1da485043e8a60b0505ad18cee6 Mon Sep 17 00:00:00 2001 From: Austin Ziegler Date: Mon, 29 Sep 2014 10:02:45 -0400 Subject: [PATCH] =?UTF-8?q?Make=20each=20generated=20page=E2=80=99s=20foot?= =?UTF-8?q?notes=20unique.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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). --- hugolib/page.go | 38 ++++++++++++++++++++------------------ hugolib/shortcode.go | 2 +- 2 files changed, 21 insertions(+), 19 deletions(-) diff --git a/hugolib/page.go b/hugolib/page.go index 4f2c6c483..165d3992a 100644 --- a/hugolib/page.go +++ b/hugolib/page.go @@ -119,30 +119,30 @@ func bytesToHTML(b []byte) template.HTML { } 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,23 +671,24 @@ func (page *Page) Convert() error { 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 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 @@ func getMarkdownExtensions() int { 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()) } diff --git a/hugolib/shortcode.go b/hugolib/shortcode.go index 823426738..9f7a335a0 100644 --- a/hugolib/shortcode.go +++ b/hugolib/shortcode.go @@ -93,7 +93,7 @@ func ShortcodesHandle(stringToParse string, p *Page, t Template) string { 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]) +