package main import ( "log" "fmt" "strings" "io/fs" "path/filepath" "os" "github.com/gofiber/fiber/v2" "github.com/gofiber/template/html/v2" "zedshaw.games/ssgod/config" ) func Fail(err error, format string, v ...any) error { err_format := fmt.Sprintf("ERROR: %v; %s", err, format) log.Printf(err_format, v...) return err } func RenderPages(pages_path string, layout string, target string) { log.Printf("LAYOUT IS: %v", layout) engine := html.New(pages_path, ".html") engine.Load() err := filepath.WalkDir(pages_path, func(path string, d fs.DirEntry, err error) error { if !d.IsDir() { if err != nil { return Fail(err, "path: %s", path); } dir := filepath.Dir(path) err = os.MkdirAll(dir, 0750) if err != nil { return Fail(err, "making dir %s", dir); } split_path := strings.Split(path, string(os.PathSeparator))[1:] source_name := strings.Join(split_path, "/") // Render wants / even on windows ext := filepath.Ext(source_name) template_name, found := strings.CutSuffix(source_name, ext) if found && ext == ".html" && template_name != layout { prefixed_path := append([]string{target}, split_path...) target_path := filepath.Join(prefixed_path...) _, err := os.Stat(target_path) if os.IsNotExist(err) { target_dir := filepath.Dir(target_path) log.Println("MAKING: ", target_dir) os.MkdirAll(target_dir, 0750) } // TODO: compare time stamps and skip if not newer out, err := os.OpenFile(target_path, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0644) if err != nil { return Fail(err, "writing file %s", target_path) } // generate a data-testid for all pages based on template name page_id := strings.ReplaceAll(template_name, "/", "-") + "-page" err = engine.Render(out, template_name, fiber.Map{"PageId": page_id}, layout) if err != nil { return Fail(err, "failed to render %s", path) } log.Printf("RENDER: %s -> %s", template_name, target_path) out.Close() } } return nil }) if err != nil { log.Fatalf("can't walk content") } } func main() { config.Load("ssgod.toml") log.Printf("views=%s, layouts=%s, target=%s", config.Settings.Views, config.Settings.Layouts, config.Settings.Target) RenderPages(config.Settings.Views, config.Settings.Layouts, config.Settings.Target) }