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.
var (
nameSet, titleSet bool
currentCounter = 0
+ counterFound bool
resourceSrcKey = strings.ToLower(r.Name())
)
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
}
}
}
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 {
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{}{