all repos — homestead @ 543bd2479e0f414cf4adc9e83a4e47052d55f5be

Code for my website

use content collection to read static files in root

Alan Pearce
commit

543bd2479e0f414cf4adc9e83a4e47052d55f5be

parent

526002b13309812ce647faff2bdf66d6991ec467

2 files changed, 93 insertions(+), 48 deletions(-)

jump to
M internal/builder/builder.gointernal/builder/builder.go
@@ -5,7 +5,6 @@ "context"
"database/sql" "fmt" "io" - "io/fs" "os" "path" "path/filepath"
@@ -42,37 +41,23 @@ return filepath.Join(src, rel)
} } -func copyRecursive(storage storage.Writer, src string) error { +func copyFile(storage storage.Writer, src string, rel string) error { buf := new(buffer.Buffer) - return filepath.WalkDir(src, func(path string, d fs.DirEntry, err error) error { - if err != nil { - return err - } - rel, err := filepath.Rel(src, path) - if err != nil { - return err - } - if d.IsDir() { - return storage.Mkdirp(rel) - } - - sf, err := os.Open(path) - if err != nil { - return err - } - defer sf.Close() - buf.Reset() - if _, err := io.Copy(buf, sf); err != nil { - return err - } - if err := storage.Write("/"+rel, buf); err != nil { - return err - } + sf, err := os.Open(src) + if err != nil { + return err + } + defer sf.Close() + buf.Reset() + if _, err := io.Copy(buf, sf); err != nil { + return err + } + if err := storage.Write("/"+rel, buf); err != nil { + return err + } - return nil - }) - + return nil } func build(
@@ -87,11 +72,6 @@ joinSource := joinSourcePath(options.Source)
r := &Result{ Hashes: make([]string, 0), - } - - err := copyRecursive(storage, joinSource("static")) - if err != nil { - return nil, errors.WithMessage(err, "could not copy static files") } log.Debug("reading posts", "source", options.Source)
@@ -271,6 +251,15 @@ return nil, err
} if err := storage.Write("/robots.txt", buf); err != nil { return nil, err + } + + for _, sf := range cc.StaticFiles { + src := joinSource(sf) + log.Debug("copying static file", "sf", sf, "src", src) + err = copyFile(storage, src, sf) + if err != nil { + return nil, err + } } return r, nil
M internal/content/posts.gointernal/content/posts.go
@@ -4,6 +4,7 @@ import (
"bytes" "context" "io" + "io/fs" "os" "path" "path/filepath"
@@ -48,9 +49,12 @@ }
type Collection struct { config *Config + log *log.Logger - Posts []Post - Tags mapset.Set[string] + Posts []Post + Pages []Post + StaticFiles []string + Tags mapset.Set[string] } var markdown = goldmark.New(
@@ -154,26 +158,20 @@
return buf.String(), nil } -func NewContentCollection(config *Config, log *log.Logger) (*Collection, error) { - cc := &Collection{ - Posts: []Post{}, - Tags: mapset.NewSet[string](), - config: config, - } - - log.Debug("reading posts", "root", config.Root, "input_dir", config.PostDir) - subdir := filepath.Join(config.Root, config.PostDir) +func (cc *Collection) readPosts() error { + cc.log.Debug("reading posts", "root", cc.config.Root, "input_dir", cc.config.PostDir) + subdir := filepath.Join(cc.config.Root, cc.config.PostDir) files, err := os.ReadDir(subdir) if err != nil { - return nil, errors.WithMessagef(err, "could not read post directory %s", subdir) + return errors.WithMessagef(err, "could not read post directory %s", subdir) } for _, f := range files { fn := f.Name() if !f.IsDir() && path.Ext(fn) == ".md" { - log.Debug("reading post", "post", fn) + cc.log.Debug("reading post", "post", fn) post, err := cc.GetPost(fn) if err != nil { - return nil, err + return err } for _, tag := range post.PostMatter.Taxonomies.Tags {
@@ -186,6 +184,64 @@ }
slices.SortFunc(cc.Posts, func(a, b Post) int { return b.Date.Compare(a.Date) }) + + return nil +} + +func NewContentCollection(config *Config, log *log.Logger) (*Collection, error) { + cc := &Collection{ + Posts: []Post{}, + Tags: mapset.NewSet[string](), + Pages: []Post{}, + StaticFiles: []string{}, + config: config, + log: log, + } + + err := filepath.WalkDir(config.Root, func(filename string, d fs.DirEntry, err error) error { + if err != nil { + return err + } + filename, err = filepath.Rel(config.Root, filename) + if err != nil { + return err + } + + log.Debug("walking", "filename", filename) + switch { + case filename == config.PostDir: + err = cc.readPosts() + if err != nil { + return err + } + + return fs.SkipDir + case strings.HasPrefix(filename, ".") && + filename != "." && + !strings.HasPrefix(filename, ".well-known"): + + log.Debug("skipping", "filename", filename, "is_dir", d.Type().IsDir()) + if d.Type().IsDir() { + return fs.SkipDir + } + case !d.Type().IsDir(): + switch filepath.Ext(filename) { + case ".md": + page, err := cc.GetPage(filename) + if err != nil { + return err + } + cc.Pages = append(cc.Pages, *page) + default: + cc.StaticFiles = append(cc.StaticFiles, filename) + } + } + + return nil + }) + if err != nil { + return nil, errors.WithMessage(err, "could not walk directory") + } return cc, nil }