fileInfo.go (2335B)
1 // Copyright 2017-present The Hugo Authors. All rights reserved. 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // http://www.apache.org/licenses/LICENSE-2.0 7 // 8 // Unless required by applicable law or agreed to in writing, software 9 // distributed under the License is distributed on an "AS IS" BASIS, 10 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 11 // See the License for the specific language governing permissions and 12 // limitations under the License. 13 14 package hugolib 15 16 import ( 17 "fmt" 18 "strings" 19 20 "github.com/gohugoio/hugo/hugofs/files" 21 22 "github.com/gohugoio/hugo/hugofs" 23 24 "github.com/spf13/afero" 25 26 "github.com/gohugoio/hugo/source" 27 ) 28 29 // fileInfo implements the File and ReadableFile interface. 30 var ( 31 _ source.File = (*fileInfo)(nil) 32 ) 33 34 type fileInfo struct { 35 source.File 36 37 overriddenLang string 38 } 39 40 func (fi *fileInfo) Open() (afero.File, error) { 41 f, err := fi.FileInfo().Meta().Open() 42 if err != nil { 43 err = fmt.Errorf("fileInfo: %w", err) 44 } 45 46 return f, err 47 } 48 49 func (fi *fileInfo) Lang() string { 50 if fi.overriddenLang != "" { 51 return fi.overriddenLang 52 } 53 return fi.File.Lang() 54 } 55 56 func (fi *fileInfo) String() string { 57 if fi == nil || fi.File == nil { 58 return "" 59 } 60 return fi.Path() 61 } 62 63 // TODO(bep) rename 64 func newFileInfo(sp *source.SourceSpec, fi hugofs.FileMetaInfo) (*fileInfo, error) { 65 baseFi, err := sp.NewFileInfo(fi) 66 if err != nil { 67 return nil, err 68 } 69 70 f := &fileInfo{ 71 File: baseFi, 72 } 73 74 return f, nil 75 } 76 77 type bundleDirType int 78 79 const ( 80 bundleNot bundleDirType = iota 81 82 // All from here are bundles in one form or another. 83 bundleLeaf 84 bundleBranch 85 ) 86 87 // Returns the given file's name's bundle type and whether it is a content 88 // file or not. 89 func classifyBundledFile(name string) (bundleDirType, bool) { 90 if !files.IsContentFile(name) { 91 return bundleNot, false 92 } 93 if strings.HasPrefix(name, "_index.") { 94 return bundleBranch, true 95 } 96 97 if strings.HasPrefix(name, "index.") { 98 return bundleLeaf, true 99 } 100 101 return bundleNot, true 102 } 103 104 func (b bundleDirType) String() string { 105 switch b { 106 case bundleNot: 107 return "Not a bundle" 108 case bundleLeaf: 109 return "Regular bundle" 110 case bundleBranch: 111 return "Branch bundle" 112 } 113 114 return "" 115 }