From 19f2e729135af700c5d4aa06e7b3540e6d4847fd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Erik=20Pedersen?= Date: Tue, 20 Jun 2017 12:46:03 +0200 Subject: [PATCH] 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 --- create/content.go | 20 ++++++++++++-------- create/content_test.go | 5 +++++ helpers/path.go | 6 ++++++ 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/create/content.go b/create/content.go index e992b083..e584df73 100644 --- 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 index 8b6c2c12..e8857baf 100644 --- 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 @@ -111,6 +112,10 @@ func initFs(fs *hugofs.Fs) error { path: filepath.Join("archetypes", "post.md"), 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: `+++ diff --git a/helpers/path.go b/helpers/path.go index 679740de..640c97aa 100644 --- 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) {