108 lines
1.8 KiB
Go
108 lines
1.8 KiB
Go
package internals
|
|
|
|
import (
|
|
"context"
|
|
"io"
|
|
"io/fs"
|
|
"log"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/a-h/templ"
|
|
)
|
|
|
|
const PERMISSIONS = 0755
|
|
|
|
type Page struct {
|
|
Path string
|
|
Component templ.Component
|
|
}
|
|
|
|
type StaticWriter struct {
|
|
DistDir *string
|
|
StaticDir *string
|
|
Pages []Page
|
|
Context context.Context
|
|
Logger log.Logger
|
|
}
|
|
|
|
func (w *StaticWriter) WritePage(path string, writer func(ctx context.Context, w io.Writer) error) error {
|
|
directory := filepath.Dir(path)
|
|
err := os.MkdirAll(directory, PERMISSIONS)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
f, err := os.Create(path)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer f.Close()
|
|
|
|
err = writer(w.Context, f)
|
|
return err
|
|
}
|
|
|
|
func (w *StaticWriter) WriteAll() error {
|
|
for _, page := range w.Pages {
|
|
p := filepath.Join(*w.DistDir, page.Path)
|
|
w.Logger.Printf("Writing page %s", p)
|
|
err := w.WritePage(p, page.Component.Render)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
err := filepath.WalkDir(*w.StaticDir, func(path string, d fs.DirEntry, err error) error {
|
|
if err != nil {
|
|
return err
|
|
} else if d.IsDir() || path == *w.StaticDir {
|
|
return nil
|
|
}
|
|
|
|
f, err := filepath.Abs(path)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
s, err := filepath.Abs(*w.StaticDir)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
err = w.CopyStatic(strings.TrimPrefix(f, s))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
})
|
|
return err
|
|
}
|
|
|
|
func (w *StaticWriter) CopyStatic(path string) error {
|
|
c, err := os.ReadFile(filepath.Join(*w.StaticDir, path))
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
p := filepath.Join(*w.DistDir, path)
|
|
err = os.MkdirAll(filepath.Dir(p), PERMISSIONS)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
f, err := os.Create(p)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer f.Close()
|
|
|
|
b, err := f.Write(c)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
w.Logger.Printf("Wrote %v bytes in %s", b, p)
|
|
|
|
return nil
|
|
}
|