pagr

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

commit edd5aee33076a1489c78c27bfb93d56fba13d18c
parent 83ac179c26a4c6f9664774ccfd9ba538102f5fce
Author: gearsix <gearsix@tuta.io>
Date:   Thu, 17 Mar 2022 22:09:14 +0000

tidyup: regressed -> 1.13; did some tidyup; gofmt

Diffstat:
Mconfig.go | 4++--
Mcontent.go | 22++++++++++++----------
Mcontent_test.go | 2+-
Mgo.mod | 4++--
Mgo.sum | 2++
Mpage.go | 12+++---------
Mpagr.go | 134+++++++++++++++++++++++++++++++++++++++----------------------------------------
Msitemap_test.go | 4++--
Mtemplate.go | 6+++---
9 files changed, 93 insertions(+), 97 deletions(-)

diff --git a/config.go b/config.go @@ -9,7 +9,7 @@ import ( // Config is the data structure containing all key/values to be loaded // in pagr configuration files type Config struct { - Contents string + Contents string Templates string Assets []string Output string @@ -34,7 +34,7 @@ func (cfg *Config) relPaths(dir string) { // NewConfig returns a Config with default values func NewConfig() Config { return Config{ - Contents: "./content", + Contents: "./content", Templates: "./templates", Assets: []string{"./assets"}, Output: "./out", diff --git a/content.go b/content.go @@ -4,17 +4,17 @@ import ( "bufio" "bytes" "fmt" - "io" - "io/fs" "github.com/yuin/goldmark" goldmarkext "github.com/yuin/goldmark/extension" goldmarkparse "github.com/yuin/goldmark/parser" goldmarkhtml "github.com/yuin/goldmark/renderer/html" + "io" + "io/ioutil" "notabug.org/gearsix/suti" - "path/filepath" "os" - "strings" + "path/filepath" "sort" + "strings" "time" ) @@ -39,18 +39,20 @@ func isContentExt(ext string) int { } func lastModFile(fpath string) (t time.Time) { - if fd, e := os.Stat(fpath); e != nil { + if fd, err := os.Stat(fpath); err != nil { t = time.Now() } else if !fd.IsDir() { t = fd.ModTime() } else { // find last modified file in directory (depth 1) - dir, err := os.ReadDir(fpath) - if err != nil { + t = fd.ModTime() + + var dir []os.FileInfo + if dir, err = ioutil.ReadDir(fpath); err != nil { return t } for i, d := range dir { - if fd, err := d.Info(); err == nil && (i == 0 || fd.ModTime().After(t)) { + if i == 0 || d.ModTime().After(t) { t = fd.ModTime() } } @@ -72,7 +74,7 @@ func LoadContentsDir(dir string) (p []Page, e error) { pages := make(map[string]Page) dmetas := make(map[string]Meta) - e = filepath.Walk(dir, func(fpath string, info fs.FileInfo, err error) error { + e = filepath.Walk(dir, func(fpath string, info os.FileInfo, err error) error { if err != nil { return err } @@ -139,7 +141,7 @@ func LoadContentsDir(dir string) (p []Page, e error) { func NewContentFromFile(fpath string) (c Content, err error) { var buf []byte if f, err := os.Open(fpath); err == nil { - buf, err = io.ReadAll(f) + buf, err = ioutil.ReadAll(f) f.Close() } if err != nil { diff --git a/content_test.go b/content_test.go @@ -1,8 +1,8 @@ package main import ( - "testing" "os" + "testing" ) func TestLoadContentsDir(test *testing.T) { diff --git a/go.mod b/go.mod @@ -1,8 +1,8 @@ module notabug.org/gearsix/pagr -go 1.16 +go 1.13 require ( github.com/yuin/goldmark v1.4.0 - notabug.org/gearsix/suti v1.0.0 + notabug.org/gearsix/suti v0.7.1 ) diff --git a/go.sum b/go.sum @@ -717,6 +717,8 @@ mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphD mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f h1:Cq7MalBHYACRd6EesksG1Q8EoIAKOsiZviGKbOLIej4= mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZIVpwbkw+04kSxk3rAtzlimaUJw= +notabug.org/gearsix/suti v0.7.1 h1:kTGp2qUeslYuzvTcgq/utZsJFXwkcRp5wDlfU83cOfs= +notabug.org/gearsix/suti v0.7.1/go.mod h1:JFgJVp+7hQiR/ugF6jU24HwmZJ3WWNp0oMQZr5QKIXs= notabug.org/gearsix/suti v1.0.0 h1:7DvbBIBELa9WVyvISxd5JAhLxbOTRfpjic3Sry9F2PE= notabug.org/gearsix/suti v1.0.0/go.mod h1:TfuoxBbT2YtIy6d5BqqMC6rfrlKb5d3/mIS6/y5SXGU= rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE= diff --git a/page.go b/page.go @@ -2,9 +2,10 @@ package main import ( "bytes" + "io/ioutil" + "notabug.org/gearsix/suti" "os" "path/filepath" - "notabug.org/gearsix/suti" "strings" "time" ) @@ -113,19 +114,12 @@ func (page *Page) applyDefaults(defaultMetas map[string]Meta) { } } -func (p *Page) CopyAssets(srcDir, outDir string) (err error) { - for _, a := range p.Assets { - CopyFile(filepath.Join(srcDir, a), filepath.Join(outDir, a)) - } - return -} - func (p *Page) Build(outDir string, t suti.Template) (out string, err error) { var buf bytes.Buffer if buf, err = t.Execute(p); err == nil { out = filepath.Join(outDir, p.Path, "index.html") if err = os.MkdirAll(filepath.Dir(out), 0755); err == nil { - err = os.WriteFile(out, buf.Bytes(), 0644) + err = ioutil.WriteFile(out, buf.Bytes(), 0644) } } return out, err diff --git a/pagr.go b/pagr.go @@ -2,33 +2,32 @@ package main import ( "flag" - "fmt" - "io/fs" "log" "notabug.org/gearsix/suti" "os" "path/filepath" "strings" - "sync" ) const Name = "pagr" const Version = "0.0.0" -var cfg string -var verbose bool +var config Config +var flagConfig string +var flagVerbose bool + var ilog = log.New(os.Stdout, "", 0) var elog = log.New(os.Stderr, "", 0) func vlog(fmt string, args ...interface{}) { - if verbose { + if flagVerbose { ilog.Printf(fmt, args...) } } func check(err error) { if err != nil { - if verbose { + if flagVerbose { elog.Panic(err.Error()) } else { elog.Fatalf("ERROR! %s\n", err) @@ -41,97 +40,96 @@ func ignoreFile(filepath string) bool { } func init() { - flag.StringVar(&cfg, "cfg", "", "path to pagr project configuration file") - flag.BoolVar(&verbose, "v", false, "print verbose ilog.") + flag.BoolVar(&flagVerbose, "v", false, "print verbose ilog.") + flag.StringVar(&flagConfig, "cfg", "", "path to pagr project configuration file") } func main() { flag.Parse() vlog("verbose on") - - var err error - var config Config - if len(cfg) > 0 { - vlog("loading '%s'", cfg) - config, err = NewConfigFromFile(cfg) - check(err) - } else { - ilog.Println("no cfg passed, using defaults") - config = NewConfig() - } + config = loadConfigFile() vlog("loaded config: %s\n", config) - var pages []Page - pages, err = LoadContentsDir(config.Contents) + var err error + var content []Page + content, err = LoadContentsDir(config.Contents) check(err) - ilog.Printf("loaded %d content pages", len(pages)) + ilog.Printf("loaded %d content pages", len(content)) var templates []suti.Template templates, err = LoadTemplateDir(config.Templates) check(err) ilog.Printf("loaded %d template files", len(templates)) + ilog.Println("copying assets...") + assetc := copyAssets() + ilog.Println("building project...") - htmlc := 0 - var wg sync.WaitGroup - assetc := copyAssets(wg, config) - for _, page := range pages { - if err := buildPage(config, page, templates); err != nil { - ilog.Printf("skipping %s: %s\n", page.Path, err) - return + pagec := 0 + for _, p := range content { + _, err = p.Build(config.Output, findPageTemplate(p, templates)) + if err != nil { + ilog.Printf("skipping %s: %s\n", p.Path, err) + continue + } + + for _, asset := range p.Assets { + src := filepath.Join(config.Contents, asset) + dst := filepath.Join(config.Output, asset) + check(CopyFile(src, dst)) } - check(page.CopyAssets(config.Contents, config.Output)) - vlog("-> %s", page.Path) - htmlc++ - assetc += len(page.Assets) + + pagec++ + assetc += len(p.Assets) + vlog("-> %s", p.Path) } - ilog.Printf("generated %d html files, copied %d asset files\n", htmlc, assetc) + ilog.Printf("generated %d html files, copied %d asset files\n", pagec, assetc) ilog.Println("pagr success") return } -func findTemplateIndex(p Page, templates []suti.Template) (t int) { - for t, template := range templates { - if template.Name == p.TemplateName() { - return t - } +func loadConfigFile() Config { + if len(flagConfig) > 0 { + vlog("loading '%s'", flagConfig) + c, err := NewConfigFromFile(flagConfig) + check(err) + return c + } else { + ilog.Println("no cfg passed, using defaults") + return NewConfig() } - return -1 } -func buildPage(cfg Config, p Page, t []suti.Template) error { - var tmpl *suti.Template +func findPageTemplate(p Page, t []suti.Template) (tmpl suti.Template) { for i, template := range t { if template.Name == p.TemplateName() { - tmpl = &t[i] + tmpl = t[i] + break } } - if tmpl == nil { - return fmt.Errorf("failed to find template '%s'", p.TemplateName()) - } - - _, err := p.Build(cfg.Output, *tmpl) - check(err) - check(p.CopyAssets(cfg.Contents, cfg.Output)) - return err + return } -func copyAssets(wg sync.WaitGroup, cfg Config) (n int) { - for _, a := range cfg.Assets { - err := filepath.Walk(a, func(src string, info fs.FileInfo, err error) error { - if err == nil && !info.IsDir() && !ignoreFile(src) { - a = filepath.Clean(a) - path := strings.TrimPrefix(src, a) - n++ - check(CopyFile(src, filepath.Join(cfg.Output, path))) - vlog("-> %s", path) - } - return err - }) - if !os.IsNotExist(err) { - check(err) - } +func copyAssets() (count int) { + for _, asset := range config.Assets { + filepath.Walk(asset, + func(path string, info os.FileInfo, err error) error { + if err == nil && !info.IsDir() && !ignoreFile(path) { + dst := strings.TrimPrefix(path, asset) + err = CopyFile(path, filepath.Join(config.Output, dst)) + count++ + } + + if err != nil { + ilog.Printf("skipping %s: %s\n", path, err) + err = nil + } + + return err + }) } - return n + return } + + diff --git a/sitemap_test.go b/sitemap_test.go @@ -17,7 +17,7 @@ func TestBuildCrumbs(test *testing.T) { if p, err = LoadContentsDir(tdir); err != nil { test.Errorf("LoadContentsDir failed: %s", err) } - + validateTestPagesNav(test, p) } @@ -34,6 +34,6 @@ func TestBuildSitemap(test *testing.T) { if p, err = LoadContentsDir(tdir); err != nil { test.Errorf("LoadContentsDir failed: %s", err) } - + validateTestPagesNav(test, p) } diff --git a/template.go b/template.go @@ -1,8 +1,8 @@ package main import ( - "io/fs" "notabug.org/gearsix/suti" + "os" "path/filepath" "strings" ) @@ -18,7 +18,7 @@ const DefaultTemplateName = "root" func LoadTemplateDir(dir string) (templates []suti.Template, err error) { templatePaths := make(map[string][]string) // map[rootPath][]partialPaths... - err = filepath.Walk(dir, func(path string, info fs.FileInfo, e error) error { + err = filepath.Walk(dir, func(path string, info os.FileInfo, e error) error { lang := strings.TrimPrefix(filepath.Ext(path), ".") if e != nil || info.IsDir() || strings.Contains(path, ".ignore") || suti.IsSupportedTemplateLang(lang) == -1 { return e @@ -28,7 +28,7 @@ func LoadTemplateDir(dir string) (templates []suti.Template, err error) { return e }) - err = filepath.Walk(dir, func(path string, info fs.FileInfo, e error) error { + err = filepath.Walk(dir, func(path string, info os.FileInfo, e error) error { lang := strings.TrimPrefix(filepath.Ext(path), ".") if e != nil || info.IsDir() || ignoreFile(path) || suti.IsSupportedTemplateLang(lang) == -1 { return e