qt "github.com/frankban/quicktest"
)
+func TestRenderHookEditNestedPartial(t *testing.T) {
+ config := `
+baseURL="https://example.org"
+workingDir="/mywork"
+`
+ b := newTestSitesBuilder(t).WithWorkingDir("/mywork").WithConfigFile("toml", config).Running()
+
+ b.WithTemplates("_default/single.html", "{{ .Content }}")
+ b.WithTemplates("partials/mypartial1.html", `PARTIAL1 {{ partial "mypartial2.html" }}`)
+ b.WithTemplates("partials/mypartial2.html", `PARTIAL2`)
+ b.WithTemplates("_default/_markup/render-link.html", `Link {{ .Text | safeHTML }}|{{ partial "mypartial1.html" . }}END`)
+
+ b.WithContent("p1.md", `---
+title: P1
+---
+
+[First Link](https://www.google.com "Google's Homepage")
+
+`)
+ b.Build(BuildCfg{})
+
+ b.AssertFileContent("public/p1/index.html", `Link First Link|PARTIAL1 PARTIAL2END`)
+
+ b.EditFiles("layouts/partials/mypartial1.html", `PARTIAL1_EDITED {{ partial "mypartial2.html" }}`)
+
+ b.Build(BuildCfg{})
+
+ b.AssertFileContent("public/p1/index.html", `Link First Link|PARTIAL1_EDITED PARTIAL2END`)
+
+ b.EditFiles("layouts/partials/mypartial2.html", `PARTIAL2_EDITED`)
+
+ b.Build(BuildCfg{})
+
+ b.AssertFileContent("public/p1/index.html", `Link First Link|PARTIAL1_EDITED PARTIAL2_EDITEDEND`)
+
+}
+
func TestRenderHooks(t *testing.T) {
config := `
baseURL="https://example.org"
if templFound {
renderers.LinkRenderer = hookRenderer{
templateHandler: p.s.Tmpl(),
- Provider: templ.(tpl.Info),
+ SearchProvider: templ.(identity.SearchProvider),
templ: templ,
}
}
if templFound {
renderers.ImageRenderer = hookRenderer{
templateHandler: p.s.Tmpl(),
- Provider: templ.(tpl.Info),
+ SearchProvider: templ.(identity.SearchProvider),
templ: templ,
}
}
if templFound {
renderers.HeadingRenderer = hookRenderer{
templateHandler: p.s.Tmpl(),
- Provider: templ.(tpl.Info),
+ SearchProvider: templ.(identity.SearchProvider),
templ: templ,
}
}
// where ITEM is the thing being hooked.
type hookRenderer struct {
templateHandler tpl.TemplateHandler
- identity.Provider
+ identity.SearchProvider
templ tpl.Template
}
// Manager manages identities, and is itself a Provider of Identity.
type Manager interface {
- IdentitiesProvider
- Provider
+ SearchProvider
Add(ids ...Provider)
- Search(id Identity) Provider
Reset()
}
+// SearchProvider provides access to the chained set of identities.
+type SearchProvider interface {
+ Provider
+ IdentitiesProvider
+ Search(id Identity) Provider
+}
+
// A PathIdentity is a common identity identified by a type and a path, e.g. "layouts" and "_default/single.html".
type PathIdentity struct {
Type string
type renderContextData interface {
RenderContext() converter.RenderContext
DocumentContext() converter.DocumentContext
- AddIdentity(id identity.Identity)
+ AddIdentity(id identity.Provider)
}
type renderContextDataHolder struct {
return ctx.dctx
}
-func (ctx *renderContextDataHolder) AddIdentity(id identity.Identity) {
+func (ctx *renderContextDataHolder) AddIdentity(id identity.Provider) {
ctx.ids.Add(id)
}
},
)
- ctx.AddIdentity(h.ImageRenderer.GetIdentity())
+ ctx.AddIdentity(h.ImageRenderer)
return ast.WalkContinue, err
},
)
- ctx.AddIdentity(h.LinkRenderer.GetIdentity())
+ // TODO(bep) I have a working branch that fixes these rather confusing identity types,
+ // but for now it's important that it's not .GetIdentity() that's added here,
+ // to make sure we search the entire chain on changes.
+ ctx.AddIdentity(h.LinkRenderer)
return ast.WalkContinue, err
}
},
)
- ctx.AddIdentity(h.HeadingRenderer.GetIdentity())
+ ctx.AddIdentity(h.HeadingRenderer)
return ast.WalkContinue, err
}