|
|
|
package caddyhugo
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"html/template"
|
|
|
|
"io/ioutil"
|
|
|
|
"os"
|
|
|
|
"path"
|
|
|
|
|
|
|
|
"git.stephensearles.com/stephen/caddy-hugo2/comments"
|
|
|
|
"git.stephensearles.com/stephen/caddy-hugo2/media"
|
|
|
|
|
|
|
|
"github.com/gohugoio/hugo/deps"
|
|
|
|
"github.com/gohugoio/hugo/hugofs"
|
|
|
|
"github.com/gohugoio/hugo/hugolib"
|
|
|
|
"github.com/mholt/caddy"
|
|
|
|
"github.com/mholt/caddy/caddyhttp/httpserver"
|
|
|
|
)
|
|
|
|
|
|
|
|
var eventHookCounter uint64
|
|
|
|
|
|
|
|
func SetupCaddy(c *caddy.Controller) error {
|
|
|
|
ch := &CaddyHugo{}
|
|
|
|
|
|
|
|
ch.Site = httpserver.GetConfig(c)
|
|
|
|
err := ch.Setup(ch.Site.Root)
|
|
|
|
|
|
|
|
c.OnShutdown(func() error {
|
|
|
|
return ch.persistAllEdits()
|
|
|
|
})
|
|
|
|
|
|
|
|
ch.Site.AddMiddleware(ch.Middleware(c))
|
|
|
|
ch.commentsSetting(c)
|
|
|
|
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ch *CaddyHugo) commentsSetting(c *caddy.Controller) {
|
|
|
|
for c.NextLine() {
|
|
|
|
if c.Val() == "hugo" {
|
|
|
|
for c.NextBlock() {
|
|
|
|
if c.Val() == "comments" {
|
|
|
|
ch.Comments = comments.WithStorage(comments.NewDiskv(path.Join(ch.Site.Root, "comments")))
|
|
|
|
if c.NextArg() {
|
|
|
|
ch.Comments.Password = c.Val()
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (ch *CaddyHugo) Setup(dir string) error {
|
|
|
|
var err error
|
|
|
|
|
|
|
|
ch.Dir = dir
|
|
|
|
ch.docs = make(map[string]*editSession)
|
|
|
|
ch.confirmingToClient = make(map[uint64]struct{})
|
|
|
|
|
|
|
|
ch.HugoCfg = &deps.DepsCfg{}
|
|
|
|
|
|
|
|
ch.HugoCfg.Cfg, err = hugolib.LoadConfig(hugofs.Os, dir, "")
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("error loading hugo config: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
ch.HugoCfg.Cfg.Set("workingdir", dir)
|
|
|
|
ch.HugoSites, err = hugolib.NewHugoSites(*ch.HugoCfg)
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("error intializing hugo: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
err = ch.Build()
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("error building initial hugo: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
ch.authorTmpl, err = template.New("").Parse(AuthorPage)
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("author template invalid: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
ch.adminTmpl, err = template.New("").Parse(AdminPage)
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("admin template invalid: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
ch.editTmpl, err = template.New("").Parse(EditPage)
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("edit template invalid: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
thumbDir, err := ioutil.TempDir("", "thumbs")
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("couldn't initialize media: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
ch.Media = &media.MediaSource{
|
|
|
|
StorageDir: path.Join(dir, "media"),
|
|
|
|
ThumbDir: thumbDir,
|
|
|
|
}
|
|
|
|
|
|
|
|
err = os.MkdirAll(ch.Media.StorageDir, 0755)
|
|
|
|
if err != nil {
|
|
|
|
return fmt.Errorf("couldn't initialize media: %v", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
err = ch.Publish()
|
|
|
|
if err != nil {
|
|
|
|
fmt.Println("error with initial publish of hugo site:", err)
|
|
|
|
}
|
|
|
|
|
|
|
|
return nil
|
|
|
|
}
|