79 lines
1.5 KiB
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
|
|
}
|