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).
This commit is contained in:
Austin Ziegler 2014-09-29 10:02:45 -04:00 committed by spf13
parent e68e7ef96f
commit 603b24a163
2 changed files with 21 additions and 19 deletions

View file

@ -119,30 +119,30 @@ func bytesToHTML(b []byte) template.HTML {
} }
func (p *Page) renderBytes(content []byte) []byte { 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 { 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 { switch pagefmt {
default: default:
return markdownRenderWithTOC(content) return markdownRenderWithTOC(content, footnoteref)
case "markdown": case "markdown":
return markdownRenderWithTOC(content) return markdownRenderWithTOC(content, footnoteref)
case "rst": case "rst":
return []byte(getRstContent(content)) return []byte(getRstContent(content))
} }
} }
func renderBytes(content []byte, pagefmt string) []byte { func renderBytes(content []byte, pagefmt string, footnoteref string) []byte {
switch pagefmt { switch pagefmt {
default: default:
return markdownRender(content) return markdownRender(content, footnoteref)
case "markdown": case "markdown":
return markdownRender(content) return markdownRender(content, footnoteref)
case "rst": case "rst":
return []byte(getRstContent(content)) return []byte(getRstContent(content))
} }
@ -671,23 +671,24 @@ func (page *Page) Convert() error {
return nil return nil
} }
func getHtmlRenderer(withTOC bool) blackfriday.Renderer { func getHtmlRenderer(defaultFlags int, footnoteref string) blackfriday.Renderer {
renderParameters := blackfriday.HtmlRendererParameters{ renderParameters := blackfriday.HtmlRendererParameters{
FootnoteAnchorPrefix: viper.GetString("FootnoteAnchorPrefix"), FootnoteAnchorPrefix: viper.GetString("FootnoteAnchorPrefix"),
FootnoteReturnLinkContents: viper.GetString("FootnoteReturnLinkContents"), 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_XHTML
htmlFlags |= blackfriday.HTML_USE_SMARTYPANTS htmlFlags |= blackfriday.HTML_USE_SMARTYPANTS
htmlFlags |= blackfriday.HTML_SMARTYPANTS_FRACTIONS htmlFlags |= blackfriday.HTML_SMARTYPANTS_FRACTIONS
htmlFlags |= blackfriday.HTML_SMARTYPANTS_LATEX_DASHES htmlFlags |= blackfriday.HTML_SMARTYPANTS_LATEX_DASHES
htmlFlags |= blackfriday.HTML_FOOTNOTE_RETURN_LINKS htmlFlags |= blackfriday.HTML_FOOTNOTE_RETURN_LINKS
if withTOC {
htmlFlags |= blackfriday.HTML_TOC
}
return blackfriday.HtmlRendererWithParameters(htmlFlags, "", "", renderParameters) return blackfriday.HtmlRendererWithParameters(htmlFlags, "", "", renderParameters)
} }
@ -699,13 +700,14 @@ func getMarkdownExtensions() int {
blackfriday.EXTENSION_HEADER_IDS blackfriday.EXTENSION_HEADER_IDS
} }
func markdownRender(content []byte) []byte { func markdownRender(content []byte, footnoteref string) []byte {
return blackfriday.Markdown(content, getHtmlRenderer(false), return blackfriday.Markdown(content, getHtmlRenderer(0, footnoteref),
getMarkdownExtensions()) getMarkdownExtensions())
} }
func markdownRenderWithTOC(content []byte) []byte { func markdownRenderWithTOC(content []byte, footnoteref string) []byte {
return blackfriday.Markdown(content, getHtmlRenderer(true), return blackfriday.Markdown(content,
getHtmlRenderer(blackfriday.HTML_TOC, footnoteref),
getMarkdownExtensions()) getMarkdownExtensions())
} }

View file

@ -93,7 +93,7 @@ func ShortcodesHandle(stringToParse string, p *Page, t Template) string {
var data = &ShortcodeWithPage{Params: params, Page: p} var data = &ShortcodeWithPage{Params: params, Page: p}
if endStart > 0 { if endStart > 0 {
s := stringToParse[leadEnd+3 : leadEnd+endStart] 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:]) remainder := CleanP(stringToParse[leadEnd+endEnd:])
return CleanP(stringToParse[:leadStart]) + return CleanP(stringToParse[:leadStart]) +