hugo

Unnamed repository; edit this file 'description' to name the repository.

git clone git://git.shimmy1996.com/hugo.git
commit 1f42e47e475c0cd684426dd230de411d4c385a3c
parent 35fbfb19a173b01bc881f2bbc5d104136633a7ec
Author: Janus <janus@insignificancegalore.net>
Date:   Tue, 16 Oct 2018 23:51:48 +0200

Allow date and slug from filename for leaf bundles 

Fixes #4558

Diffstat:
Mhugolib/page.go | 2+-
Mhugolib/pagemeta/page_frontmatter.go | 3++-
Msource/fileInfo.go | 20++++++++++++++++++--
Msource/fileInfo_test.go | 13+++++++++++++
4 files changed, 34 insertions(+), 4 deletions(-)
diff --git 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
@@ -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
@@ -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
@@ -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())
 }