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.
138 lines
2.8 KiB
138 lines
2.8 KiB
package caddyhugo
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"path"
|
|
"path/filepath"
|
|
"time"
|
|
|
|
"github.com/gohugoio/hugo/deps"
|
|
"github.com/gohugoio/hugo/hugofs"
|
|
"github.com/gohugoio/hugo/hugolib"
|
|
"github.com/spf13/afero"
|
|
"github.com/spf13/viper"
|
|
|
|
themeadditions "git.stephensearles.com/stephen/caddy-hugo2/theme-additions"
|
|
"git.stephensearles.com/stephen/idleshut"
|
|
)
|
|
|
|
const (
|
|
IdleWebsocketTimeout = 10 * time.Minute
|
|
WebsocketFileTicker = 1 * time.Second
|
|
)
|
|
|
|
// Publish really renders new content into the public directory
|
|
func (ch *CaddyHugo) Publish() error {
|
|
err := ch.persistAllEdits()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = buildSite(ch.HugoSites)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func buildSite(sites *hugolib.HugoSites) error {
|
|
err := sites.Build(hugolib.BuildCfg{ResetState: true})
|
|
if err != nil {
|
|
return fmt.Errorf("caddy-hugo: building site: %v", err)
|
|
}
|
|
|
|
return err
|
|
}
|
|
|
|
func writeThemeFiles(dir string) error {
|
|
for _, asset := range themeadditions.AssetNames() {
|
|
err := os.MkdirAll(path.Join(dir, filepath.Dir(asset)), 0755)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
f, err := os.Create(path.Join(dir, asset))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
b, err := themeadditions.Asset(asset)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
_, err = f.Write(b)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = f.Close()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (ch *CaddyHugo) configWithFs(fs afero.Fs) (*hugolib.HugoSites, *deps.DepsCfg, error) {
|
|
var err error
|
|
|
|
hfs := hugofs.NewFrom(fs, &viper.Viper{})
|
|
cfg := &deps.DepsCfg{Fs: hfs}
|
|
|
|
cfgPath := path.Join(ch.Dir, "config.toml")
|
|
cfg.Cfg, _, err = hugolib.LoadConfig(hugolib.ConfigSourceDescriptor{Fs: fs, Path: cfgPath})
|
|
if err != nil {
|
|
return nil, cfg, fmt.Errorf("caddy-hugo: loading site configuration: %v", err)
|
|
}
|
|
cfg.Cfg.Set("workingDir", ch.Dir)
|
|
|
|
sites, err := hugolib.NewHugoSites(*cfg)
|
|
if err != nil {
|
|
return nil, cfg, fmt.Errorf("caddy-hugo: initializing site: %v", err)
|
|
}
|
|
|
|
err = buildSite(sites)
|
|
|
|
return sites, cfg, err
|
|
}
|
|
|
|
func HugoInternalProcessConfig(ch *CaddyHugo, es *editSession, touchFn func()) (idleshut.Config, error) {
|
|
hugoSites, _, err := ch.configWithFs(es.tmpfs)
|
|
if err != nil {
|
|
return idleshut.Config{}, fmt.Errorf("caddy-hugo: loading site configuration: %v", err)
|
|
}
|
|
|
|
return idleshut.Config{
|
|
TickDuration: WebsocketFileTicker,
|
|
MaxIdleTicks: uint(IdleWebsocketTimeout/WebsocketFileTicker) + 1,
|
|
Stop: func() error {
|
|
ch.persistEditsForSession(es)
|
|
|
|
es.doc.Close()
|
|
|
|
ch.mtx.Lock()
|
|
defer ch.mtx.Unlock()
|
|
delete(ch.docs, es.filename)
|
|
|
|
return nil
|
|
},
|
|
TickError: func(err error) {
|
|
fmt.Println("error processing draft:", err)
|
|
},
|
|
Tick: func() error {
|
|
err := afero.WriteFile(es.tmpfs, es.filename, []byte(es.doc.Contents()), 0644)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = buildSite(hugoSites)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
},
|
|
}, nil
|
|
}
|
|
|