diff options
author | Noah Campbell <noahcampbell@gmail.com> | 2013-09-20 17:03:43 -0700 |
---|---|---|
committer | Noah Campbell <noahcampbell@gmail.com> | 2013-09-20 17:03:43 -0700 |
commit | 52e8c7a0ac76f4aa1fff8ff30a6d5074bd459347 (patch) | |
tree | fcabd15f6b496589edcf56be200f865177606a70 /source/filesystem.go | |
parent | 784077da4dcc3476f61bbf99c5f873b71694dd64 (diff) | |
download | hugo-52e8c7a0ac76f4aa1fff8ff30a6d5074bd459347.tar.gz hugo-52e8c7a0ac76f4aa1fff8ff30a6d5074bd459347.zip |
Section is determined by the source, not the url
This change allows for top level html content to exists.
Diffstat (limited to 'source/filesystem.go')
-rw-r--r-- | source/filesystem.go | 65 |
1 files changed, 52 insertions, 13 deletions
diff --git a/source/filesystem.go b/source/filesystem.go index da3983aec..6c9f4e7c1 100644 --- a/source/filesystem.go +++ b/source/filesystem.go @@ -1,8 +1,10 @@ package source import ( + "errors" "io" "os" + "path" "path/filepath" ) @@ -11,8 +13,11 @@ type Input interface { } type File struct { - Name string - Contents io.Reader + name string + LogicalName string + Contents io.Reader + Section string + Dir string } type Filesystem struct { @@ -26,32 +31,66 @@ func (f *Filesystem) Files() []*File { return f.files } -func (f *Filesystem) add(name string, reader io.Reader) { +var errMissingBaseDir = errors.New("source: missing base directory") + +func (f *Filesystem) add(name string, reader io.Reader) (err error) { + + if name, err = f.getRelativePath(name); err != nil { + return err + } + + dir, logical := path.Split(name) + _, section := path.Split(path.Dir(name)) + if section == "." { + section = "" + } + + f.files = append(f.files, &File{ + name: name, + LogicalName: logical, + Contents: reader, + Section: section, + Dir: dir, + }) + return +} + +func (f *Filesystem) getRelativePath(name string) (final string, err error) { + if filepath.IsAbs(name) && f.Base == "" { + return "", errMissingBaseDir + } + name = filepath.Clean(name) + base := filepath.Clean(f.Base) + + name, err = filepath.Rel(base, name) + if err != nil { + return "", err + } name = filepath.ToSlash(name) - f.files = append(f.files, &File{Name: name, Contents: reader}) + return name, nil } func (f *Filesystem) captureFiles() { - walker := func(path string, fi os.FileInfo, err error) error { + walker := func(filePath string, fi os.FileInfo, err error) error { if err != nil { return nil } if fi.IsDir() { - if f.avoid(path) { + if f.avoid(filePath) { return filepath.SkipDir } return nil } else { - if ignoreDotFile(path) { + if ignoreDotFile(filePath) { return nil } - file, err := os.Open(path) + file, err := os.Open(filePath) if err != nil { return err } - f.add(path, file) + f.add(filePath, file) return nil } } @@ -59,15 +98,15 @@ func (f *Filesystem) captureFiles() { filepath.Walk(f.Base, walker) } -func (f *Filesystem) avoid(path string) bool { +func (f *Filesystem) avoid(filePath string) bool { for _, avoid := range f.AvoidPaths { - if avoid == path { + if avoid == filePath { return true } } return false } -func ignoreDotFile(path string) bool { - return filepath.Base(path)[0] == '.' +func ignoreDotFile(filePath string) bool { + return filepath.Base(filePath)[0] == '.' } |