Refactor template renderer

main-old
Antonio De Lucreziis 3 years ago
parent 5b0fb7fa8a
commit a53ee26e78

@ -3,11 +3,11 @@ module git.phc.dm.unipi.it/phc/website
go 1.13 go 1.13
require ( require (
github.com/alecthomas/chroma v0.9.4 // indirect github.com/alecthomas/chroma v0.9.4
github.com/go-chi/chi/v5 v5.0.7 github.com/go-chi/chi/v5 v5.0.7
github.com/joho/godotenv v1.4.0 github.com/joho/godotenv v1.4.0
github.com/litao91/goldmark-mathjax v0.0.0-20210217064022-a43cf739a50f github.com/litao91/goldmark-mathjax v0.0.0-20210217064022-a43cf739a50f
github.com/yuin/goldmark v1.4.4 github.com/yuin/goldmark v1.4.4
github.com/yuin/goldmark-highlighting v0.0.0-20210516132338-9216f9c5aa01 // indirect github.com/yuin/goldmark-highlighting v0.0.0-20210516132338-9216f9c5aa01
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b
) )

@ -1,18 +1,15 @@
github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38/go.mod h1:r7bzyVFMNntcxPZXK3/+KdruV1H5KSlyVY0gc+NgInI= github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38/go.mod h1:r7bzyVFMNntcxPZXK3/+KdruV1H5KSlyVY0gc+NgInI=
github.com/alecthomas/chroma v0.7.2-0.20200305040604-4f3623dce67a h1:3v1NrYWWqp2S72e4HLgxKt83B3l0lnORDholH/ihoMM=
github.com/alecthomas/chroma v0.7.2-0.20200305040604-4f3623dce67a/go.mod h1:fv5SzZPFJbwp2NXJWpFIX7DZS4HgV1K4ew4Pc2OZD9s= github.com/alecthomas/chroma v0.7.2-0.20200305040604-4f3623dce67a/go.mod h1:fv5SzZPFJbwp2NXJWpFIX7DZS4HgV1K4ew4Pc2OZD9s=
github.com/alecthomas/chroma v0.9.4 h1:YL7sOAE3p8HS96T9km7RgvmsZIctqbK1qJ0b7hzed44= github.com/alecthomas/chroma v0.9.4 h1:YL7sOAE3p8HS96T9km7RgvmsZIctqbK1qJ0b7hzed44=
github.com/alecthomas/chroma v0.9.4/go.mod h1:jtJATyUxlIORhUOFNA9NZDWGAQ8wpxQQqNSB4rjA/1s= github.com/alecthomas/chroma v0.9.4/go.mod h1:jtJATyUxlIORhUOFNA9NZDWGAQ8wpxQQqNSB4rjA/1s=
github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721/go.mod h1:QO9JBoKquHd+jz9nshCh40fOfO+JzsoXy8qTHF68zU0= github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721/go.mod h1:QO9JBoKquHd+jz9nshCh40fOfO+JzsoXy8qTHF68zU0=
github.com/alecthomas/kong v0.2.1-0.20190708041108-0548c6b1afae/go.mod h1:+inYUSluD+p4L8KdviBSgzcqEjUQOfC5fQDRFuc36lI= github.com/alecthomas/kong v0.2.1-0.20190708041108-0548c6b1afae/go.mod h1:+inYUSluD+p4L8KdviBSgzcqEjUQOfC5fQDRFuc36lI=
github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ=
github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 h1:y5HC9v93H5EPKqaS1UYVg1uYah5Xf51mBfIoWehClUQ=
github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk= github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk=
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dlclark/regexp2 v1.1.6/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dlclark/regexp2 v1.1.6/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
github.com/dlclark/regexp2 v1.2.0 h1:8sAhBGEM0dRWogWqWyQeIJnxjWO6oIjl8FKqREDsGfk=
github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dlclark/regexp2 v1.2.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E= github.com/dlclark/regexp2 v1.4.0 h1:F1rxgk7p4uKjwIQxBs9oAXe5CqrXlCduYEJvrF4u93E=
github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= github.com/dlclark/regexp2 v1.4.0/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc=
@ -32,7 +29,6 @@ github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAm
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.6.1 h1:hDPOHmpOpP40lSULcqw7IrRb/u7w6RpDC9399XyoNd0=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY= github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=

@ -29,9 +29,10 @@ func main() {
// Templates & Renderer // Templates & Renderer
renderer := templates.NewRenderer( renderer := templates.NewRenderer(
"./views/", "./views/",
templates.File("./views/base.html"), "./views/base.html",
templates.Pattern("./views/partials/*.html"), "./views/partials/*.html",
) )
newsArticlesRegistry := articles.NewRegistry("./news") newsArticlesRegistry := articles.NewRegistry("./news")
// Routes // Routes

@ -10,88 +10,72 @@ import (
"git.phc.dm.unipi.it/phc/website/util" "git.phc.dm.unipi.it/phc/website/util"
) )
type LoadTemplate interface {
Load(t *template.Template) (*template.Template, error)
}
type File string
func (file File) Load(t *template.Template) (*template.Template, error) {
return t.ParseFiles(string(file))
}
type Pattern string
func (pattern Pattern) Load(t *template.Template) (*template.Template, error) {
return t.ParseGlob(string(pattern))
}
type CachedTemplate struct { type CachedTemplate struct {
Loaders []LoadTemplate LoadPatterns []string
template *template.Template cachedTmpl *template.Template
} }
func NewCacheTemplate(loaders ...LoadTemplate) *CachedTemplate { func NewCacheTemplate(loadPatterns ...string) *CachedTemplate {
cachedTemplate := &CachedTemplate{ cachedTemplate := &CachedTemplate{
Loaders: loaders, LoadPatterns: loadPatterns,
template: nil, cachedTmpl: nil,
} }
template.Must(cachedTemplate.Load(template.New(""))) template.Must(cachedTemplate.Load(template.New("")))
return cachedTemplate return cachedTemplate
} }
func (ct *CachedTemplate) Load(t *template.Template) (*template.Template, error) { func (ct *CachedTemplate) Load(t *template.Template) (*template.Template, error) {
if ct.template != nil { if ct.cachedTmpl != nil {
return ct.template, nil return ct.cachedTmpl, nil
} }
ct.template = t ct.cachedTmpl = t
for _, loader := range ct.Loaders { for _, pattern := range ct.LoadPatterns {
var err error var err error
ct.template, err = loader.Load(ct.template) ct.cachedTmpl, err = ct.cachedTmpl.ParseGlob(pattern)
if err != nil { if err != nil {
return nil, err return nil, err
} }
} }
return ct.template, nil return ct.cachedTmpl, nil
} }
func (ct *CachedTemplate) Reload() { func (ct *CachedTemplate) Reload() {
ct.template = nil ct.cachedTmpl = nil
template.Must(ct.Load(nil)) template.Must(ct.Load(nil))
} }
func (ct *CachedTemplate) Template() *template.Template { func (ct *CachedTemplate) Template() *template.Template {
return ct.template return ct.cachedTmpl
} }
// Renderer holds cached templates for rendering // Renderer holds cached templates for rendering
type Renderer struct { type Renderer struct {
rootPath string rootPath string
baseLoaders []LoadTemplate loadPatterns []string
routes map[string]*CachedTemplate templateCache map[string]*CachedTemplate
} }
// NewRenderer constructs a template renderer with a base file // NewRenderer constructs a template renderer with a base file
func NewRenderer(rootPath string, loaders ...LoadTemplate) *Renderer { func NewRenderer(rootPath string, loadPatterns ...string) *Renderer {
return &Renderer{ return &Renderer{
rootPath, rootPath,
loaders, loadPatterns,
map[string]*CachedTemplate{}, map[string]*CachedTemplate{},
} }
} }
func (r *Renderer) Load(name string) *CachedTemplate { func (r *Renderer) Load(name string) *CachedTemplate {
cachedTemplate, present := r.routes[name] cachedTemplate, present := r.templateCache[name]
if !present { if !present {
loaders := []LoadTemplate{} loaders := []string{}
loaders = append(loaders, r.baseLoaders...) loaders = append(loaders, r.loadPatterns...)
loaders = append(loaders, File(path.Join(r.rootPath, name))) loaders = append(loaders, path.Join(r.rootPath, name))
cachedTemplate = NewCacheTemplate(loaders...) cachedTemplate = NewCacheTemplate(loaders...)
r.routes[name] = cachedTemplate r.templateCache[name] = cachedTemplate
} }
return cachedTemplate return cachedTemplate

@ -28,7 +28,7 @@
</div> </div>
<div class="date">yyyy-mm-dd</div> <div class="date">yyyy-mm-dd</div>
<div class="description"> <div class="description">
Lorem ipsum dolor sit amet consectetur adipisicing elit. Quis nemo aperiam, voluptas quam alias esse sed natus tempore suscipit fugiat sit delectus exercitationem numquam ipsum assumenda recusandae consequatur... much doge, ipsum dolor sit amet consectetur adipisicing elit. Quis nemo aperiam, voluptas quam alias esse sed natus tempore suscipit fugiat sit delectus exercitationem numquam ipsum assumenda recusandae consequatur...
</div> </div>
</div> </div>

Loading…
Cancel
Save