hugo

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

git clone git://git.shimmy1996.com/hugo.git
commit 19f2e729135af700c5d4aa06e7b3540e6d4847fd
parent 0f40e1fadfca2276f65adefa6d7d5d63aef9160a
Author: Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com>
Date:   Tue, 20 Jun 2017 12:46:03 +0200

Support non-md files as archetype files

It now properly uses the extension of the target file to determine archetype file.

Fixes #3597
Fixes #3618

Diffstat:
Mcreate/content.go | 20++++++++++++--------
Mcreate/content_test.go | 5+++++
Mhelpers/path.go | 6++++++
3 files changed, 23 insertions(+), 8 deletions(-)
diff --git a/create/content.go b/create/content.go
@@ -30,10 +30,11 @@ import (
 func NewContent(
 	ps *helpers.PathSpec,
 	siteFactory func(filename string, siteUsed bool) (*hugolib.Site, error), kind, targetPath string) error {
+	ext := helpers.Ext(targetPath)
 
-	jww.INFO.Println("attempting to create ", targetPath, "of", kind)
+	jww.INFO.Printf("attempting to create %q of %q of ext %q", targetPath, kind, ext)
 
-	archetypeFilename := findArchetype(ps, kind)
+	archetypeFilename := findArchetype(ps, kind, ext)
 
 	f, err := ps.Fs.Source.Open(archetypeFilename)
 	if err != nil {
@@ -84,7 +85,7 @@ func NewContent(
 // FindArchetype takes a given kind/archetype of content and returns an output
 // path for that archetype.  If no archetype is found, an empty string is
 // returned.
-func findArchetype(ps *helpers.PathSpec, kind string) (outpath string) {
+func findArchetype(ps *helpers.PathSpec, kind, ext string) (outpath string) {
 	search := []string{ps.AbsPathify(ps.Cfg.GetString("archetypeDir"))}
 
 	if ps.Cfg.GetString("theme") != "" {
@@ -100,13 +101,16 @@ func findArchetype(ps *helpers.PathSpec, kind string) (outpath string) {
 		// If the new content isn't in a subdirectory, kind == "".
 		// Therefore it should be excluded otherwise `is a directory`
 		// error will occur. github.com/gohugoio/hugo/issues/411
-		var pathsToCheck []string
+		var pathsToCheck = []string{"default"}
 
-		if kind == "" {
-			pathsToCheck = []string{"default.md", "default"}
-		} else {
-			pathsToCheck = []string{kind + ".md", kind, "default.md", "default"}
+		if ext != "" {
+			if kind != "" {
+				pathsToCheck = append([]string{kind + ext, "default" + ext}, pathsToCheck...)
+			} else {
+				pathsToCheck = append([]string{"default" + ext}, pathsToCheck...)
+			}
 		}
+
 		for _, p := range pathsToCheck {
 			curpath := filepath.Join(x, p)
 			jww.DEBUG.Println("checking", curpath, "for archetypes")
diff --git a/create/content_test.go b/create/content_test.go
@@ -44,6 +44,7 @@ func TestNewContent(t *testing.T) {
 		expected []string
 	}{
 		{"post", "post/sample-1.md", []string{`title = "Post Arch title"`, `test = "test1"`, "date = \"2015-01-12T19:20:04-07:00\""}},
+		{"post", "post/org-1.org", []string{`#+title: ORG-1`}},
 		{"emptydate", "post/sample-ed.md", []string{`title = "Empty Date Arch title"`, `test = "test1"`}},
 		{"stump", "stump/sample-2.md", []string{`title = "Sample 2"`}},     // no archetype file
 		{"", "sample-3.md", []string{`title = "Sample 3"`}},                // no archetype
@@ -112,6 +113,10 @@ func initFs(fs *hugofs.Fs) error {
 			content: "+++\ndate = \"2015-01-12T19:20:04-07:00\"\ntitle = \"Post Arch title\"\ntest = \"test1\"\n+++\n",
 		},
 		{
+			path:    filepath.Join("archetypes", "post.org"),
+			content: "#+title: {{ .BaseFileName  | upper }}",
+		},
+		{
 			path: filepath.Join("archetypes", "product.md"),
 			content: `+++
 title = "{{ .BaseFileName  | upper }}"
diff --git a/helpers/path.go b/helpers/path.go
@@ -287,6 +287,12 @@ func GetDottedRelativePath(inPath string) string {
 	return dottedPath
 }
 
+// Ext takes a path and returns the extension, including the delmiter, i.e. ".md".
+func Ext(in string) string {
+	_, ext := fileAndExt(in, fpb)
+	return ext
+}
+
 // Filename takes a path, strips out the extension,
 // and returns the name of the file.
 func Filename(in string) (name string) {