diff options
Diffstat (limited to 'create')
-rw-r--r-- | create/content.go | 42 | ||||
-rw-r--r-- | create/content_template_handler.go | 36 | ||||
-rw-r--r-- | create/content_test.go | 8 |
3 files changed, 63 insertions, 23 deletions
diff --git a/create/content.go b/create/content.go index e29ea9ac8..e992b0836 100644 --- a/create/content.go +++ b/create/content.go @@ -27,15 +27,31 @@ import ( // NewContent creates a new content file in the content directory based upon the // given kind, which is used to lookup an archetype. -func NewContent(s *hugolib.Site, kind, targetPath string) error { +func NewContent( + ps *helpers.PathSpec, + siteFactory func(filename string, siteUsed bool) (*hugolib.Site, error), kind, targetPath string) error { + jww.INFO.Println("attempting to create ", targetPath, "of", kind) - archetypeFilename := findArchetype(s, kind) + archetypeFilename := findArchetype(ps, kind) + + f, err := ps.Fs.Source.Open(archetypeFilename) + if err != nil { + return err + } + defer f.Close() + // Building the sites can be expensive, so only do it if really needed. + siteUsed := false + if helpers.ReaderContains(f, []byte(".Site")) { + siteUsed = true + } + + s, err := siteFactory(targetPath, siteUsed) + if err != nil { + return err + } - var ( - content []byte - err error - ) + var content []byte content, err = executeArcheTypeAsTemplate(s, kind, targetPath, archetypeFilename) if err != nil { @@ -68,13 +84,13 @@ func NewContent(s *hugolib.Site, kind, targetPath string) error { // 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(s *hugolib.Site, kind string) (outpath string) { - search := []string{s.PathSpec.AbsPathify(s.Cfg.GetString("archetypeDir"))} +func findArchetype(ps *helpers.PathSpec, kind string) (outpath string) { + search := []string{ps.AbsPathify(ps.Cfg.GetString("archetypeDir"))} - if s.Cfg.GetString("theme") != "" { - themeDir := filepath.Join(s.PathSpec.AbsPathify(s.Cfg.GetString("themesDir")+"/"+s.Cfg.GetString("theme")), "/archetypes/") - if _, err := s.Fs.Source.Stat(themeDir); os.IsNotExist(err) { - jww.ERROR.Printf("Unable to find archetypes directory for theme %q at %q", s.Cfg.GetString("theme"), themeDir) + if ps.Cfg.GetString("theme") != "" { + themeDir := filepath.Join(ps.AbsPathify(ps.Cfg.GetString("themesDir")+"/"+ps.Cfg.GetString("theme")), "/archetypes/") + if _, err := ps.Fs.Source.Stat(themeDir); os.IsNotExist(err) { + jww.ERROR.Printf("Unable to find archetypes directory for theme %q at %q", ps.Cfg.GetString("theme"), themeDir) } else { search = append(search, themeDir) } @@ -94,7 +110,7 @@ func findArchetype(s *hugolib.Site, kind string) (outpath string) { for _, p := range pathsToCheck { curpath := filepath.Join(x, p) jww.DEBUG.Println("checking", curpath, "for archetypes") - if exists, _ := helpers.Exists(curpath, s.Fs.Source); exists { + if exists, _ := helpers.Exists(curpath, ps.Fs.Source); exists { jww.INFO.Println("curpath: " + curpath) return curpath } diff --git a/create/content_template_handler.go b/create/content_template_handler.go index 9903c3dec..48e7f3b4b 100644 --- a/create/content_template_handler.go +++ b/create/content_template_handler.go @@ -18,6 +18,7 @@ import ( "fmt" "time" + "github.com/gohugoio/hugo/helpers" "github.com/gohugoio/hugo/source" "github.com/gohugoio/hugo/hugolib" @@ -25,9 +26,30 @@ import ( "github.com/spf13/afero" ) +// ArchetypeFileData represents the data available to an archetype template. +type ArchetypeFileData struct { + // The archetype content type, either given as --kind option or extracted + // from the target path's section, i.e. "blog/mypost.md" will resolve to + // "blog". + Type string + + // The current date and time as a RFC3339 formatted string, suitable for use in front matter. + Date string + + // The Site, fully equipped with all the pages etc. Note: This will only be set if it is actually + // used in the archetype template. Also, if this is a multilingual setup, + // this site is the site that best matches the target content file, based + // on the presence of language code in the filename. + Site *hugolib.Site + + // The target content file. Note that the .Content will be empty, as that + // has not been created yet. + *source.File +} + const ( archetypeTemplateTemplate = `+++ -title = "{{ replace .BaseFileName "-" " " | title }}" +title = "{{ replace .TranslationBaseName "-" " " | title }}" date = {{ .Date }} draft = true +++` @@ -44,14 +66,11 @@ func executeArcheTypeAsTemplate(s *hugolib.Site, kind, targetPath, archetypeFile sp := source.NewSourceSpec(s.Deps.Cfg, s.Deps.Fs) f := sp.NewFile(targetPath) - data := struct { - Type string - Date string - *source.File - }{ + data := ArchetypeFileData{ Type: kind, Date: time.Now().Format(time.RFC3339), File: f, + Site: s, } if archetypeFilename == "" { @@ -67,11 +86,12 @@ func executeArcheTypeAsTemplate(s *hugolib.Site, kind, targetPath, archetypeFile // Reuse the Hugo template setup to get the template funcs properly set up. templateHandler := s.Deps.Tmpl.(tpl.TemplateHandler) - if err := templateHandler.AddTemplate("_text/archetype", string(archetypeTemplate)); err != nil { + templateName := "_text/" + helpers.Filename(archetypeFilename) + if err := templateHandler.AddTemplate(templateName, string(archetypeTemplate)); err != nil { return nil, fmt.Errorf("Failed to parse archetype file %q: %s", archetypeFilename, err) } - templ := templateHandler.Lookup("_text/archetype") + templ := templateHandler.Lookup(templateName) var buff bytes.Buffer if err := templ.Execute(&buff, data); err != nil { diff --git a/create/content_test.go b/create/content_test.go index aa7ed3fcf..8b6c2c12c 100644 --- a/create/content_test.go +++ b/create/content_test.go @@ -52,13 +52,17 @@ func TestNewContent(t *testing.T) { for _, c := range cases { cfg, fs := newTestCfg() + ps, err := helpers.NewPathSpec(fs, cfg) + require.NoError(t, err) h, err := hugolib.NewHugoSites(deps.DepsCfg{Cfg: cfg, Fs: fs}) require.NoError(t, err) require.NoError(t, initFs(fs)) - s := h.Sites[0] + siteFactory := func(filename string, siteUsed bool) (*hugolib.Site, error) { + return h.Sites[0], nil + } - require.NoError(t, create.NewContent(s, c.kind, c.path)) + require.NoError(t, create.NewContent(ps, siteFactory, c.kind, c.path)) fname := filepath.Join("content", filepath.FromSlash(c.path)) content := readFileFromFs(t, fs.Source, fname) |