Refactor the code more to make it esier to work on.

master
Zed A. Shaw 4 weeks ago
parent 08f90ec9f4
commit c0b4d68a9a
  1. 2
      config/loader.go
  2. 2
      example/ssgod.toml
  3. 88
      main.go

@ -7,7 +7,7 @@ import (
type config struct {
Views string `toml:"views"`
Layouts string `toml:"layouts"`
Layout string `toml:"layout"`
Target string `toml:"target"`
}

@ -1,3 +1,3 @@
views = "./pages"
layouts = "layouts/main"
layout = "layouts/main"
target = "./public"

@ -18,57 +18,63 @@ func Fail(err error, format string, v ...any) error {
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); }
func ProcessDirEntry(engine *html.Engine, path string, d fs.DirEntry, err error) error {
settings := config.Settings
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);
}
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)
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...)
if found && ext == ".html" && template_name != settings.Layout {
prefixed_path := append([]string{settings.Target}, split_path...)
target_path := filepath.Join(prefixed_path...)
_, err := os.Stat(target_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)
}
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
// 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) }
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"
// 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) }
err = engine.Render(out, template_name, fiber.Map{"PageId": page_id}, settings.Layout)
if err != nil { return Fail(err, "failed to render %s", path) }
log.Printf("RENDER: %s -> %s", template_name, target_path)
out.Close()
}
}
log.Printf("RENDER: %s -> %s", template_name, target_path)
out.Close()
}
}
return nil
}
func RenderPages() {
engine := html.New(config.Settings.Views, ".html")
engine.Load()
return nil
})
err := filepath.WalkDir(config.Settings.Views,
func (path string, d fs.DirEntry, err error) error {
return ProcessDirEntry(engine, path, d, err)
})
if err != nil { log.Fatalf("can't walk content") }
}
@ -76,7 +82,7 @@ func RenderPages(pages_path string, layout string, target string) {
func main() {
config.Load("ssgod.toml")
log.Printf("views=%s, layouts=%s, target=%s",
config.Settings.Views, config.Settings.Layouts, config.Settings.Target)
config.Settings.Views, config.Settings.Layout, config.Settings.Target)
RenderPages(config.Settings.Views, config.Settings.Layouts, config.Settings.Target)
RenderPages()
}

Loading…
Cancel
Save