pagr

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

commit a552991c53ca03347904d63925e2e334f1c7550b
parent b6aaa0eef43e00498993e11470bc20edfa526d11
Author: gearsix <gearsix@tuta.io>
Date:   Tue, 17 Aug 2021 13:38:45 +0100

added Config.Assets;all Config.Assets files are copied on build

Diffstat:
Mconfig.go | 8++++++--
Mpage.go | 41++++++++++++++++++++++-------------------
Mpagr.go | 19+++++++++++++++++--
3 files changed, 45 insertions(+), 23 deletions(-)

diff --git a/config.go b/config.go @@ -9,14 +9,16 @@ import ( // Config is the data structure containing all key/values to be loaded // in pagr configuration files type Config struct { - Pages string + Pages string Templates string + Assets []string Output string } // relPaths sets all filepath values in `cfg` relative to `dir` func (cfg *Config) relPaths(dir string) { var paths = []string{cfg.Pages, cfg.Templates, cfg.Output} + paths = append(paths, cfg.Assets...) for i, path := range paths { if !filepath.IsAbs(path) { paths[i] = filepath.Join(dir, path) @@ -25,14 +27,16 @@ func (cfg *Config) relPaths(dir string) { cfg.Pages = paths[0] cfg.Templates = paths[1] cfg.Output = paths[2] + cfg.Assets = paths[3:] return } // NewConfig returns a Config with default values func NewConfig() Config { return Config{ - Pages: "./content", + Pages: "./content", Templates: "./templates", + Assets: []string{"./assets"}, Output: "./out", } } diff --git a/page.go b/page.go @@ -325,28 +325,31 @@ 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() + CopyFile(filepath.Join(srcDir, a), filepath.Join(outDir, a)) + } + return +} - 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() +func CopyFile(src, dst string) (err error) { + if err = os.MkdirAll(filepath.Dir(dst), 0777); err != nil { + return err + } - if _, err = io.Copy(dstf, srcf); err != nil { - return err - } - dstf.Sync() + var srcf, dstf *os.File + if srcf, err = os.Open(src); err != nil { + return err + } + defer srcf.Close() + 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 } diff --git a/pagr.go b/pagr.go @@ -2,6 +2,7 @@ package main import ( "flag" + "io/fs" "os" "strings" "sync" @@ -64,13 +65,14 @@ func main() { log.Printf("loaded %d template files", len(t)) htmlc := 0 - assetc := 0 + assetc := copyAssets(wg, config) 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()) + log.Printf("warning: skipping '%s', failed to find template '%s'\n", + pg.Path, pg.GetTemplate()) continue } else { check(err) @@ -105,3 +107,16 @@ func findTemplate(pg Page, templates []suti.Template) (suti.Template, error) { return t, err } +func copyAssets(wg sync.WaitGroup, cfg Config) (n int) { + for _, a := range cfg.Assets { + filepath.Walk(a, func(path string, info fs.FileInfo, err error) error { + if !info.IsDir() { + n++ + wg.Add(1) + go CopyFile(path, filepath.Join(cfg.Output, strings.TrimPrefix(path, filepath.Clean(a)))) + } + return err + }) + } + return n +}