Added site previewing

This will generate a local version of the Hugo site and serve it via the server
This commit is contained in:
Leon Mika 2025-02-17 21:41:36 +11:00
parent 3cf4294e87
commit 68aa9c0e13
9 changed files with 61 additions and 33 deletions

View file

@ -5,6 +5,7 @@ type hugoConfig struct {
LanguageCode string `yaml:"languageCode"`
Title string `yaml:"title"`
Theme string `yaml:"theme"`
CanonifyURLs bool `yaml:"canonifyURLs,omitempty"`
Markup hugoConfigMarkup `yaml:"markup"`
}

View file

@ -2,6 +2,7 @@ package hugo
import (
"context"
"fmt"
"gopkg.in/yaml.v3"
"lmika.dev/lmika/hugo-cms/models"
"log"
@ -12,12 +13,14 @@ import (
type Provider struct {
stagingDir string
previewDir string
scratchDir string
}
func New(stagingDir, scratchDir string) (*Provider, error) {
func New(stagingDir, previewDir, scratchDir string) (*Provider, error) {
return &Provider{
stagingDir: stagingDir,
previewDir: previewDir,
scratchDir: scratchDir,
}, nil
}
@ -47,42 +50,53 @@ func (p *Provider) NewSite(ctx context.Context, site models.Site) error {
return nil
}
func (p *Provider) PublishSite(ctx context.Context, site models.Site, target models.PublishTarget) (outDir string, clean func(), err error) {
if err := os.MkdirAll(p.scratchDir, 0755); err != nil {
return "", nil, err
func (p *Provider) PreviewSite(ctx context.Context, site models.Site) (outDir string, err error) {
previewTarget := models.PublishTarget{
URL: fmt.Sprintf("http://localhost:3000/preview/%s", site.Name),
}
outDir, err = os.MkdirTemp(p.scratchDir, site.Name+"-*")
return p.publishSiteAt(ctx, p.previewDir, site, previewTarget, "hugoPreview.yaml")
}
func (p *Provider) PublishSite(ctx context.Context, site models.Site, target models.PublishTarget) (outDir string, err error) {
return p.publishSiteAt(ctx, p.scratchDir, site, target, "hugo.yaml")
}
func (p *Provider) publishSiteAt(ctx context.Context, dir string, site models.Site, target models.PublishTarget, configFile string) (outDir string, err error) {
baseSiteDir, err := filepath.Abs(p.SiteStagingDir(site, BaseSiteDir))
if err != nil {
return "", nil, err
}
clean = func() {
os.RemoveAll(outDir)
return "", err
}
outDir, err = filepath.Abs(outDir)
outDir, err = filepath.Abs(filepath.Join(dir, site.Name))
if err != nil {
return "", nil, err
return "", err
}
if err := os.MkdirAll(outDir, 0755); err != nil {
return "", err
}
cmd := exec.CommandContext(ctx, "hugo",
"--source", p.SiteStagingDir(site, BaseSiteDir),
"--source", baseSiteDir,
"--destination", outDir,
"--config", filepath.Join(baseSiteDir, configFile),
"--baseURL", target.URL)
cmd.Stderr = os.Stderr
cmd.Stdout = os.Stdout
if err := cmd.Run(); err != nil {
return "", clean, err
return "", err
}
return outDir, clean, nil
return outDir, nil
}
func (p *Provider) ReconfigureSite(ctx context.Context, site models.Site) error {
func (p *Provider) ReconfigureSite(ctx context.Context, configBase string, site models.Site) error {
hugoCfg := hugoConfig{
Title: site.Title,
LanguageCode: "en",
Theme: site.Theme,
CanonifyURLs: configBase == "hugoPreview",
Markup: hugoConfigMarkup{
Goldmark: hugoGoldmarkConfig{
Renderer: hugoGoldmarkRendererConfig{
@ -97,12 +111,12 @@ func (p *Provider) ReconfigureSite(ctx context.Context, site models.Site) error
return err
}
if err := os.WriteFile(filepath.Join(p.SiteStagingDir(site, BaseSiteDir), "hugo.yaml"), ymlBytes, 0644); err != nil {
if err := os.WriteFile(filepath.Join(p.SiteStagingDir(site, BaseSiteDir), configBase+".yaml"), ymlBytes, 0644); err != nil {
return err
}
if _, err := os.Stat(filepath.Join(p.SiteStagingDir(site, BaseSiteDir), "hugo.toml")); err == nil {
if err := os.Remove(filepath.Join(p.SiteStagingDir(site, BaseSiteDir), "hugo.toml")); err != nil {
if _, err := os.Stat(filepath.Join(p.SiteStagingDir(site, BaseSiteDir), configBase+".toml")); err == nil {
if err := os.Remove(filepath.Join(p.SiteStagingDir(site, BaseSiteDir), configBase+".toml")); err != nil {
return err
}
}