diff options
author | Austin Ziegler <austin@zieglers.ca> | 2014-09-29 10:02:45 -0400 |
---|---|---|
committer | spf13 <steve.francia@gmail.com> | 2014-10-07 16:44:28 -0400 |
commit | 603b24a16344b1da485043e8a60b0505ad18cee6 (patch) | |
tree | 3e55df6f3a1fe09159c09b30606df540134e153c | |
parent | e68e7ef96fb7a83319f6d828799524f85c75c5eb (diff) |
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).
-rw-r--r-- | hugolib/page.go | 38 | ||||
-rw-r--r-- | 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]) + |