mirror of
				https://github.com/gohugoio/hugo.git
				synced 2024-05-11 05:54:58 +00: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