Skip to content

Commit

Permalink
resource: Start Resources :counter first time they're used
Browse files Browse the repository at this point in the history
This is less surprising and more flexible than the original implementation.

Given:

```toml
[[resources]]
  src = "documents/photo_specs.pdf"
  title = "Photo Specifications"
[[resources]]
  src = "**.pdf"
  name = "pdf-file-:counter"
```

Every `pdf` in the bundle will have an unique counter, but the `photo_specs.pdf` is still allowed to have its specific `title`.

If you change the above example to:

```toml
[[resources]]
  src = "documents/*specs.pdf"
  title = "Photo Specifications #:conter"
[[resources]]
  src = "**.pdf"
  name = "pdf-file-:counter"
```

We are talking about two different groups of documents, each with its own counters starting at 1.

Fixes #4335
  • Loading branch information
bep committed Jan 27, 2018
1 parent 96e3fbc commit 7b472e4
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 5 deletions.
21 changes: 16 additions & 5 deletions resource/resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -447,6 +447,8 @@ func (l *genericResource) Publish() error {
return helpers.WriteToDisk(target, f, l.spec.Fs.Destination)
}

const counterPlaceHolder = ":counter"

// AssignMetadata assigns the given metadata to those resources that supports updates
// and matching by wildcard given in `src` using `filepath.Match` with lower cased values.
// This assignment is additive, but the most specific match needs to be first.
Expand All @@ -464,6 +466,7 @@ func AssignMetadata(metadata []map[string]interface{}, resources ...Resource) er
var (
nameSet, titleSet bool
currentCounter = 0
counterFound bool
resourceSrcKey = strings.ToLower(r.Name())
)

Expand All @@ -487,24 +490,32 @@ func AssignMetadata(metadata []map[string]interface{}, resources ...Resource) er
if !nameSet {
name, found := meta["name"]
if found {
if currentCounter == 0 {
name := cast.ToString(name)
if !counterFound {
counterFound = strings.Contains(name, counterPlaceHolder)
}
if counterFound && currentCounter == 0 {
currentCounter = counters[srcKey] + 1
counters[srcKey] = currentCounter
}

ma.setName(replaceResourcePlaceholders(cast.ToString(name), currentCounter))
ma.setName(replaceResourcePlaceholders(name, currentCounter))
nameSet = true
}
}

if !titleSet {
title, found := meta["title"]
if found {
if currentCounter == 0 {
title := cast.ToString(title)
if !counterFound {
counterFound = strings.Contains(title, counterPlaceHolder)
}
if counterFound && currentCounter == 0 {
currentCounter = counters[srcKey] + 1
counters[srcKey] = currentCounter
}
ma.setTitle((replaceResourcePlaceholders(cast.ToString(title), currentCounter)))
ma.setTitle((replaceResourcePlaceholders(title, currentCounter)))
titleSet = true
}
}
Expand All @@ -524,7 +535,7 @@ func AssignMetadata(metadata []map[string]interface{}, resources ...Resource) er
}

func replaceResourcePlaceholders(in string, counter int) string {
return strings.Replace(in, ":counter", strconv.Itoa(counter), -1)
return strings.Replace(in, counterPlaceHolder, strconv.Itoa(counter), -1)
}

func (l *genericResource) target() string {
Expand Down
42 changes: 42 additions & 0 deletions resource/resource_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -311,6 +311,48 @@ func TestAssignMetadata(t *testing.T) {
assert.Equal("Other Logo #2", logo1.Title())
assert.Equal("Name #2", logo1.Name())

}},
// Start counting first time :counter is used
// See https://github.com/gohugoio/hugo/issues/4335
{[]map[string]interface{}{
map[string]interface{}{
"title": "Third Logo",
"src": "logo3.png",
},
map[string]interface{}{
"title": "Other Logo #:counter",
"name": "Name #:counter",
"src": "logo*",
},
}, func(err error) {
assert.NoError(err)
assert.Equal("Third Logo", logo3.Title())
assert.Equal("Name #3", logo3.Name())
assert.Equal("Other Logo #1", logo2.Title())
assert.Equal("Name #1", logo2.Name())
assert.Equal("Other Logo #2", logo1.Title())
assert.Equal("Name #2", logo1.Name())

}},
{[]map[string]interface{}{
map[string]interface{}{
"name": "third-logo",
"src": "logo3.png",
},
map[string]interface{}{
"title": "Logo #:counter",
"name": "Name #:counter",
"src": "logo*",
},
}, func(err error) {
assert.NoError(err)
assert.Equal("Logo #3", logo3.Title())
assert.Equal("third-logo", logo3.Name())
assert.Equal("Logo #1", logo2.Title())
assert.Equal("Name #1", logo2.Name())
assert.Equal("Logo #2", logo1.Title())
assert.Equal("Name #2", logo1.Name())

}},
{[]map[string]interface{}{
map[string]interface{}{
Expand Down

0 comments on commit 7b472e4

Please sign in to comment.