From 020a6fbd7f6996ed84d80ba6c37fe0d8c2536806 Mon Sep 17 00:00:00 2001 From: Niklas Fasching Date: Thu, 3 Oct 2019 23:27:51 +0200 Subject: [PATCH] Add BaseFs to RenderingContext The org mode renderer supports including other files [1]. We don't want to allow reading of arbitrary files (go-org defaults to ioutil.ReadFile [2]) but want to make use of the FileSystem abstractions hugo provides. For starters we will allow reading from the content directory only [1]: e.g. `#+INCLUDE: ./foo.py src python` includes `foo.py` as a python source block. --- helpers/content.go | 6 ++++++ hugolib/page__per_output.go | 2 ++ 2 files changed, 8 insertions(+) diff --git a/helpers/content.go b/helpers/content.go index f6576c04f..591403cb0 100644 --- a/helpers/content.go +++ b/helpers/content.go @@ -27,6 +27,7 @@ import ( "unicode/utf8" "github.com/gohugoio/hugo/common/maps" + "github.com/gohugoio/hugo/hugolib/filesystems" "github.com/niklasfasching/go-org/org" bp "github.com/gohugoio/hugo/bufferpool" @@ -34,6 +35,7 @@ import ( "github.com/miekg/mmark" "github.com/mitchellh/mapstructure" "github.com/russross/blackfriday" + "github.com/spf13/afero" jww "github.com/spf13/jwalterweatherman" "strings" @@ -466,6 +468,7 @@ func ExtractTOC(content []byte) (newcontent []byte, toc []byte) { // for a given content rendering. // By creating you must set the Config, otherwise it will panic. type RenderingContext struct { + BaseFs *filesystems.BaseFs Content []byte PageFmt string DocumentID string @@ -752,6 +755,9 @@ func getPandocContent(ctx *RenderingContext) []byte { func orgRender(ctx *RenderingContext, c ContentSpec) []byte { config := org.New() config.Log = jww.WARN + config.ReadFile = func(filename string) ([]byte, error) { + return afero.ReadFile(ctx.BaseFs.Content.Fs, filename) + } writer := org.NewHTMLWriter() writer.HighlightCodeBlock = func(source, lang string) string { highlightedSource, err := c.Highlight(source, lang, "") diff --git a/hugolib/page__per_output.go b/hugolib/page__per_output.go index 3638f9669..6a1262703 100644 --- a/hugolib/page__per_output.go +++ b/hugolib/page__per_output.go @@ -143,6 +143,7 @@ func newPageContentOutput(p *pageState) func(f output.Format) (*pageContentOutpu html := cp.p.s.ContentSpec.RenderBytes(&helpers.RenderingContext{ Content: []byte(cp.p.m.summary), RenderTOC: false, PageFmt: cp.p.m.markup, Cfg: p.Language(), + BaseFs: p.s.BaseFs, DocumentID: p.File().UniqueID(), DocumentName: p.File().Path(), Config: cp.p.getRenderingConfig()}) html = cp.p.s.ContentSpec.TrimShortHTML(html) @@ -314,6 +315,7 @@ func (cp *pageContentOutput) renderContent(p page.Page, content []byte) []byte { return cp.p.s.ContentSpec.RenderBytes(&helpers.RenderingContext{ Content: content, RenderTOC: true, PageFmt: cp.p.m.markup, Cfg: p.Language(), + BaseFs: cp.p.s.BaseFs, DocumentID: p.File().UniqueID(), DocumentName: p.File().Path(), Config: cp.p.getRenderingConfig()}) }