|
|
|
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
|
|
|
|
}
|