progdoc/generator.go

79 lines
1.5 KiB
Go

package progdoc
import (
"io"
"log"
"os"
"path/filepath"
)
type generator struct {
outDir string
}
type generation struct {
OutDir string
}
func (g generator) genSite(siteMap siteMap) (_ generation, err error) {
outDir := g.outDir
if outDir == "" {
outDir, err = os.MkdirTemp("", "")
if err != nil {
return generation{}, err
}
}
log.Printf("Output dir: %s", outDir)
for _, page := range siteMap.Pages {
srcCtx := SourceCtx{Meta: siteMap.Meta}
targetPathDir := filepath.Join(outDir, page.Path)
err := os.MkdirAll(targetPathDir, os.ModePerm)
if err != nil {
return generation{}, err
}
if err := (func(fileName string) error {
f, err := os.Create(fileName)
if err != nil {
return err
}
defer f.Close()
return page.Source.HTML(f, &srcCtx)
})(filepath.Join(targetPathDir, "index.html")); err != nil {
return generation{}, err
}
}
for _, static := range siteMap.Static {
targetFullPath := filepath.Join(outDir, static.Path)
targetFullDir := filepath.Dir(targetFullPath)
err := os.MkdirAll(targetFullDir, os.ModePerm)
if err != nil {
return generation{}, err
}
if err := (func(fileName string) error {
r, err := static.Source.Open()
if err != nil {
return err
}
defer r.Close()
f, err := os.Create(fileName)
if err != nil {
return err
}
defer f.Close()
_, err = io.Copy(f, r)
return err
})(targetFullPath); err != nil {
return generation{}, err
}
}
return generation{OutDir: outDir}, nil
}