You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
caddy-hugo2/content.go

110 lines
2.3 KiB

package caddyhugo
import (
"fmt"
"os"
"os/exec"
"path"
"path/filepath"
"sort"
"time"
"github.com/gohugoio/hugo/hugolib"
)
type Content struct {
Filename string
Modtime time.Time
Metadata *Metadata
}
type Metadata struct {
Title string
Path string
Date, Lastmod time.Time
}
// GetContent fetches the list of available content from the site directory. If
// possible, the return value will be enriched with metadata from Hugo.
func GetContent(siteRoot string, sites *hugolib.HugoSites) ([]Content, error) {
var files = []Content{}
err := filepath.Walk(path.Join(siteRoot, "content"), func(name string, fi os.FileInfo, err error) error {
if err != nil {
return err
}
if fi.IsDir() {
return nil
}
name, err = filepath.Rel(siteRoot, name)
if err != nil {
return err
}
files = append(files, Content{
Filename: name,
Modtime: fi.ModTime(),
})
return nil
})
sort.Slice(files, func(i, j int) bool {
return files[i].Modtime.Before(files[j].Modtime)
})
if err != nil {
fmt.Println(err)
return nil, err
}
for i, file := range files {
fn := path.Join(siteRoot, file.Filename)
page := sites.GetContentPage(fn)
if page != nil {
files[i].Metadata = &Metadata{
Title: page.Title,
Path: file.Filename,
Date: page.Date,
Lastmod: page.Lastmod,
}
}
}
return files, nil
}
// NewContent initializes new content with the name (title) and content type.
// If ctype is empty string, "default" is used. The return value is the filename,
// which may be modified from the title and includes the content type if other than
// default, but does not include the full directory relative to the site.
func (ch *CaddyHugo) NewContent(name, ctype string) (string, error) {
if filepath.Ext(name) != ".md" {
name += ".md"
}
if ctype == "" {
ctype = "default"
}
name = docname(name)
filename := path.Join(ctype, name)
if ctype == "default" {
filename = name
}
_, err := os.Stat(path.Join(ch.Dir, "content", filename))
if os.IsNotExist(err) {
cmd := exec.Command("hugo", "new", filename)
cmd.Dir = ch.Dir
out, err := cmd.CombinedOutput()
if err != nil {
return filename, fmt.Errorf("error running 'hugo new': %v; %v", err, string(out))
}
}
ch.Build()
return filename, nil
}