mirror of
https://github.com/gohugoio/hugo.git
synced 2025-08-31 22:41:53 +02:00
Add render template hooks for headings
This commit also * Renames previous types to be non-specific. (e.g. hookedRenderer rather than linkRenderer) Resolves #6713
This commit is contained in:
committed by
Bjørn Erik Pedersen
parent
991934497e
commit
423b8f2fb8
@@ -375,48 +375,54 @@ func (ps *pageState) initCommonProviders(pp pagePaths) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (p *pageState) createRenderHooks(f output.Format) (*hooks.Render, error) {
|
||||
|
||||
func (p *pageState) createRenderHooks(f output.Format) (*hooks.Renderers, error) {
|
||||
layoutDescriptor := p.getLayoutDescriptor()
|
||||
layoutDescriptor.RenderingHook = true
|
||||
layoutDescriptor.LayoutOverride = false
|
||||
layoutDescriptor.Layout = ""
|
||||
|
||||
var renderers hooks.Renderers
|
||||
|
||||
layoutDescriptor.Kind = "render-link"
|
||||
linkTempl, linkTemplFound, err := p.s.Tmpl().LookupLayout(layoutDescriptor, f)
|
||||
templ, templFound, err := p.s.Tmpl().LookupLayout(layoutDescriptor, f)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if templFound {
|
||||
renderers.LinkRenderer = hookRenderer{
|
||||
templateHandler: p.s.Tmpl(),
|
||||
Provider: templ.(tpl.Info),
|
||||
templ: templ,
|
||||
}
|
||||
}
|
||||
|
||||
layoutDescriptor.Kind = "render-image"
|
||||
imgTempl, imgTemplFound, err := p.s.Tmpl().LookupLayout(layoutDescriptor, f)
|
||||
templ, templFound, err = p.s.Tmpl().LookupLayout(layoutDescriptor, f)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
var linkRenderer hooks.LinkRenderer
|
||||
var imageRenderer hooks.LinkRenderer
|
||||
|
||||
if linkTemplFound {
|
||||
linkRenderer = contentLinkRenderer{
|
||||
if templFound {
|
||||
renderers.ImageRenderer = hookRenderer{
|
||||
templateHandler: p.s.Tmpl(),
|
||||
Provider: linkTempl.(tpl.Info),
|
||||
templ: linkTempl,
|
||||
Provider: templ.(tpl.Info),
|
||||
templ: templ,
|
||||
}
|
||||
}
|
||||
|
||||
if imgTemplFound {
|
||||
imageRenderer = contentLinkRenderer{
|
||||
layoutDescriptor.Kind = "render-heading"
|
||||
templ, templFound, err = p.s.Tmpl().LookupLayout(layoutDescriptor, f)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if templFound {
|
||||
renderers.HeadingRenderer = hookRenderer{
|
||||
templateHandler: p.s.Tmpl(),
|
||||
Provider: imgTempl.(tpl.Info),
|
||||
templ: imgTempl,
|
||||
Provider: templ.(tpl.Info),
|
||||
templ: templ,
|
||||
}
|
||||
}
|
||||
|
||||
return &hooks.Render{
|
||||
LinkRenderer: linkRenderer,
|
||||
ImageRenderer: imageRenderer,
|
||||
}, nil
|
||||
return &renderers, nil
|
||||
}
|
||||
|
||||
func (p *pageState) getLayoutDescriptor() output.LayoutDescriptor {
|
||||
|
@@ -245,7 +245,7 @@ type pageContentOutput struct {
|
||||
placeholdersEnabledInit sync.Once
|
||||
|
||||
// May be nil.
|
||||
renderHooks *hooks.Render
|
||||
renderHooks *hooks.Renderers
|
||||
// Set if there are more than one output format variant
|
||||
renderHooksHaveVariants bool // TODO(bep) reimplement this in another way, consolidate with shortcodes
|
||||
|
||||
|
@@ -1650,14 +1650,20 @@ var infoOnMissingLayout = map[string]bool{
|
||||
"404": true,
|
||||
}
|
||||
|
||||
type contentLinkRenderer struct {
|
||||
// hookRenderer is the canonical implementation of all hooks.ITEMRenderer,
|
||||
// where ITEM is the thing being hooked.
|
||||
type hookRenderer struct {
|
||||
templateHandler tpl.TemplateHandler
|
||||
identity.Provider
|
||||
templ tpl.Template
|
||||
}
|
||||
|
||||
func (r contentLinkRenderer) Render(w io.Writer, ctx hooks.LinkContext) error {
|
||||
return r.templateHandler.Execute(r.templ, w, ctx)
|
||||
func (hr hookRenderer) RenderLink(w io.Writer, ctx hooks.LinkContext) error {
|
||||
return hr.templateHandler.Execute(hr.templ, w, ctx)
|
||||
}
|
||||
|
||||
func (hr hookRenderer) RenderHeading(w io.Writer, ctx hooks.HeadingContext) error {
|
||||
return hr.templateHandler.Execute(hr.templ, w, ctx)
|
||||
}
|
||||
|
||||
func (s *Site) renderForTemplate(name, outputFormat string, d interface{}, w io.Writer, templ tpl.Template) (err error) {
|
||||
|
Reference in New Issue
Block a user