commit 097cfddac597f82b09ce7d49f400f2dd464c4c1f
parent 59d536a260267d6cd4a2b82d7dd4628ba1f28532
Author: gearsix <gearsix@tuta.io>
Date: Thu, 29 Jul 2021 14:28:14 +0100
finished build process
Added Page.Build(), Page.CopyAssets()
Pages are built using goroutines & a WaitGroup to speed up where there
are a lot of assets to copy
Diffstat:
M | page.go | | | 42 | ++++++++++++++++++++++++++++++++++++++++++ |
M | pagr.go | | | 72 | ++++++++++++++++++++++++++++++++++++++++-------------------------------- |
2 files changed, 82 insertions(+), 32 deletions(-)
diff --git a/page.go b/page.go
@@ -322,6 +322,48 @@ func (page *Page) applyDefaults(defaultMetas map[string]Meta) {
}
}
+func (p *Page) CopyAssets(srcDir, outDir string) (err error) {
+ for _, a := range p.Assets {
+ var srcf *os.File
+ src := filepath.Join(srcDir, a)
+ if srcf, err = os.Open(src); err != nil {
+ return err
+ }
+ defer srcf.Close()
+
+ var dstf *os.File
+ dst := filepath.Join(outDir, a)
+ if err = os.MkdirAll(filepath.Dir(dst), 0777); err != nil {
+ return err
+ }
+ if dstf, err = os.OpenFile(dst, os.O_RDWR|os.O_CREATE, 0644); err != nil {
+ return err
+ }
+ defer dstf.Close()
+
+ if _, err = io.Copy(dstf, srcf); err != nil {
+ return err
+ }
+ dstf.Sync()
+ }
+ return
+}
+
+func (p *Page) Build(outDir string, t suti.Template) error {
+ if outb, err := t.Execute(p); err != nil {
+ return err
+ } else {
+ out := filepath.Join(outDir, p.Path, "index.html")
+ if err = os.MkdirAll(filepath.Dir(out), 0755); err != nil {
+ return err
+ }
+ if err = os.WriteFile(out, outb.Bytes(), 0644); err != nil {
+ return err
+ }
+ }
+ return nil
+}
+
// convertTextToHTML parses textual data from `in` and line-by-line converts
// it to HTML. Conversion rules are as follows:
// - Blank lines (with escape characters trimmed) will close any opon tags
diff --git a/pagr.go b/pagr.go
@@ -1,10 +1,10 @@
package main
import (
- "bytes"
+ "flag"
"os"
"strings"
- "flag"
+ "sync"
"path/filepath"
"log"
"notabug.org/gearsix/suti"
@@ -53,47 +53,55 @@ func main() {
}
vlog("loaded config: %s\n", config)
- var c []Page
- c, err = LoadPagesDir(config.Pages)
+ var p []Page
+ p, err = LoadPagesDir(config.Pages)
check(err)
- log.Printf("loaded %d content pages", len(c))
+ log.Printf("loaded %d content pages", len(p))
var t []suti.Template
t, err = LoadTemplateDir(config.Templates)
check(err)
log.Printf("loaded %d template files", len(t))
- build(config, c, t)
- log.Println("pagr success")
+ htmlc := 0
+ assetc := 0
+ var wg sync.WaitGroup
+ for _, pg := range p {
+ var tmpl suti.Template
+ tmpl, err = findTemplate(pg, t)
+ if os.IsNotExist(err) {
+ log.Printf("warning: skipping '%s', failed to find template '%s'\n", pg.Path, pg.GetTemplate())
+ continue
+ } else {
+ check(err)
+ }
+ wg.Add(1)
+ go func() {
+ defer wg.Done()
+ check(pg.Build(config.Output, tmpl))
+ check(pg.CopyAssets(config.Pages, config.Output))
+ vlog("-> %s", pg.Path)
+ }()
+ htmlc++
+ assetc += len(pg.Assets)
+ }
+ wg.Wait()
+ log.Printf("generated %d html files, copied %d asset files\n", htmlc, assetc)
+ log.Println("pagr success")
return
}
-func build(config Config, pages []Page, templates []suti.Template) {
- var err error
- var out bytes.Buffer
-
- outc := len(pages)
- for _, pg := range pages {
- out.Reset()
- target := pg.GetTemplate()
- for _, t := range templates {
- tname := filepath.Base(t.Source)
- if tname == target || strings.TrimSuffix(tname, filepath.Ext(tname)) == target {
- if out, err = t.Execute(pg); err != nil {
- log.Printf("Execution error in template '%s':\n", target)
- check(err)
- }
- outp := filepath.Join(config.Output, pg.Path, "index.html")
- check(os.MkdirAll(filepath.Dir(outp), 0755))
- check(os.WriteFile(outp, out.Bytes(), 0644))
- vlog("-> %s", outp)
- }
- }
- if out.Len() == 0 {
- log.Printf("warning: skipping '%s', failed to find template '%s'\n", pg.Path, target)
- outc--
+func findTemplate(pg Page, templates []suti.Template) (suti.Template, error) {
+ var t suti.Template
+ err := os.ErrNotExist
+ target := pg.GetTemplate()
+ for _, t := range templates {
+ tname := filepath.Base(t.Source)
+ if tname == target || strings.TrimSuffix(tname, filepath.Ext(tname)) == target {
+ return t, nil
}
}
- log.Printf("generated %d html files\n", outc)
+ return t, err
}
+