content: walk filesystem in one place only
1 file changed, 37 insertions(+), 53 deletions(-)
jump to
M internal/content/posts.go → internal/content/posts.go
@@ -79,11 +79,11 @@ ".md", "/", ) func (cc *Collection) GetPost(filename string) (*Post, error) { - fp := filepath.Join(cc.config.Root, cc.config.PostDir, filename) - url := path.Join("/", cc.config.PostDir, postURLReplacer.Replace(filename)) + "/" + fp := filepath.Join(cc.config.Root, filename) + url := path.Join("/", postURLReplacer.Replace(filename)) + "/" post := &Post{ Input: fp, - Output: path.Join(cc.config.PostDir, postOutputReplacer.Replace(filename)), + Output: postOutputReplacer.Replace(filename), Basename: filepath.Base(url), URL: url, PostMatter: &PostMatter{},@@ -158,32 +158,39 @@ return buf.String(), nil } -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 errors.WithMessagef(err, "could not read post directory %s", subdir) - } - for _, f := range files { - fn := f.Name() - if !f.IsDir() && path.Ext(fn) == ".md" { - cc.log.Debug("reading post", "post", fn) - post, err := cc.GetPost(fn) - if err != nil { - return err - } +func (cc *Collection) HandleFile(filename string, d fs.DirEntry) error { + switch { + case strings.HasPrefix(filename, ".") && + filename != "." && + !strings.HasPrefix(filename, ".well-known"): - for _, tag := range post.PostMatter.Taxonomies.Tags { - cc.Tags.Add(strings.ToLower(tag)) - } + cc.log.Debug("skipping", "filename", filename, "is_dir", d.Type().IsDir()) + if d.Type().IsDir() { + return fs.SkipDir + } + case !d.Type().IsDir(): + if filepath.Ext(filename) == ".md" { + if strings.HasPrefix(filename, cc.config.PostDir) { + post, err := cc.GetPost(filename) + if err != nil { + return err + } - cc.Posts = append(cc.Posts, *post) + for _, tag := range post.PostMatter.Taxonomies.Tags { + cc.Tags.Add(strings.ToLower(tag)) + } + cc.Posts = append(cc.Posts, *post) + } else { + page, err := cc.GetPage(filename) + if err != nil { + return err + } + cc.Pages = append(cc.Pages, *page) + } + } else { + cc.StaticFiles = append(cc.StaticFiles, filename) } } - slices.SortFunc(cc.Posts, func(a, b Post) int { - return b.Date.Compare(a.Date) - }) return nil }@@ -208,37 +215,14 @@ 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"): + return cc.HandleFile(filename, d) + }) - 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) - } - } + slices.SortFunc(cc.Posts, func(a, b Post) int { + return b.Date.Compare(a.Date) + }) - return nil - }) if err != nil { return nil, errors.WithMessage(err, "could not walk directory") }