chore(templates): migrate pongo2/v6 -> block/ninjatpl v1.0.1
The legacy templates/pongo host runtime now uses the in-house ninjatpl fork. Mechanical import/ident swap — these files only use NewSet / TemplateLoader / Context / Must / Template, all identical in ninjatpl; no custom filters/tags or *Error signatures involved. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
parent
7089964f6b
commit
d94c979731
3
go.mod
3
go.mod
@ -4,9 +4,9 @@ go 1.26.4
|
|||||||
|
|
||||||
require (
|
require (
|
||||||
connectrpc.com/connect v1.20.0
|
connectrpc.com/connect v1.20.0
|
||||||
|
git.dev.alexdunmow.com/block/ninjatpl v1.0.1
|
||||||
github.com/BurntSushi/toml v1.6.0
|
github.com/BurntSushi/toml v1.6.0
|
||||||
github.com/a-h/templ v0.3.1020
|
github.com/a-h/templ v0.3.1020
|
||||||
github.com/flosch/pongo2/v6 v6.1.0
|
|
||||||
github.com/google/uuid v1.6.0
|
github.com/google/uuid v1.6.0
|
||||||
github.com/jackc/pgx/v5 v5.9.2
|
github.com/jackc/pgx/v5 v5.9.2
|
||||||
github.com/tetratelabs/wazero v1.12.0
|
github.com/tetratelabs/wazero v1.12.0
|
||||||
@ -18,7 +18,6 @@ require (
|
|||||||
require (
|
require (
|
||||||
github.com/jackc/pgpassfile v1.0.0 // indirect
|
github.com/jackc/pgpassfile v1.0.0 // indirect
|
||||||
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
|
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
|
||||||
github.com/rogpeppe/go-internal v1.15.0 // indirect
|
|
||||||
golang.org/x/sys v0.44.0 // indirect
|
golang.org/x/sys v0.44.0 // indirect
|
||||||
golang.org/x/text v0.36.0 // indirect
|
golang.org/x/text v0.36.0 // indirect
|
||||||
)
|
)
|
||||||
|
|||||||
12
go.sum
12
go.sum
@ -1,5 +1,7 @@
|
|||||||
connectrpc.com/connect v1.20.0 h1:6TNDAB+WeNd2uolWNlYczB5E0KNNaVMNUEx8JEUsPmQ=
|
connectrpc.com/connect v1.20.0 h1:6TNDAB+WeNd2uolWNlYczB5E0KNNaVMNUEx8JEUsPmQ=
|
||||||
connectrpc.com/connect v1.20.0/go.mod h1:A2ygJrukXwWy32vkCAAHNVguZrqZ+jeZ9rGRnGR4dN4=
|
connectrpc.com/connect v1.20.0/go.mod h1:A2ygJrukXwWy32vkCAAHNVguZrqZ+jeZ9rGRnGR4dN4=
|
||||||
|
git.dev.alexdunmow.com/block/ninjatpl v1.0.1 h1:LqMnvSOpQQ9uQ8Wez5U3epE7z5SGN4VdEtWL0cpf0Qw=
|
||||||
|
git.dev.alexdunmow.com/block/ninjatpl v1.0.1/go.mod h1:WrLz0KysnP5EzJlRCkU2VC1uvazyAXZR99Tn+3Mx1pw=
|
||||||
github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk=
|
github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk=
|
||||||
github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
|
github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
|
||||||
github.com/a-h/templ v0.3.1020 h1:ypAT/L5ySWEnZ6Zft/5yfoWXYYkhFNvEFOeeqecg4tw=
|
github.com/a-h/templ v0.3.1020 h1:ypAT/L5ySWEnZ6Zft/5yfoWXYYkhFNvEFOeeqecg4tw=
|
||||||
@ -7,8 +9,6 @@ github.com/a-h/templ v0.3.1020/go.mod h1:A2DlK61v+K+NRoGnhmYbNYVmtYHcFO5/AisMvBd
|
|||||||
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 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/flosch/pongo2/v6 v6.1.0 h1:A/NJbrQJJD2B2mbpw3DRFwBYG0xpCr3vwFlEr46y1HQ=
|
|
||||||
github.com/flosch/pongo2/v6 v6.1.0/go.mod h1:CuDpFm47R0uGGE7z13/tTlt1Y6zdxvr2RLT5LJhsHEU=
|
|
||||||
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
|
||||||
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
|
||||||
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
|
||||||
@ -21,14 +21,8 @@ github.com/jackc/pgx/v5 v5.9.2 h1:3ZhOzMWnR4yJ+RW1XImIPsD1aNSz4T4fyP7zlQb56hw=
|
|||||||
github.com/jackc/pgx/v5 v5.9.2/go.mod h1:mal1tBGAFfLHvZzaYh77YS/eC6IX9OWbRV1QIIM0Jn4=
|
github.com/jackc/pgx/v5 v5.9.2/go.mod h1:mal1tBGAFfLHvZzaYh77YS/eC6IX9OWbRV1QIIM0Jn4=
|
||||||
github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo=
|
github.com/jackc/puddle/v2 v2.2.2 h1:PR8nw+E/1w0GLuRFSmiioY6UooMp6KJv0/61nB7icHo=
|
||||||
github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
|
github.com/jackc/puddle/v2 v2.2.2/go.mod h1:vriiEXHvEE654aYKXXjOvZM39qJ0q+azkZFrfEOc3H4=
|
||||||
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
|
|
||||||
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
|
|
||||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
|
||||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
github.com/rogpeppe/go-internal v1.15.0 h1:D0RCU5rMAp+SpgkiNdrjfJ+LX4J1M32V2NeCY7EJ6hc=
|
|
||||||
github.com/rogpeppe/go-internal v1.15.0/go.mod h1:DrUVZyrJU+txYW5/1kwtXQSMFio52ZOxX7yM1VHvnxs=
|
|
||||||
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.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
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=
|
||||||
@ -49,8 +43,6 @@ golang.org/x/text v0.36.0/go.mod h1:NIdBknypM8iqVmPiuco0Dh6P5Jcdk8lJL0CUebqK164=
|
|||||||
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
|
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
|
||||||
google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
|
google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
|
|
||||||
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
|
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
|||||||
@ -4,15 +4,15 @@ import (
|
|||||||
"context"
|
"context"
|
||||||
"maps"
|
"maps"
|
||||||
|
|
||||||
"github.com/flosch/pongo2/v6"
|
"git.dev.alexdunmow.com/block/ninjatpl"
|
||||||
|
|
||||||
"git.dev.alexdunmow.com/block/core/blocks"
|
"git.dev.alexdunmow.com/block/core/blocks"
|
||||||
"git.dev.alexdunmow.com/block/core/templates/bn"
|
"git.dev.alexdunmow.com/block/core/templates/bn"
|
||||||
)
|
)
|
||||||
|
|
||||||
// buildPageContext builds a pongo2.Context with pre-rendered head/body HTML
|
// buildPageContext builds a ninjatpl.Context with pre-rendered head/body HTML
|
||||||
// and all page-level variables from the standard doc map.
|
// and all page-level variables from the standard doc map.
|
||||||
func (e *Engine) buildPageContext(ctx context.Context, doc map[string]any) pongo2.Context {
|
func (e *Engine) buildPageContext(ctx context.Context, doc map[string]any) ninjatpl.Context {
|
||||||
title := "Untitled"
|
title := "Untitled"
|
||||||
if t, ok := doc["title"].(string); ok && t != "" {
|
if t, ok := doc["title"].(string); ok && t != "" {
|
||||||
title = t
|
title = t
|
||||||
@ -72,7 +72,7 @@ func (e *Engine) buildPageContext(ctx context.Context, doc map[string]any) pongo
|
|||||||
slotsAny[k] = v
|
slotsAny[k] = v
|
||||||
}
|
}
|
||||||
|
|
||||||
return pongo2.Context{
|
return ninjatpl.Context{
|
||||||
"head_html": headHTML,
|
"head_html": headHTML,
|
||||||
"body_end_html": bodyEndHTML,
|
"body_end_html": bodyEndHTML,
|
||||||
"admin_banner_html": bannerHTML,
|
"admin_banner_html": bannerHTML,
|
||||||
@ -88,10 +88,10 @@ func (e *Engine) buildPageContext(ctx context.Context, doc map[string]any) pongo
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// buildBlockContext builds a pongo2.Context for block rendering.
|
// buildBlockContext builds a ninjatpl.Context for block rendering.
|
||||||
// Content fields are available directly; request context is under "ctx".
|
// Content fields are available directly; request context is under "ctx".
|
||||||
func buildBlockContext(ctx context.Context, content map[string]any) pongo2.Context {
|
func buildBlockContext(ctx context.Context, content map[string]any) ninjatpl.Context {
|
||||||
pongoCtx := make(pongo2.Context, len(content)+1)
|
pongoCtx := make(ninjatpl.Context, len(content)+1)
|
||||||
maps.Copy(pongoCtx, content)
|
maps.Copy(pongoCtx, content)
|
||||||
if bc := blocks.GetBlockContext(ctx); bc != nil {
|
if bc := blocks.GetBlockContext(ctx); bc != nil {
|
||||||
pongoCtx["ctx"] = bc.ToMap()
|
pongoCtx["ctx"] = bc.ToMap()
|
||||||
|
|||||||
@ -7,7 +7,7 @@ import (
|
|||||||
"io/fs"
|
"io/fs"
|
||||||
"maps"
|
"maps"
|
||||||
|
|
||||||
"github.com/flosch/pongo2/v6"
|
"git.dev.alexdunmow.com/block/ninjatpl"
|
||||||
|
|
||||||
"git.dev.alexdunmow.com/block/core/blocks"
|
"git.dev.alexdunmow.com/block/core/blocks"
|
||||||
"git.dev.alexdunmow.com/block/core/templates"
|
"git.dev.alexdunmow.com/block/core/templates"
|
||||||
@ -18,7 +18,7 @@ import (
|
|||||||
// MustPageTemplate / MustBlockTemplate to get functions compatible with
|
// MustPageTemplate / MustBlockTemplate to get functions compatible with
|
||||||
// the template and block registries.
|
// the template and block registries.
|
||||||
type Engine struct {
|
type Engine struct {
|
||||||
set *pongo2.TemplateSet
|
set *ninjatpl.TemplateSet
|
||||||
stylePaths []string
|
stylePaths []string
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -27,19 +27,19 @@ type Engine struct {
|
|||||||
// stylePaths are CSS URLs included in the page <head> via bn.Head.
|
// stylePaths are CSS URLs included in the page <head> via bn.Head.
|
||||||
func NewEngine(pluginFS fs.FS, stylePaths ...string) *Engine {
|
func NewEngine(pluginFS fs.FS, stylePaths ...string) *Engine {
|
||||||
loader := &multiLoader{
|
loader := &multiLoader{
|
||||||
loaders: []pongo2.TemplateLoader{
|
loaders: []ninjatpl.TemplateLoader{
|
||||||
&fsLoader{fsys: pluginFS},
|
&fsLoader{fsys: pluginFS},
|
||||||
&fsLoader{fsys: baseFS},
|
&fsLoader{fsys: baseFS},
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
set := pongo2.NewSet("plugin", loader)
|
set := ninjatpl.NewSet("plugin", loader)
|
||||||
return &Engine{set: set, stylePaths: stylePaths}
|
return &Engine{set: set, stylePaths: stylePaths}
|
||||||
}
|
}
|
||||||
|
|
||||||
// pongoComponent wraps a pongo2 template execution as an HTMLComponent.
|
// pongoComponent wraps a pongo2 template execution as an HTMLComponent.
|
||||||
type pongoComponent struct {
|
type pongoComponent struct {
|
||||||
tpl *pongo2.Template
|
tpl *ninjatpl.Template
|
||||||
ctx pongo2.Context
|
ctx ninjatpl.Context
|
||||||
}
|
}
|
||||||
|
|
||||||
func (c *pongoComponent) Render(ctx context.Context, w io.Writer) error {
|
func (c *pongoComponent) Render(ctx context.Context, w io.Writer) error {
|
||||||
@ -62,7 +62,7 @@ func (c *pongoComponent) Render(ctx context.Context, w io.Writer) error {
|
|||||||
// {{ site_settings }} — bn.SiteSettingsData struct
|
// {{ site_settings }} — bn.SiteSettingsData struct
|
||||||
// {{ page_meta }} — bn.PageMeta struct
|
// {{ page_meta }} — bn.PageMeta struct
|
||||||
func (e *Engine) MustPageTemplate(name string) templates.TemplateFunc {
|
func (e *Engine) MustPageTemplate(name string) templates.TemplateFunc {
|
||||||
tpl := pongo2.Must(e.set.FromFile(name))
|
tpl := ninjatpl.Must(e.set.FromFile(name))
|
||||||
return func(ctx context.Context, doc map[string]any) templates.HTMLComponent {
|
return func(ctx context.Context, doc map[string]any) templates.HTMLComponent {
|
||||||
pongoCtx := e.buildPageContext(ctx, doc)
|
pongoCtx := e.buildPageContext(ctx, doc)
|
||||||
return &pongoComponent{tpl: tpl, ctx: pongoCtx}
|
return &pongoComponent{tpl: tpl, ctx: pongoCtx}
|
||||||
@ -75,7 +75,7 @@ func (e *Engine) MustPageTemplate(name string) templates.TemplateFunc {
|
|||||||
// The content map fields are available directly as template variables.
|
// The content map fields are available directly as template variables.
|
||||||
// Request context is available under {{ ctx.url }}, {{ ctx.isEditor }}, etc.
|
// Request context is available under {{ ctx.url }}, {{ ctx.isEditor }}, etc.
|
||||||
func (e *Engine) MustBlockTemplate(name string) blocks.BlockFunc {
|
func (e *Engine) MustBlockTemplate(name string) blocks.BlockFunc {
|
||||||
tpl := pongo2.Must(e.set.FromFile(name))
|
tpl := ninjatpl.Must(e.set.FromFile(name))
|
||||||
return func(ctx context.Context, content map[string]any) string {
|
return func(ctx context.Context, content map[string]any) string {
|
||||||
pongoCtx := buildBlockContext(ctx, content)
|
pongoCtx := buildBlockContext(ctx, content)
|
||||||
out, err := tpl.Execute(pongoCtx)
|
out, err := tpl.Execute(pongoCtx)
|
||||||
@ -89,7 +89,7 @@ func (e *Engine) MustBlockTemplate(name string) blocks.BlockFunc {
|
|||||||
// MustBlockTemplateWithDefaults is like MustBlockTemplate but merges default
|
// MustBlockTemplateWithDefaults is like MustBlockTemplate but merges default
|
||||||
// values before rendering. Content keys override defaults.
|
// values before rendering. Content keys override defaults.
|
||||||
func (e *Engine) MustBlockTemplateWithDefaults(name string, defaults map[string]any) blocks.BlockFunc {
|
func (e *Engine) MustBlockTemplateWithDefaults(name string, defaults map[string]any) blocks.BlockFunc {
|
||||||
tpl := pongo2.Must(e.set.FromFile(name))
|
tpl := ninjatpl.Must(e.set.FromFile(name))
|
||||||
return func(ctx context.Context, content map[string]any) string {
|
return func(ctx context.Context, content map[string]any) string {
|
||||||
merged := make(map[string]any, len(defaults)+len(content))
|
merged := make(map[string]any, len(defaults)+len(content))
|
||||||
maps.Copy(merged, defaults)
|
maps.Copy(merged, defaults)
|
||||||
@ -129,9 +129,9 @@ func (e *Engine) MustTemplateOverride(name string) blocks.BlockFunc {
|
|||||||
// {{ colors.muted }} — muted hex color
|
// {{ colors.muted }} — muted hex color
|
||||||
// (and all other EmailColors fields as lowercase keys)
|
// (and all other EmailColors fields as lowercase keys)
|
||||||
func (e *Engine) MustEmailWrapper(name string) templates.EmailWrapperFunc {
|
func (e *Engine) MustEmailWrapper(name string) templates.EmailWrapperFunc {
|
||||||
tpl := pongo2.Must(e.set.FromFile(name))
|
tpl := ninjatpl.Must(e.set.FromFile(name))
|
||||||
return func(body string, ctx templates.EmailContext) string {
|
return func(body string, ctx templates.EmailContext) string {
|
||||||
pongoCtx := pongo2.Context{
|
pongoCtx := ninjatpl.Context{
|
||||||
"body": body,
|
"body": body,
|
||||||
"site_name": ctx.SiteSettings.SiteName,
|
"site_name": ctx.SiteSettings.SiteName,
|
||||||
"site_url": ctx.SiteSettings.SiteURL,
|
"site_url": ctx.SiteSettings.SiteURL,
|
||||||
|
|||||||
@ -5,7 +5,7 @@ import (
|
|||||||
"io"
|
"io"
|
||||||
"io/fs"
|
"io/fs"
|
||||||
|
|
||||||
"github.com/flosch/pongo2/v6"
|
"git.dev.alexdunmow.com/block/ninjatpl"
|
||||||
)
|
)
|
||||||
|
|
||||||
// fsLoader adapts an fs.FS to pongo2's TemplateLoader interface.
|
// fsLoader adapts an fs.FS to pongo2's TemplateLoader interface.
|
||||||
@ -25,7 +25,7 @@ func (l *fsLoader) Get(path string) (io.Reader, error) {
|
|||||||
// Plugin templates can {% extends "base.html" %} where base.html
|
// Plugin templates can {% extends "base.html" %} where base.html
|
||||||
// lives in the core embedded FS rather than the plugin FS.
|
// lives in the core embedded FS rather than the plugin FS.
|
||||||
type multiLoader struct {
|
type multiLoader struct {
|
||||||
loaders []pongo2.TemplateLoader
|
loaders []ninjatpl.TemplateLoader
|
||||||
}
|
}
|
||||||
|
|
||||||
func (l *multiLoader) Abs(base, name string) string {
|
func (l *multiLoader) Abs(base, name string) string {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user