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 server reload when non-HTML shortcode changes #7455

Merged
merged 1 commit into from
Jul 3, 2020
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
15 changes: 9 additions & 6 deletions hugolib/hugo_sites.go
Original file line number Diff line number Diff line change
Expand Up @@ -981,14 +981,17 @@ func (h *HugoSites) resetPageStateFromEvents(idset identity.Identities) {
}

for _, s := range p.shortcodeState.shortcodes {
for id := range idset {
if idm, ok := s.info.(identity.Manager); ok && idm.Search(id) != nil {
for _, po := range p.pageOutputs {
if po.cp != nil {
po.cp.Reset()
for _, templ := range s.templs {
sid := templ.(identity.Manager)
for id := range idset {
if sid.Search(id) != nil {
for _, po := range p.pageOutputs {
if po.cp != nil {
po.cp.Reset()
}
}
return false
}
return false
}
}
}
Expand Down
41 changes: 41 additions & 0 deletions hugolib/hugo_sites_rebuild_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ baseURL = "https://example.com"
title = "Rebuild this"
contentDir = "content"
enableInlineShortcodes = true
timeout = "5s"


`
Expand Down Expand Up @@ -213,6 +214,46 @@ prender: {{ $p.Title }}|{{ $p.Content }}

b.AssertFileContent("public/index.html", `
Render /prender/: Baseof:Single Main: Page 1|Mypartial1: Mypartial1|Mypartial3: Mypartial3 Edited:END
`)

})

t.Run("Edit RSS shortcode", func(t *testing.T) {
b := createSiteBuilder(t)

b.WithContent("output.md", `---
title: Output
outputs: ["HTML", "AMP"]
layout: output
---

Content for Output.

{{< output >}}

`)

b.WithTemplates(
"layouts/_default/output.html", `Output HTML: {{ .RelPermalink }}|{{ .Content }}`,
"layouts/_default/output.amp.html", `Output AMP: {{ .RelPermalink }}|{{ .Content }}`,
"layouts/shortcodes/output.html", `Output Shortcode HTML`,
"layouts/shortcodes/output.amp.html", `Output Shortcode AMP`)

b.Build(BuildCfg{})

b.AssertFileContent("public/output/index.html", `
Output Shortcode HTML
`)
b.AssertFileContent("public/amp/output/index.html", `
Output Shortcode AMP
`)

b.EditFiles("layouts/shortcodes/output.amp.html", `Output Shortcode AMP Edited`)

b.Build(BuildCfg{})

b.AssertFileContent("public/amp/output/index.html", `
Output Shortcode AMP Edited
`)

})
Expand Down
14 changes: 7 additions & 7 deletions hugolib/shortcode.go
Original file line number Diff line number Diff line change
Expand Up @@ -176,7 +176,8 @@ type shortcode struct {
ordinal int
err error

info tpl.Info
info tpl.Info // One of the output formats (arbitrary)
templs []tpl.Template // All output formats

// If set, the rendered shortcode is sent as part of the surrounding content
// to Blackfriday and similar.
Expand Down Expand Up @@ -541,15 +542,14 @@ Loop:

sc.name = currItem.ValStr()

// Check if the template expects inner content.
// We pick the first template for an arbitrary output format
// if more than one. It is "all inner or no inner".
tmpl, found, _ := s.s.Tmpl().LookupVariant(sc.name, tpl.TemplateVariants{})
if !found {
// Used to check if the template expects inner content.
templs := s.s.Tmpl().LookupVariants(sc.name)
if templs == nil {
return nil, _errors.Errorf("template for shortcode %q not found", sc.name)
}

sc.info = tmpl.(tpl.Info)
sc.info = templs[0].(tpl.Info)
sc.templs = templs
case currItem.IsInlineShortcodeName():
sc.name = currItem.ValStr()
sc.isInline = true
Expand Down
4 changes: 4 additions & 0 deletions tpl/collections/apply_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@ func (templateFinder) LookupVariant(name string, variants tpl.TemplateVariants)
return nil, false, false
}

func (templateFinder) LookupVariants(name string) []tpl.Template {
return nil
}

func (templateFinder) LookupLayout(d output.LayoutDescriptor, f output.Format) (tpl.Template, bool, error) {
return nil, false, nil
}
Expand Down
1 change: 1 addition & 0 deletions tpl/template.go
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ type TemplateLookupVariant interface {
// We are currently only interested in output formats, so we should improve
// this for speed.
LookupVariant(name string, variants TemplateVariants) (Template, bool, bool)
LookupVariants(name string) []Template
}

// Template is the common interface between text/template and html/template.
Expand Down
21 changes: 21 additions & 0 deletions tpl/tplimpl/template.go
Original file line number Diff line number Diff line change
Expand Up @@ -354,6 +354,23 @@ func (t *templateHandler) LookupVariant(name string, variants tpl.TemplateVarian

}

// LookupVariants returns all variants of name, nil if none found.
func (t *templateHandler) LookupVariants(name string) []tpl.Template {
name = templateBaseName(templateShortcode, name)
s, found := t.shortcodes[name]
if !found {
return nil
}

variants := make([]tpl.Template, len(s.variants))
for i := 0; i < len(variants); i++ {
variants[i] = s.variants[i].ts
}

return variants

}

func (t *templateHandler) HasTemplate(name string) bool {

if _, found := t.baseof[name]; found {
Expand Down Expand Up @@ -966,6 +983,10 @@ func (t *textTemplateWrapperWithLock) LookupVariant(name string, variants tpl.Te
panic("not supported")
}

func (t *textTemplateWrapperWithLock) LookupVariants(name string) []tpl.Template {
panic("not supported")
}

func (t *textTemplateWrapperWithLock) Parse(name, tpl string) (tpl.Template, error) {
t.Lock()
defer t.Unlock()
Expand Down