1
0
mirror of https://github.com/danog/gojekyll.git synced 2024-12-11 19:49:42 +01:00
gojekyll/collections/read.go
2017-07-03 09:48:41 -04:00

76 lines
1.9 KiB
Go

package collections
import (
"fmt"
"os"
"path/filepath"
"sort"
"strings"
"github.com/osteele/gojekyll/helpers"
"github.com/osteele/gojekyll/pages"
"github.com/osteele/gojekyll/templates"
)
// ReadPages scans the file system for collection pages, and adds them to c.Pages.
func (c *Collection) ReadPages(sitePath string, frontMatterDefaults func(string, string) map[string]interface{}) error {
pageDefaults := map[string]interface{}{
"collection": c.Name,
"permalink": c.PermalinkPattern(),
}
walkFn := func(filename string, info os.FileInfo, err error) error {
if err != nil {
// if the issue is simply that the directory doesn't exist, warn instead of error
if os.IsNotExist(err) {
if !c.IsPostsCollection() {
fmt.Printf("Missing collection directory: _%s\n", c.Name)
}
return nil
}
return err
}
relname := helpers.MustRel(sitePath, filename)
switch {
case strings.HasPrefix(filepath.Base(relname), "."):
return nil
case err != nil:
return err
case info.IsDir():
return nil
}
fm := templates.MergeVariableMaps(pageDefaults, frontMatterDefaults(relname, c.Name))
return c.readFile(filename, relname, fm)
}
if c.IsPostsCollection() && c.Config().Drafts {
if err := filepath.Walk(filepath.Join(sitePath, "_drafts"), walkFn); err != nil {
return err
}
sort.Sort(pagesByDate{c.pages})
}
return filepath.Walk(filepath.Join(sitePath, c.PathPrefix()), walkFn)
}
// readFile mutates fm.
func (c *Collection) readFile(abs string, rel string, fm map[string]interface{}) error {
strategy := c.strategy()
switch {
case !strategy.collectible(rel):
return nil
case strategy.future(rel) && !c.Config().Future:
return nil
default:
strategy.addDate(rel, fm)
}
f, err := pages.NewFile(abs, c, filepath.ToSlash(rel), fm)
switch {
case err != nil:
return err
case f.Static():
return nil
case f.Published() || c.Config().Unpublished:
p := f.(pages.Page)
c.pages = append(c.pages, p)
}
return nil
}