Fix bugs surrounding adding funcs to a template
This commit is contained in:
parent
5e3421a0a7
commit
891e4dc140
@ -2,8 +2,10 @@ package step
|
|||||||
|
|
||||||
import "os"
|
import "os"
|
||||||
import "io"
|
import "io"
|
||||||
|
import "fmt"
|
||||||
import "time"
|
import "time"
|
||||||
import "io/fs"
|
import "io/fs"
|
||||||
|
import "errors"
|
||||||
import "context"
|
import "context"
|
||||||
import "path/filepath"
|
import "path/filepath"
|
||||||
import "html/template"
|
import "html/template"
|
||||||
@ -107,28 +109,47 @@ func (this *Environment) parse (name string, modTime time.Time, input io.Reader)
|
|||||||
document.Extends = extends
|
document.Extends = extends
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// add template functions
|
||||||
|
funcMap := make(template.FuncMap)
|
||||||
|
for name, function := range this.funcMap {
|
||||||
|
funcMap[name] = function
|
||||||
|
}
|
||||||
|
for _, provider := range this.FuncProviders {
|
||||||
|
provider, ok := provider.(FuncProviderFor)
|
||||||
|
if !ok { continue }
|
||||||
|
funcMapFor := provider.FuncMapFor(document)
|
||||||
|
if funcMapFor == nil { continue }
|
||||||
|
for name, function := range funcMapFor {
|
||||||
|
funcMap[name] = function
|
||||||
|
}
|
||||||
|
}
|
||||||
|
err = this.addFuncsTo(document, funcMap)
|
||||||
|
if err != nil { return nil, err }
|
||||||
|
|
||||||
// parse template from the body
|
// parse template from the body
|
||||||
document.template.Funcs(this.funcMap)
|
|
||||||
// TODO catch template errors here and offset their row number by the
|
// TODO catch template errors here and offset their row number by the
|
||||||
// number of rows taken up by the front matter
|
// number of rows taken up by the front matter
|
||||||
_, err = document.template.Parse(body)
|
_, err = document.template.Parse(body)
|
||||||
if err != nil { return nil, err }
|
if err != nil { return nil, err }
|
||||||
|
|
||||||
// add template functions which need a document pointer for context
|
|
||||||
for _, provider := range this.FuncProviders {
|
|
||||||
provider, ok := provider.(FuncProviderFor)
|
|
||||||
if !ok { continue }
|
|
||||||
funcMap := provider.FuncMapFor(document)
|
|
||||||
if funcMap == nil { continue }
|
|
||||||
for name, function := range funcMap {
|
|
||||||
this.funcMap[name] = function
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
documents[name] = document
|
documents[name] = document
|
||||||
return document, nil
|
return document, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (this *Environment) addFuncsTo (document *Document, funcs template.FuncMap) (err error) {
|
||||||
|
defer func () {
|
||||||
|
if r := recover(); r != nil {
|
||||||
|
if rerr, ok := err.(error); ok {
|
||||||
|
err = rerr
|
||||||
|
} else {
|
||||||
|
err = errors.New(fmt.Sprint(r))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} ()
|
||||||
|
document.template.Funcs(funcs)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
// GetFS returns the effective filesystem that the environment uses.
|
// GetFS returns the effective filesystem that the environment uses.
|
||||||
func (this *Environment) GetFS () fs.FS {
|
func (this *Environment) GetFS () fs.FS {
|
||||||
if this.FS == nil {
|
if this.FS == nil {
|
||||||
|
Loading…
Reference in New Issue
Block a user