pagr

A 'static site generator', built using dati.
Log | Files | Refs | Atom

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:
Mpage.go | 42++++++++++++++++++++++++++++++++++++++++++
Mpagr.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 } +