shithub: hugo

Download patch

ref: 020a6fbd7f6996ed84d80ba6c37fe0d8c2536806
parent: b152216d5c8adbf1bfa4c6fb7b2a50b6866c685e
author: Niklas Fasching <[email protected]>
date: Thu Oct 3 19:27:51 EDT 2019

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.

--- a/helpers/content.go
+++ b/helpers/content.go
@@ -27,6 +27,7 @@
 	"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 @@
 	"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 @@
 // 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 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, "")
--- a/hugolib/page__per_output.go
+++ b/hugolib/page__per_output.go
@@ -143,6 +143,7 @@
 					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 @@
 	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()})
 }