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