diff options
author | Bjørn Erik Pedersen <bjorn.erik.pedersen@gmail.com> | 2017-06-18 19:06:28 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-06-18 19:06:28 +0200 |
commit | 422057f60709696bbbd1c38c9ead2bf114d47e31 (patch) | |
tree | 2d2a40f403559b226b826c49a82bb2993313c2c9 /create/content_template_handler.go | |
parent | 4aa1239070bb9d4324d3582f3e809b702a59d3ac (diff) |
create: Use archetype template as-is as a Go template
This commit removes the fragile front matter decoding, and takes the provided archetype file as-is and processes it as a template.
This also means that we no longer will attempt to fill in default values for `title` and `date`.
The upside is that it is now easy to create these values in a dynamic way:
```toml
+++
title = {{ .BaseFileName | title }}
date = {{ .Date }}
draft = true
+++
```
You can currently use all of Hugo's template funcs, but the data context is currently very shallow:
* `.Type` gives the archetype kind provided
* `.Name` gives the target file name without extension.
* `.Path` gives the target file name
* `.Date` gives the current time as RFC3339 formatted string
The above will probably be extended in #1629.
Fixes #452
Updates #1629
Diffstat (limited to 'create/content_template_handler.go')
-rw-r--r-- | create/content_template_handler.go | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/create/content_template_handler.go b/create/content_template_handler.go new file mode 100644 index 000000000..9903c3dec --- /dev/null +++ b/create/content_template_handler.go @@ -0,0 +1,94 @@ +// Copyright 2017 The Hugo Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package create + +import ( + "bytes" + "fmt" + "time" + + "github.com/gohugoio/hugo/source" + + "github.com/gohugoio/hugo/hugolib" + "github.com/gohugoio/hugo/tpl" + "github.com/spf13/afero" +) + +const ( + archetypeTemplateTemplate = `+++ +title = "{{ replace .BaseFileName "-" " " | title }}" +date = {{ .Date }} +draft = true ++++` +) + +func executeArcheTypeAsTemplate(s *hugolib.Site, kind, targetPath, archetypeFilename string) ([]byte, error) { + + var ( + archetypeContent []byte + archetypeTemplate []byte + err error + ) + + sp := source.NewSourceSpec(s.Deps.Cfg, s.Deps.Fs) + f := sp.NewFile(targetPath) + + data := struct { + Type string + Date string + *source.File + }{ + Type: kind, + Date: time.Now().Format(time.RFC3339), + File: f, + } + + if archetypeFilename == "" { + // TODO(bep) archetype revive the issue about wrong tpl funcs arg order + archetypeTemplate = []byte(archetypeTemplateTemplate) + } else { + archetypeTemplate, err = afero.ReadFile(s.Fs.Source, archetypeFilename) + if err != nil { + return nil, fmt.Errorf("Failed to read archetype file %q: %s", archetypeFilename, err) + } + + } + + // 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 { + return nil, fmt.Errorf("Failed to parse archetype file %q: %s", archetypeFilename, err) + } + + templ := templateHandler.Lookup("_text/archetype") + + var buff bytes.Buffer + if err := templ.Execute(&buff, data); err != nil { + return nil, fmt.Errorf("Failed to process archetype file %q: %s", archetypeFilename, err) + } + + archetypeContent = buff.Bytes() + + if !bytes.Contains(archetypeContent, []byte("date")) || !bytes.Contains(archetypeContent, []byte("title")) { + // TODO(bep) remove some time in the future. + s.Log.FEEDBACK.Println(fmt.Sprintf(`WARNING: date and/or title missing from archetype file %q. +From Hugo 0.24 this must be provided in the archetype file itself, if needed. Example: +%s +`, archetypeFilename, archetypeTemplateTemplate)) + + } + + return archetypeContent, nil + +} |