diff --git a/hugolib/page.go b/hugolib/page.go index 8a2864e7f..0359769e3 100644 --- a/hugolib/page.go +++ b/hugolib/page.go @@ -1326,7 +1326,7 @@ func (p *Page) update(frontmatter map[string]interface{}) error { Params: p.params, Dates: &p.PageDates, PageURLs: &p.URLPath, - BaseFilename: p.BaseFileName(), + BaseFilename: p.ContentBaseName(), ModTime: mtime, GitAuthorDate: gitAuthorDate, } diff --git a/hugolib/pagemeta/page_frontmatter.go b/hugolib/pagemeta/page_frontmatter.go index 88f6f3a11..f75613e80 100644 --- a/hugolib/pagemeta/page_frontmatter.go +++ b/hugolib/pagemeta/page_frontmatter.go @@ -47,7 +47,8 @@ type FrontMatterDescriptor struct { // This the Page's front matter. Frontmatter map[string]interface{} - // This is the Page's base filename, e.g. page.md. + // This is the Page's base filename (BaseFilename), e.g. page.md., or + // if page is a leaf bundle, the bundle folder name (ContentBaseName). BaseFilename string // The content file's mod time. diff --git a/source/fileInfo.go b/source/fileInfo.go index fc55706fe..ad302f470 100644 --- a/source/fileInfo.go +++ b/source/fileInfo.go @@ -70,6 +70,10 @@ type File interface { // not even the optional language extension part. TranslationBaseName() string + // ContentBaseName is a either TranslationBaseName or name of containing folder + // if file is a leaf bundle. + ContentBaseName() string + // UniqueID is the MD5 hash of the file's path and is for most practical applications, // Hugo content files being one of them, considered to be unique. UniqueID() string @@ -106,6 +110,7 @@ type FileInfo struct { relPath string baseName string translationBaseName string + contentBaseName string section string isLeafBundle bool @@ -144,6 +149,13 @@ func (fi *FileInfo) BaseFileName() string { return fi.baseName } // language segement (ie. "page"). func (fi *FileInfo) TranslationBaseName() string { return fi.translationBaseName } +// ContentBaseName is a either TranslationBaseName or name of containing folder +// if file is a leaf bundle. +func (fi *FileInfo) ContentBaseName() string { + fi.init() + return fi.contentBaseName +} + // Section returns a file's section. func (fi *FileInfo) Section() string { fi.init() @@ -177,11 +189,15 @@ func (fi *FileInfo) init() { if (!fi.isLeafBundle && len(parts) == 1) || len(parts) > 1 { section = parts[0] } - fi.section = section - fi.uniqueID = helpers.MD5String(filepath.ToSlash(fi.relPath)) + if fi.isLeafBundle && len(parts) > 0 { + fi.contentBaseName = parts[len(parts)-1] + } else { + fi.contentBaseName = fi.translationBaseName + } + fi.uniqueID = helpers.MD5String(filepath.ToSlash(fi.relPath)) }) } diff --git a/source/fileInfo_test.go b/source/fileInfo_test.go index 9d3566240..9390c6247 100644 --- a/source/fileInfo_test.go +++ b/source/fileInfo_test.go @@ -94,4 +94,17 @@ func TestFileInfoLanguage(t *testing.T) { assert.Equal("sv", fiSv.Lang()) assert.Equal("en", fiEn.Lang()) + + // test contentBaseName implementation + fi := s.NewFileInfo("", "2018-10-01-contentbasename.md", false, nil) + assert.Equal("2018-10-01-contentbasename", fi.ContentBaseName()) + + fi = s.NewFileInfo("", "2018-10-01-contentbasename.en.md", false, nil) + assert.Equal("2018-10-01-contentbasename", fi.ContentBaseName()) + + fi = s.NewFileInfo("", filepath.Join("2018-10-01-contentbasename", "index.en.md"), true, nil) + assert.Equal("2018-10-01-contentbasename", fi.ContentBaseName()) + + fi = s.NewFileInfo("", filepath.Join("2018-10-01-contentbasename", "_index.en.md"), false, nil) + assert.Equal("_index", fi.ContentBaseName()) }