Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix output format handling for render hooks #8310

Merged
merged 1 commit into from
Mar 9, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 12 additions & 1 deletion hugolib/content_render_hooks_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -315,8 +315,10 @@ func TestRenderHooksRSS(t *testing.T) {

b.WithTemplates("index.html", `
{{ $p := site.GetPage "p1.md" }}
{{ $p2 := site.GetPage "p2.md" }}

P1: {{ $p.Content }}
P2: {{ $p2.Content }}

`, "index.xml", `

Expand All @@ -330,19 +332,23 @@ P3: {{ $p3.Content }}
`,
"_default/_markup/render-link.html", `html-link: {{ .Destination | safeURL }}|`,
"_default/_markup/render-link.rss.xml", `xml-link: {{ .Destination | safeURL }}|`,
"_default/_markup/render-heading.html", `html-heading: {{ .Text }}|`,
"_default/_markup/render-heading.rss.xml", `xml-heading: {{ .Text }}|`,
)

b.WithContent("p1.md", `---
title: "p1"
---
P1. [I'm an inline-style link](https://www.gohugo.io)

# Heading in p1

`, "p2.md", `---
title: "p2"
---
P1. [I'm an inline-style link](https://www.bep.is)

# Heading in p2

`,
"p3.md", `---
Expand All @@ -356,10 +362,15 @@ P3. [I'm an inline-style link](https://www.example.org)

b.Build(BuildCfg{})

b.AssertFileContent("public/index.html", "P1: <p>P1. html-link: https://www.gohugo.io|</p>")
b.AssertFileContent("public/index.html", `
P1: <p>P1. html-link: https://www.gohugo.io|</p>
html-heading: Heading in p1|
html-heading: Heading in p2|
`)
b.AssertFileContent("public/index.xml", `
P2: <p>P1. xml-link: https://www.bep.is|</p>
P3: <p>P3. xml-link: https://www.example.org|</p>
xml-heading: Heading in p2|
`)
}

Expand Down
10 changes: 5 additions & 5 deletions hugolib/page.go
Original file line number Diff line number Diff line change
Expand Up @@ -390,7 +390,7 @@ func (ps *pageState) initCommonProviders(pp pagePaths) error {
return nil
}

func (p *pageState) createRenderHooks(f output.Format) (*hooks.Renderers, error) {
func (p *pageState) createRenderHooks(f output.Format) (hooks.Renderers, error) {
layoutDescriptor := p.getLayoutDescriptor()
layoutDescriptor.RenderingHook = true
layoutDescriptor.LayoutOverride = false
Expand All @@ -401,7 +401,7 @@ func (p *pageState) createRenderHooks(f output.Format) (*hooks.Renderers, error)
layoutDescriptor.Kind = "render-link"
templ, templFound, err := p.s.Tmpl().LookupLayout(layoutDescriptor, f)
if err != nil {
return nil, err
return renderers, err
}
if templFound {
renderers.LinkRenderer = hookRenderer{
Expand All @@ -414,7 +414,7 @@ func (p *pageState) createRenderHooks(f output.Format) (*hooks.Renderers, error)
layoutDescriptor.Kind = "render-image"
templ, templFound, err = p.s.Tmpl().LookupLayout(layoutDescriptor, f)
if err != nil {
return nil, err
return renderers, err
}
if templFound {
renderers.ImageRenderer = hookRenderer{
Expand All @@ -427,7 +427,7 @@ func (p *pageState) createRenderHooks(f output.Format) (*hooks.Renderers, error)
layoutDescriptor.Kind = "render-heading"
templ, templFound, err = p.s.Tmpl().LookupLayout(layoutDescriptor, f)
if err != nil {
return nil, err
return renderers, err
}
if templFound {
renderers.HeadingRenderer = hookRenderer{
Expand All @@ -437,7 +437,7 @@ func (p *pageState) createRenderHooks(f output.Format) (*hooks.Renderers, error)
}
}

return &renderers, nil
return renderers, nil
}

func (p *pageState) getLayoutDescriptor() output.LayoutDescriptor {
Expand Down
33 changes: 30 additions & 3 deletions hugolib/page__output.go
Original file line number Diff line number Diff line change
Expand Up @@ -107,12 +107,39 @@ func (o *pageOutput) initRenderHooks() error {
h, err := ps.createRenderHooks(o.f)
if err != nil {
initErr = err
}
if h == nil {
return
}

o.cp.renderHooks.hooks = h

if !o.cp.renderHooksHaveVariants || h.IsZero() {
// Check if there is a different render hooks template
// for any of the other page output formats.
// If not, we can reuse this.
for _, po := range ps.pageOutputs {
if po.f.Name != o.f.Name {
h2, err := ps.createRenderHooks(po.f)
if err != nil {
initErr = err
return
}

if h2.IsZero() {
continue
}

if o.cp.renderHooks.hooks.IsZero() {
o.cp.renderHooks.hooks = h2
}

o.cp.renderHooksHaveVariants = !h2.Eq(o.cp.renderHooks.hooks)

if o.cp.renderHooksHaveVariants {
break
}

}
}
}
})

return initErr
Expand Down
2 changes: 1 addition & 1 deletion hugolib/page__per_output.go
Original file line number Diff line number Diff line change
Expand Up @@ -226,7 +226,7 @@ func newPageContentOutput(p *pageState, po *pageOutput) (*pageContentOutput, err
}

type renderHooks struct {
hooks *hooks.Renderers
hooks hooks.Renderers
init sync.Once
}

Expand Down
2 changes: 1 addition & 1 deletion markup/converter/converter.go
Original file line number Diff line number Diff line change
Expand Up @@ -127,7 +127,7 @@ type DocumentContext struct {
type RenderContext struct {
Src []byte
RenderTOC bool
RenderHooks *hooks.Renderers
RenderHooks hooks.Renderers
}

var FeatureRenderHooks = identity.NewPathIdentity("markup", "renderingHooks")
54 changes: 47 additions & 7 deletions markup/converter/hooks/hooks.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,9 @@
package hooks

import (
"fmt"
"io"
"strings"

"github.com/gohugoio/hugo/identity"
)
Expand Down Expand Up @@ -67,26 +69,64 @@ type Renderers struct {
HeadingRenderer HeadingRenderer
}

func (r *Renderers) Eq(other interface{}) bool {
ro, ok := other.(*Renderers)
func (r Renderers) Eq(other interface{}) bool {
ro, ok := other.(Renderers)
if !ok {
return false
}
if r == nil || ro == nil {
return r == nil

if r.IsZero() || ro.IsZero() {
return r.IsZero() && ro.IsZero()
}

if r.ImageRenderer.GetIdentity() != ro.ImageRenderer.GetIdentity() {
var b1, b2 bool
b1, b2 = r.ImageRenderer == nil, ro.ImageRenderer == nil
if (b1 || b2) && (b1 != b2) {
return false
}
if !b1 && r.ImageRenderer.GetIdentity() != ro.ImageRenderer.GetIdentity() {
return false
}

if r.LinkRenderer.GetIdentity() != ro.LinkRenderer.GetIdentity() {
b1, b2 = r.LinkRenderer == nil, ro.LinkRenderer == nil
if (b1 || b2) && (b1 != b2) {
return false
}
if !b1 && r.LinkRenderer.GetIdentity() != ro.LinkRenderer.GetIdentity() {
return false
}

if r.HeadingRenderer.GetIdentity() != ro.HeadingRenderer.GetIdentity() {
b1, b2 = r.HeadingRenderer == nil, ro.HeadingRenderer == nil
if (b1 || b2) && (b1 != b2) {
return false
}
if !b1 && r.HeadingRenderer.GetIdentity() != ro.HeadingRenderer.GetIdentity() {
return false
}

return true
}

func (r Renderers) IsZero() bool {
return r.HeadingRenderer == nil && r.LinkRenderer == nil && r.ImageRenderer == nil
}

func (r Renderers) String() string {
if r.IsZero() {
return "<zero>"
}

var sb strings.Builder

if r.LinkRenderer != nil {
sb.WriteString(fmt.Sprintf("LinkRenderer<%s>|", r.LinkRenderer.GetIdentity()))
}
if r.HeadingRenderer != nil {
sb.WriteString(fmt.Sprintf("HeadingRenderer<%s>|", r.HeadingRenderer.GetIdentity()))
}
if r.ImageRenderer != nil {
sb.WriteString(fmt.Sprintf("ImageRenderer<%s>|", r.ImageRenderer.GetIdentity()))
}

return sb.String()
}
12 changes: 6 additions & 6 deletions markup/goldmark/render_hooks.go
Original file line number Diff line number Diff line change
Expand Up @@ -206,12 +206,12 @@ func (r *hookedRenderer) renderDefaultImage(w util.BufWriter, source []byte, nod

func (r *hookedRenderer) renderImage(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) {
n := node.(*ast.Image)
var h *hooks.Renderers
var h hooks.Renderers

ctx, ok := w.(*renderContext)
if ok {
h = ctx.RenderContext().RenderHooks
ok = h != nil && h.ImageRenderer != nil
ok = h.ImageRenderer != nil
}

if !ok {
Expand Down Expand Up @@ -267,12 +267,12 @@ func (r *hookedRenderer) renderDefaultLink(w util.BufWriter, source []byte, node

func (r *hookedRenderer) renderLink(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) {
n := node.(*ast.Link)
var h *hooks.Renderers
var h hooks.Renderers

ctx, ok := w.(*renderContext)
if ok {
h = ctx.RenderContext().RenderHooks
ok = h != nil && h.LinkRenderer != nil
ok = h.LinkRenderer != nil
}

if !ok {
Expand Down Expand Up @@ -326,12 +326,12 @@ func (r *hookedRenderer) renderDefaultHeading(w util.BufWriter, source []byte, n

func (r *hookedRenderer) renderHeading(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) {
n := node.(*ast.Heading)
var h *hooks.Renderers
var h hooks.Renderers

ctx, ok := w.(*renderContext)
if ok {
h = ctx.RenderContext().RenderHooks
ok = h != nil && h.HeadingRenderer != nil
ok = h.HeadingRenderer != nil
}

if !ok {
Expand Down