mirror of
https://github.com/gohugoio/hugo.git
synced 2024-11-21 20:46:30 -05:00
Improve type support in resources.Concat
This allows the result of `.Resources.Match` and similar to be concatenated. Fixes #4934
This commit is contained in:
parent
80c8f3b81a
commit
306573def0
3 changed files with 59 additions and 14 deletions
|
@ -80,14 +80,21 @@ Min HTML: {{ ( resources.Get "mydata/html1.html" | resources.Minify ).Content |
|
||||||
{{ $a := "A" | resources.FromString "a.txt"}}
|
{{ $a := "A" | resources.FromString "a.txt"}}
|
||||||
{{ $b := "B" | resources.FromString "b.txt"}}
|
{{ $b := "B" | resources.FromString "b.txt"}}
|
||||||
{{ $c := "C" | resources.FromString "c.txt"}}
|
{{ $c := "C" | resources.FromString "c.txt"}}
|
||||||
|
{{ $textResources := .Resources.Match "*.txt" }}
|
||||||
{{ $combined := slice $a $b $c | resources.Concat "bundle/concat.txt" }}
|
{{ $combined := slice $a $b $c | resources.Concat "bundle/concat.txt" }}
|
||||||
T: Content: {{ $combined.Content }}|RelPermalink: {{ $combined.RelPermalink }}|Permalink: {{ $combined.Permalink }}|MediaType: {{ $combined.MediaType.Type }}
|
T1: Content: {{ $combined.Content }}|RelPermalink: {{ $combined.RelPermalink }}|Permalink: {{ $combined.Permalink }}|MediaType: {{ $combined.MediaType.Type }}
|
||||||
|
{{ with $textResources }}
|
||||||
|
{{ $combinedText := . | resources.Concat "bundle/concattxt.txt" }}
|
||||||
|
T2: Content: {{ $combinedText.Content }}|{{ $combinedText.RelPermalink }}
|
||||||
|
{{ end }}
|
||||||
`)
|
`)
|
||||||
}, func(b *sitesBuilder) {
|
}, func(b *sitesBuilder) {
|
||||||
b.AssertFileContent("public/index.html", `T: Content: ABC|RelPermalink: /bundle/concat.txt|Permalink: http://example.com/bundle/concat.txt|MediaType: text/plain`)
|
b.AssertFileContent("public/index.html", `T1: Content: ABC|RelPermalink: /bundle/concat.txt|Permalink: http://example.com/bundle/concat.txt|MediaType: text/plain`)
|
||||||
b.AssertFileContent("public/bundle/concat.txt", "ABC")
|
b.AssertFileContent("public/bundle/concat.txt", "ABC")
|
||||||
}},
|
|
||||||
|
|
||||||
|
b.AssertFileContent("public/index.html", `T2: Content: t1t|t2t|`)
|
||||||
|
b.AssertFileContent("public/bundle/concattxt.txt", "t1t|t2t|")
|
||||||
|
}},
|
||||||
{"fromstring", func() bool { return true }, func(b *sitesBuilder) {
|
{"fromstring", func() bool { return true }, func(b *sitesBuilder) {
|
||||||
b.WithTemplates("home.html", `
|
b.WithTemplates("home.html", `
|
||||||
{{ $r := "Hugo Rocks!" | resources.FromString "rocks/hugo.txt" }}
|
{{ $r := "Hugo Rocks!" | resources.FromString "rocks/hugo.txt" }}
|
||||||
|
@ -137,12 +144,31 @@ T3: {{ $resultMD5.Content }}|{{ $resultMD5.RelPermalink}}|{{$resultMD5.MediaType
|
||||||
|
|
||||||
b := newTestSitesBuilder(t).WithLogger(loggers.NewWarningLogger())
|
b := newTestSitesBuilder(t).WithLogger(loggers.NewWarningLogger())
|
||||||
b.WithSimpleConfigFile()
|
b.WithSimpleConfigFile()
|
||||||
b.WithContent("page.md", `
|
b.WithContent("_index.md", `
|
||||||
---
|
---
|
||||||
title: Hello
|
title: Home
|
||||||
---
|
---
|
||||||
|
|
||||||
`)
|
Home.
|
||||||
|
|
||||||
|
`,
|
||||||
|
"page1.md", `
|
||||||
|
---
|
||||||
|
title: Hello1
|
||||||
|
---
|
||||||
|
|
||||||
|
Hello1
|
||||||
|
`,
|
||||||
|
"page2.md", `
|
||||||
|
---
|
||||||
|
title: Hello2
|
||||||
|
---
|
||||||
|
|
||||||
|
Hello2
|
||||||
|
`,
|
||||||
|
"t1.txt", "t1t|",
|
||||||
|
"t2.txt", "t2t|",
|
||||||
|
)
|
||||||
|
|
||||||
b.WithSourceFile(filepath.Join("assets", "css", "styles1.css"), `
|
b.WithSourceFile(filepath.Join("assets", "css", "styles1.css"), `
|
||||||
h1 {
|
h1 {
|
||||||
|
|
|
@ -62,7 +62,7 @@ func (r *multiReadSeekCloser) Close() error {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Concat concatenates the list of Resource objects.
|
// Concat concatenates the list of Resource objects.
|
||||||
func (c *Client) Concat(targetPath string, resources []resource.Resource) (resource.Resource, error) {
|
func (c *Client) Concat(targetPath string, resources resource.Resources) (resource.Resource, error) {
|
||||||
// The CACHE_OTHER will make sure this will be re-created and published on rebuilds.
|
// The CACHE_OTHER will make sure this will be re-created and published on rebuilds.
|
||||||
return c.rs.ResourceCache.GetOrCreate(resource.CACHE_OTHER, targetPath, func() (resource.Resource, error) {
|
return c.rs.ResourceCache.GetOrCreate(resource.CACHE_OTHER, targetPath, func() (resource.Resource, error) {
|
||||||
var resolvedm media.Type
|
var resolvedm media.Type
|
||||||
|
|
|
@ -79,19 +79,38 @@ func (ns *Namespace) Get(filename interface{}) (resource.Resource, error) {
|
||||||
|
|
||||||
// Concat concatenates a slice of Resource objects. These resources must
|
// Concat concatenates a slice of Resource objects. These resources must
|
||||||
// (currently) be of the same Media Type.
|
// (currently) be of the same Media Type.
|
||||||
func (ns *Namespace) Concat(targetPathIn interface{}, r []interface{}) (resource.Resource, error) {
|
func (ns *Namespace) Concat(targetPathIn interface{}, r interface{}) (resource.Resource, error) {
|
||||||
targetPath, err := cast.ToStringE(targetPathIn)
|
targetPath, err := cast.ToStringE(targetPathIn)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
rr := make([]resource.Resource, len(r))
|
|
||||||
for i := 0; i < len(r); i++ {
|
var rr resource.Resources
|
||||||
rv, ok := r[i].(resource.Resource)
|
|
||||||
|
switch v := r.(type) {
|
||||||
|
// This is what we get from the slice func.
|
||||||
|
case []interface{}:
|
||||||
|
rr = make([]resource.Resource, len(v))
|
||||||
|
for i := 0; i < len(v); i++ {
|
||||||
|
rv, ok := v[i].(resource.Resource)
|
||||||
if !ok {
|
if !ok {
|
||||||
return nil, fmt.Errorf("cannot concat type %T", rv)
|
return nil, fmt.Errorf("cannot concat type %T", v[i])
|
||||||
}
|
}
|
||||||
rr[i] = rv
|
rr[i] = rv
|
||||||
}
|
}
|
||||||
|
// This is what we get from .Resources.Match etc.
|
||||||
|
case resource.Resources:
|
||||||
|
rr = v
|
||||||
|
default:
|
||||||
|
// We may support Page collections at one point, but we need to think about ...
|
||||||
|
// what to acutually concatenate.
|
||||||
|
return nil, fmt.Errorf("slice %T not supported in concat", r)
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(rr) == 0 {
|
||||||
|
return nil, errors.New("must provide one or more Resource objects to concat")
|
||||||
|
}
|
||||||
|
|
||||||
return ns.bundlerClient.Concat(targetPath, rr)
|
return ns.bundlerClient.Concat(targetPath, rr)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue