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:
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