diff options
author | Eli W. Hunter <elihunter173@gmail.com> | 2020-03-14 17:43:10 +0300 |
---|---|---|
committer | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2020-05-15 22:12:43 +0300 |
commit | 423b8f2fb834139cf31514b14b1c1bf28e43b384 (patch) | |
tree | dcd2d3c2dfcc5e2960056462c2d048906b1acc55 /hugolib | |
parent | 991934497e88dcd4134a369a213bb5072c51c139 (diff) |
Add render template hooks for headings
This commit also
* Renames previous types to be non-specific. (e.g. hookedRenderer rather
than linkRenderer)
Resolves #6713
Diffstat (limited to 'hugolib')
-rw-r--r-- | hugolib/page.go | 46 | ||||
-rw-r--r-- | hugolib/page__per_output.go | 2 | ||||
-rw-r--r-- | hugolib/site.go | 12 |
3 files changed, 36 insertions, 24 deletions
diff --git a/hugolib/page.go b/hugolib/page.go index fddc25fa0..bd518c1e1 100644 --- a/hugolib/page.go +++ b/hugolib/page.go @@ -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 { diff --git a/hugolib/page__per_output.go b/hugolib/page__per_output.go index d7841f178..77a01801d 100644 --- a/hugolib/page__per_output.go +++ b/hugolib/page__per_output.go @@ -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 diff --git a/hugolib/site.go b/hugolib/site.go index 5688b5fac..34671443e 100644 --- a/hugolib/site.go +++ b/hugolib/site.go @@ -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) { |