From 0f6b334b6715253b030c4e783b88e911b6e53e56 Mon Sep 17 00:00:00 2001 From: Sven Dowideit Date: Wed, 9 Sep 2015 10:03:38 +1000 Subject: Source file based relative linking ala GitHub repository markdown for both md files and non-md files Signed-off-by: Sven Dowideit --- helpers/content_renderer.go | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) (limited to 'helpers/content_renderer.go') diff --git a/helpers/content_renderer.go b/helpers/content_renderer.go index 00997900d..81386e03b 100644 --- a/helpers/content_renderer.go +++ b/helpers/content_renderer.go @@ -19,12 +19,18 @@ import ( "github.com/miekg/mmark" "github.com/russross/blackfriday" + jww "github.com/spf13/jwalterweatherman" "github.com/spf13/viper" ) +type LinkResolverFunc func(ref string) (string, error) +type FileResolverFunc func(ref string) (string, error) + // Wraps a blackfriday.Renderer, typically a blackfriday.Html // Enabling Hugo to customise the rendering experience type HugoHtmlRenderer struct { + FileResolver FileResolverFunc + LinkResolver LinkResolverFunc blackfriday.Renderer } @@ -38,6 +44,33 @@ func (renderer *HugoHtmlRenderer) BlockCode(out *bytes.Buffer, text []byte, lang } } +func (renderer *HugoHtmlRenderer) Link(out *bytes.Buffer, link []byte, title []byte, content []byte) { + if renderer.LinkResolver == nil || bytes.HasPrefix(link, []byte("{@{@HUGOSHORTCODE")) { + // Use the blackfriday built in Link handler + renderer.Renderer.Link(out, link, title, content) + } else { + newLink, err := renderer.LinkResolver(string(link)) + if err != nil { + newLink = string(link) + jww.ERROR.Printf("LinkResolver: %s", err) + } + renderer.Renderer.Link(out, []byte(newLink), title, content) + } +} +func (renderer *HugoHtmlRenderer) Image(out *bytes.Buffer, link []byte, title []byte, alt []byte) { + if renderer.FileResolver == nil || bytes.HasPrefix(link, []byte("{@{@HUGOSHORTCODE")) { + // Use the blackfriday built in Image handler + renderer.Renderer.Image(out, link, title, alt) + } else { + newLink, err := renderer.FileResolver(string(link)) + if err != nil { + newLink = string(link) + jww.ERROR.Printf("FileResolver: %s", err) + } + renderer.Renderer.Image(out, []byte(newLink), title, alt) + } +} + // Wraps a mmark.Renderer, typically a mmark.html // Enabling Hugo to customise the rendering experience type HugoMmarkHtmlRenderer struct { -- cgit v1.2.3