all repos — homestead @ 543bd2479e0f414cf4adc9e83a4e47052d55f5be

Code for my website

use content collection to read static files in root

Alan Pearce
commit

543bd2479e0f414cf4adc9e83a4e47052d55f5be

parent

526002b13309812ce647faff2bdf66d6991ec467

1 file changed, 70 insertions(+), 14 deletions(-)

changed files
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 }