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.
This commit is contained in:
Niklas Fasching 2019-10-03 23:27:51 +02:00 committed by Bjørn Erik Pedersen
parent b152216d5c
commit 020a6fbd7f
2 changed files with 8 additions and 0 deletions

View file

@ -27,6 +27,7 @@ import (
"unicode/utf8" "unicode/utf8"
"github.com/gohugoio/hugo/common/maps" "github.com/gohugoio/hugo/common/maps"
"github.com/gohugoio/hugo/hugolib/filesystems"
"github.com/niklasfasching/go-org/org" "github.com/niklasfasching/go-org/org"
bp "github.com/gohugoio/hugo/bufferpool" bp "github.com/gohugoio/hugo/bufferpool"
@ -34,6 +35,7 @@ import (
"github.com/miekg/mmark" "github.com/miekg/mmark"
"github.com/mitchellh/mapstructure" "github.com/mitchellh/mapstructure"
"github.com/russross/blackfriday" "github.com/russross/blackfriday"
"github.com/spf13/afero"
jww "github.com/spf13/jwalterweatherman" jww "github.com/spf13/jwalterweatherman"
"strings" "strings"
@ -466,6 +468,7 @@ func ExtractTOC(content []byte) (newcontent []byte, toc []byte) {
// for a given content rendering. // for a given content rendering.
// By creating you must set the Config, otherwise it will panic. // By creating you must set the Config, otherwise it will panic.
type RenderingContext struct { type RenderingContext struct {
BaseFs *filesystems.BaseFs
Content []byte Content []byte
PageFmt string PageFmt string
DocumentID string DocumentID string
@ -752,6 +755,9 @@ func getPandocContent(ctx *RenderingContext) []byte {
func orgRender(ctx *RenderingContext, c ContentSpec) []byte { func orgRender(ctx *RenderingContext, c ContentSpec) []byte {
config := org.New() config := org.New()
config.Log = jww.WARN config.Log = jww.WARN
config.ReadFile = func(filename string) ([]byte, error) {
return afero.ReadFile(ctx.BaseFs.Content.Fs, filename)
}
writer := org.NewHTMLWriter() writer := org.NewHTMLWriter()
writer.HighlightCodeBlock = func(source, lang string) string { writer.HighlightCodeBlock = func(source, lang string) string {
highlightedSource, err := c.Highlight(source, lang, "") highlightedSource, err := c.Highlight(source, lang, "")

View file

@ -143,6 +143,7 @@ func newPageContentOutput(p *pageState) func(f output.Format) (*pageContentOutpu
html := cp.p.s.ContentSpec.RenderBytes(&helpers.RenderingContext{ html := cp.p.s.ContentSpec.RenderBytes(&helpers.RenderingContext{
Content: []byte(cp.p.m.summary), RenderTOC: false, PageFmt: cp.p.m.markup, Content: []byte(cp.p.m.summary), RenderTOC: false, PageFmt: cp.p.m.markup,
Cfg: p.Language(), Cfg: p.Language(),
BaseFs: p.s.BaseFs,
DocumentID: p.File().UniqueID(), DocumentName: p.File().Path(), DocumentID: p.File().UniqueID(), DocumentName: p.File().Path(),
Config: cp.p.getRenderingConfig()}) Config: cp.p.getRenderingConfig()})
html = cp.p.s.ContentSpec.TrimShortHTML(html) 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{ return cp.p.s.ContentSpec.RenderBytes(&helpers.RenderingContext{
Content: content, RenderTOC: true, PageFmt: cp.p.m.markup, Content: content, RenderTOC: true, PageFmt: cp.p.m.markup,
Cfg: p.Language(), Cfg: p.Language(),
BaseFs: cp.p.s.BaseFs,
DocumentID: p.File().UniqueID(), DocumentName: p.File().Path(), DocumentID: p.File().UniqueID(), DocumentName: p.File().Path(),
Config: cp.p.getRenderingConfig()}) Config: cp.p.getRenderingConfig()})
} }