diff options
author | Noah Campbell <noahcampbell@gmail.com> | 2013-09-04 22:28:59 -0700 |
---|---|---|
committer | Noah Campbell <noahcampbell@gmail.com> | 2013-09-04 22:42:52 -0700 |
commit | 610c06e6589770d950d8fd4e01efd90b132fcff5 (patch) | |
tree | 859f0cb1ce70875175d3910e4ccd05fdd8173393 /source/filesystem.go | |
parent | d4d9da9f3a6358e8325d0c3f973a5842ef3be039 (diff) | |
download | hugo-610c06e6589770d950d8fd4e01efd90b132fcff5.tar.gz hugo-610c06e6589770d950d8fd4e01efd90b132fcff5.zip |
Introduce source.Filesystem
This provides an abstraction over how files are processed by Hugo. This
allows for alternatives like CMS systems or Dropbox, etc.
Diffstat (limited to 'source/filesystem.go')
-rw-r--r-- | source/filesystem.go | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/source/filesystem.go b/source/filesystem.go new file mode 100644 index 000000000..5434431aa --- /dev/null +++ b/source/filesystem.go @@ -0,0 +1,72 @@ +package source + +import ( + "io" + "os" + "path/filepath" +) + +type Input interface { + Files() []*File +} + +type File struct { + Name string + Contents io.Reader +} + +type Filesystem struct { + files []*File + Base string + AvoidPaths []string +} + +func (f *Filesystem) Files() []*File { + f.captureFiles() + return f.files +} + +func (f *Filesystem) add(name string, reader io.Reader) { + f.files = append(f.files, &File{Name: name, Contents: reader}) +} + +func (f *Filesystem) captureFiles() { + + walker := func(path string, fi os.FileInfo, err error) error { + if err != nil { + return nil + } + + if fi.IsDir() { + if f.avoid(path) { + return filepath.SkipDir + } + return nil + } else { + if ignoreDotFile(path) { + return nil + } + file, err := os.Open(path) + if err != nil { + return err + } + f.add(path, file) + return nil + } + } + + filepath.Walk(f.Base, walker) +} + +func (f *Filesystem) avoid(path string) bool { + for _, avoid := range f.AvoidPaths { + if avoid == path { + return true + } + } + return false +} + +func ignoreDotFile(path string) bool { + return filepath.Base(path)[0] == '.' +} |