mirror of
https://github.com/gohugoio/hugo.git
synced 2024-05-11 05:54:58 +00:00
This provides an abstraction over how files are processed by Hugo. This allows for alternatives like CMS systems or Dropbox, etc.
73 lines
1.1 KiB
Go
73 lines
1.1 KiB
Go
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] == '.'
|
|
}
|