diff --git a/cache.go b/cache.go index 45a29e8..aa9050e 100644 --- a/cache.go +++ b/cache.go @@ -15,7 +15,7 @@ type cache struct { baseDir string } -func (self *cache) retrieveFile(context *Context, outputPath string, inputFiles []*File) (*File, error) { +func (self *cache) retrieveFile(context *Context, outputPath string, inputFiles []File) (File, error) { cachePath, err := self.buildCachePath(context, outputPath, inputFiles) if err != nil { return nil, err @@ -33,7 +33,7 @@ func (self *cache) retrieveFile(context *Context, outputPath string, inputFiles return outputFile, nil } -func (self *cache) storeFile(context *Context, outputFile *File, inputFiles []*File) error { +func (self *cache) storeFile(context *Context, outputFile File, inputFiles []File) error { cachePath, err := self.buildCachePath(context, outputFile.Path(), inputFiles) if err != nil { return err @@ -69,7 +69,7 @@ func (self *cache) storeFile(context *Context, outputFile *File, inputFiles []*F return nil } -func (self *cache) buildCachePath(context *Context, outputPath string, inputFiles []*File) (string, error) { +func (self *cache) buildCachePath(context *Context, outputPath string, inputFiles []File) (string, error) { hasher := crc32.NewIEEE() hasher.Write([]byte(outputPath)) diff --git a/context.go b/context.go index 7a90044..75b7981 100644 --- a/context.go +++ b/context.go @@ -24,20 +24,20 @@ type Context struct { threads int index int - filesIn chan *File - filesOut chan *File + filesIn chan File + filesOut chan File } // CreateFileFrom data creates a new file instance from the provided data buffer. -func (self *Context) CreateFileFromReader(sourcePath string, reader io.Reader) (*File, error) { +func (self *Context) CreateFileFromReader(sourcePath string, reader io.Reader) (File, error) { data, err := io.ReadAll(reader) if err != nil { return nil, err } - file := &File{ + file := &rawFile{ relPath: sourcePath, - props: make(map[string]Prop), + props: make(map[string]FileProp), modTime: time.Now(), size: int64(len(data)), reader: bytes.NewReader(data), @@ -48,7 +48,7 @@ func (self *Context) CreateFileFromReader(sourcePath string, reader io.Reader) ( } // CreateFileFromAsset creates a new file instance from the provided file path. -func (self *Context) CreateFileFromAsset(sourcePath, dataPath string) (*File, error) { +func (self *Context) CreateFileFromAsset(sourcePath, dataPath string) (File, error) { if filepath.IsAbs(sourcePath) { return nil, errors.New("source paths must be relative") } @@ -65,9 +65,9 @@ func (self *Context) CreateFileFromAsset(sourcePath, dataPath string) (*File, er return nil, errors.New("assets must be files") } - file := &File{ + file := &rawFile{ relPath: sourcePath, - props: make(map[string]Prop), + props: make(map[string]FileProp), modTime: info.ModTime(), size: info.Size(), dataPath: dataPath, @@ -78,14 +78,14 @@ func (self *Context) CreateFileFromAsset(sourcePath, dataPath string) (*File, er } // DispatchFile causes the file to get passed to the next link in the chain. -func (self *Context) DispatchFile(file *File) { +func (self *Context) DispatchFile(file File) { self.filesOut <- file } // DispatchAndCacheFile caches the file data (excluding the metadata), taking // dependencies on any input files that are needed to generate it, and then // passes it to the next link in the chain. -func (self *Context) DispatchAndCacheFile(outputFile *File, inputFiles ...*File) { +func (self *Context) DispatchAndCacheFile(outputFile File, inputFiles ...File) { if self.goldsmith.cache != nil { self.goldsmith.cache.storeFile(self, outputFile, inputFiles) } @@ -96,8 +96,8 @@ func (self *Context) DispatchAndCacheFile(outputFile *File, inputFiles ...*File) // RetrieveCachedFile looks up file data (excluding the metadata), given an // output path and any input files that are needed to generate it. The function // will return nil if the desired file is not found in the cache. -func (self *Context) RetrieveCachedFile(outputPath string, inputFiles ...*File) *File { - var outputFile *File +func (self *Context) RetrieveCachedFile(outputPath string, inputFiles ...File) File { + var outputFile File if self.goldsmith.cache != nil { outputFile, _ = self.goldsmith.cache.retrieveFile(self, outputPath, inputFiles) } diff --git a/file.go b/file.go index 91f9e5c..6b5c2e3 100644 --- a/file.go +++ b/file.go @@ -9,15 +9,9 @@ import ( "time" ) -type ( - Prop any - PropMap map[string]Prop -) - -// File represents in-memory or on-disk files in a chain. -type File struct { +type rawFile struct { relPath string - props map[string]Prop + props map[string]FileProp modTime time.Time size int64 @@ -27,8 +21,23 @@ type File struct { index int } -// Rename modifies the file path relative to the source directory. -func (self *File) Rename(path string) error { +func (self *rawFile) Path() string { + return filepath.ToSlash(self.relPath) +} + +func (self *rawFile) Dir() string { + return filepath.ToSlash(filepath.Dir(self.relPath)) +} + +func (self *rawFile) Name() string { + return filepath.Base(self.relPath) +} + +func (self *rawFile) Ext() string { + return filepath.Ext(self.relPath) +} + +func (self *rawFile) Rename(path string) error { if filepath.IsAbs(path) { return fmt.Errorf("unexpected absolute path: %s", path) } @@ -37,38 +46,15 @@ func (self *File) Rename(path string) error { return nil } -// Path returns the file path relative to the source directory. -func (self *File) Path() string { - return filepath.ToSlash(self.relPath) -} - -// Dir returns the containing directory of the file. -func (self *File) Dir() string { - return filepath.ToSlash(filepath.Dir(self.relPath)) -} - -// Name returns the base name of the file. -func (self *File) Name() string { - return filepath.Base(self.relPath) -} - -// Ext returns the extension of the file. -func (self *File) Ext() string { - return filepath.Ext(self.relPath) -} - -// Size returns the file length in bytes. -func (self *File) Size() int64 { +func (self *rawFile) Size() int64 { return self.size } -// ModTime returns the time of the file's last modification. -func (self *File) ModTime() time.Time { +func (self *rawFile) ModTime() time.Time { return self.modTime } -// Read reads file data into the provided buffer. -func (self *File) Read(data []byte) (int, error) { +func (self *rawFile) Read(data []byte) (int, error) { if err := self.load(); err != nil { return 0, err } @@ -76,8 +62,7 @@ func (self *File) Read(data []byte) (int, error) { return self.reader.Read(data) } -// Write writes file data into the provided writer. -func (self *File) WriteTo(writer io.Writer) (int64, error) { +func (self *rawFile) WriteTo(writer io.Writer) (int64, error) { if err := self.load(); err != nil { return 0, err } @@ -85,8 +70,7 @@ func (self *File) WriteTo(writer io.Writer) (int64, error) { return self.reader.WriteTo(writer) } -// Seek updates the file pointer to the desired position. -func (self *File) Seek(offset int64, whence int) (int64, error) { +func (self *rawFile) Seek(offset int64, whence int) (int64, error) { if self.reader == nil && offset == 0 && (whence == io.SeekStart || whence == io.SeekCurrent) { return 0, nil } @@ -98,29 +82,20 @@ func (self *File) Seek(offset int64, whence int) (int64, error) { return self.reader.Seek(offset, whence) } -// GoString returns value for string formatting. -func (self *File) GoString() string { +func (self *rawFile) GoString() string { return self.relPath } -// RemoveProp deletes the metadata property for the provided name. -func (self *File) RemoveProp(name string) { - delete(self.props, name) -} - -// SetProp updates the metadata property for the provided name. -func (self *File) SetProp(name string, value Prop) { +func (self *rawFile) SetProp(name string, value FileProp) { self.props[name] = value } -// Prop returns the metadata property for the provided name. -func (self *File) Prop(name string) (Prop, bool) { +func (self *rawFile) Prop(name string) (FileProp, bool) { value, ok := self.props[name] return value, ok } -// PropOrDef returns the metadata property for the provided name or the default. -func (self *File) PropOrDef(name string, valueDef Prop) Prop { +func (self *rawFile) PropOrDef(name string, valueDef FileProp) FileProp { if value, ok := self.Prop(name); ok { return value } @@ -128,19 +103,25 @@ func (self *File) PropOrDef(name string, valueDef Prop) Prop { return valueDef } -// Props returns all of the metadata properties. -func (self *File) Props() PropMap { +func (self *rawFile) Props() FileProps { return self.props } -// CopyProps copies all metadata properties from the provided file. -func (self *File) CopyProps(file *File) { - for key, value := range file.props { +func (self *rawFile) CopyProps(file File) { + for key, value := range file.Props() { self.props[key] = value } } -func (self *File) load() error { +func (self *rawFile) RemoveProp(name string) { + delete(self.props, name) +} + +func (self *rawFile) Index() int { + return self.index +} + +func (self *rawFile) load() error { if self.reader != nil { return nil } @@ -153,35 +134,3 @@ func (self *File) load() error { self.reader = bytes.NewReader(data) return nil } - -func (self *File) export(targetDir string) error { - targetPath := filepath.Join(targetDir, self.relPath) - - if targetInfo, err := os.Stat(targetPath); err == nil && !targetInfo.ModTime().Before(self.ModTime()) { - return nil - } - - if err := os.MkdirAll(filepath.Dir(targetPath), 0755); err != nil { - return err - } - - fw, err := os.Create(targetPath) - if err != nil { - return err - } - defer fw.Close() - - if err := self.load(); err != nil { - return err - } - - if _, err := self.Seek(0, io.SeekStart); err != nil { - return err - } - - if _, err := self.WriteTo(fw); err != nil { - return err - } - - return nil -} diff --git a/file_exporter.go b/file_exporter.go index bc9f468..9a5139a 100644 --- a/file_exporter.go +++ b/file_exporter.go @@ -1,6 +1,7 @@ package goldsmith import ( + "io" "os" "path/filepath" ) @@ -21,7 +22,7 @@ func (self *fileExporter) Initialize(context *Context) error { return nil } -func (self *fileExporter) Process(context *Context, file *File) error { +func (self *fileExporter) Process(context *Context, file File) error { slicePath := func(path string) string { if filepath.IsAbs(path) { var err error @@ -33,11 +34,34 @@ func (self *fileExporter) Process(context *Context, file *File) error { return filepath.Clean(path) } - for token := slicePath(file.relPath); token != "."; token = filepath.Dir(token) { + for token := slicePath(file.Path()); token != "."; token = filepath.Dir(token) { self.tokens[token] = true } - return file.export(self.targetDir) + targetPath := filepath.Join(self.targetDir, file.Path()) + if targetInfo, err := os.Stat(targetPath); err == nil && !targetInfo.ModTime().Before(file.ModTime()) { + return nil + } + + if err := os.MkdirAll(filepath.Dir(targetPath), 0755); err != nil { + return err + } + + fw, err := os.Create(targetPath) + if err != nil { + return err + } + defer fw.Close() + + if _, err := file.Seek(0, io.SeekStart); err != nil { + return err + } + + if _, err := file.WriteTo(fw); err != nil { + return err + } + + return nil } func (self *fileExporter) Finalize(context *Context) error { diff --git a/filter_util.go b/filter_util.go index d3744d1..a1a659c 100644 --- a/filter_util.go +++ b/filter_util.go @@ -7,9 +7,9 @@ type filterEntry struct { type filterStack []filterEntry -func (self *filterStack) accept(file *File) bool { +func (self *filterStack) accept(file File) bool { for _, entry := range *self { - if entry.index >= file.index && !entry.filter.Accept(file) { + if entry.index >= file.Index() && !entry.filter.Accept(file) { return false } } diff --git a/filters/condition/condition.go b/filters/condition/condition.go index eb55d6b..0cf3833 100644 --- a/filters/condition/condition.go +++ b/filters/condition/condition.go @@ -16,6 +16,6 @@ func (*Condition) Name() string { return "condition" } -func (self *Condition) Accept(file *goldsmith.File) bool { +func (self *Condition) Accept(file goldsmith.File) bool { return self.accept } diff --git a/filters/operator/operator.go b/filters/operator/operator.go index 8f6388d..3058f54 100644 --- a/filters/operator/operator.go +++ b/filters/operator/operator.go @@ -20,7 +20,7 @@ func (*operatorAnd) Name() string { return "operator" } -func (self *operatorAnd) Accept(file *goldsmith.File) bool { +func (self *operatorAnd) Accept(file goldsmith.File) bool { for _, filter := range self.filters { if !filter.Accept(file) { return false @@ -42,7 +42,7 @@ func (*operatorNot) Name() string { return "operator" } -func (self *operatorNot) Accept(file *goldsmith.File) bool { +func (self *operatorNot) Accept(file goldsmith.File) bool { return !self.filter.Accept(file) } @@ -58,7 +58,7 @@ func (*operatorOr) Name() string { return "operator" } -func (self *operatorOr) Accept(file *goldsmith.File) bool { +func (self *operatorOr) Accept(file goldsmith.File) bool { for _, filter := range self.filters { if filter.Accept(file) { return true diff --git a/filters/wildcard/wildcard.go b/filters/wildcard/wildcard.go index 3c5eb7b..066c065 100644 --- a/filters/wildcard/wildcard.go +++ b/filters/wildcard/wildcard.go @@ -25,7 +25,7 @@ func (*Wildcard) Name() string { return "wildcard" } -func (self *Wildcard) Accept(file *goldsmith.File) bool { +func (self *Wildcard) Accept(file goldsmith.File) bool { filePath := self.adjustCase(file.Path()) for _, wildcard := range self.wildcards { diff --git a/goldsmith.go b/goldsmith.go index 63c7608..9748423 100644 --- a/goldsmith.go +++ b/goldsmith.go @@ -45,7 +45,7 @@ func (self *Goldsmith) Chain(plugin Plugin) *Goldsmith { plugin: plugin, filtersExt: append(filterStack(nil), self.filters...), index: self.index, - filesOut: make(chan *File), + filesOut: make(chan File), } if len(self.contexts) > 0 { @@ -87,7 +87,7 @@ func (self *Goldsmith) End(targetDir string) []error { return self.errors } -func (self *Goldsmith) fault(name string, file *File, err error) { +func (self *Goldsmith) fault(name string, file File, err error) { self.mutex.Lock() defer self.mutex.Unlock() diff --git a/interface.go b/interface.go index c0671f0..d1d2f0d 100644 --- a/interface.go +++ b/interface.go @@ -1,5 +1,10 @@ package goldsmith +import ( + "io" + "time" +) + // Plugin contains the minimum set of methods required on plugins. Plugins can // also optionally implement Initializer, Processor, and Finalizer interfaces. type Plugin interface { @@ -14,7 +19,7 @@ type Initializer interface { // Processor allows for optional processing of files passing through a plugin. type Processor interface { - Process(context *Context, file *File) error + Process(context *Context, file File) error } // Finalizer allows for optional finalization of a plugin after all files @@ -26,5 +31,36 @@ type Finalizer interface { // Filter is used to determine which files should continue in the chain. type Filter interface { Name() string - Accept(file *File) bool + Accept(file File) bool +} + +type ( + FileProp any + FileProps map[string]FileProp +) + +// File represents in-memory or on-disk files in a chain. +type File interface { + Path() string + Dir() string + Name() string + Ext() string + Rename(path string) error + + Size() int64 + ModTime() time.Time + + Read(data []byte) (int, error) + WriteTo(writer io.Writer) (int64, error) + Seek(offset int64, whence int) (int64, error) + + SetProp(name string, value FileProp) + Prop(name string) (FileProp, bool) + PropOrDef(name string, valueDef FileProp) FileProp + Props() FileProps + CopyProps(file File) + RemoveProp(name string) + + GoString() string + Index() int } diff --git a/plugins/absolute/absolute.go b/plugins/absolute/absolute.go index 9e44697..e6c1d74 100644 --- a/plugins/absolute/absolute.go +++ b/plugins/absolute/absolute.go @@ -50,7 +50,7 @@ func (*Absolute) Initialize(context *goldsmith.Context) error { return nil } -func (self *Absolute) Process(context *goldsmith.Context, inputFile *goldsmith.File) error { +func (self *Absolute) Process(context *goldsmith.Context, inputFile goldsmith.File) error { if outputFile := context.RetrieveCachedFile(inputFile.Path(), inputFile); outputFile != nil { outputFile.CopyProps(inputFile) context.DispatchFile(outputFile) diff --git a/plugins/breadcrumbs/breadcrumbs.go b/plugins/breadcrumbs/breadcrumbs.go index 011acfa..5218f62 100644 --- a/plugins/breadcrumbs/breadcrumbs.go +++ b/plugins/breadcrumbs/breadcrumbs.go @@ -19,7 +19,7 @@ type Crumb struct { // Node represents information about a specific file in the site's structure. type Node struct { - File *goldsmith.File + File goldsmith.File Parent *Node Children []*Node @@ -75,7 +75,7 @@ func (*Breadcrumbs) Initialize(context *goldsmith.Context) error { return nil } -func (self *Breadcrumbs) Process(context *goldsmith.Context, inputFile *goldsmith.File) error { +func (self *Breadcrumbs) Process(context *goldsmith.Context, inputFile goldsmith.File) error { var parentNameStr string if parentName, ok := inputFile.Prop(self.parentKey); ok { parentNameStr, _ = parentName.(string) diff --git a/plugins/collection/collection.go b/plugins/collection/collection.go index b1252ee..731215f 100644 --- a/plugins/collection/collection.go +++ b/plugins/collection/collection.go @@ -15,7 +15,7 @@ import ( ) // A Comparer callback function is used to sort files within a collection group. -type Comparer func(i, j *goldsmith.File) (less bool) +type Comparer func(i, j goldsmith.File) (less bool) // Collection chainable plugin context. type Collection struct { @@ -23,8 +23,8 @@ type Collection struct { groupsKey string comparer Comparer - groups map[string][]*goldsmith.File - files []*goldsmith.File + groups map[string][]goldsmith.File + files []goldsmith.File mutex sync.Mutex } @@ -33,7 +33,7 @@ func New() *Collection { return &Collection{ collectionKey: "Collection", groupsKey: "Groups", - groups: make(map[string][]*goldsmith.File), + groups: make(map[string][]goldsmith.File), } } @@ -66,7 +66,7 @@ func (*Collection) Initialize(context *goldsmith.Context) error { return nil } -func (self *Collection) Process(context *goldsmith.Context, inputFile *goldsmith.File) error { +func (self *Collection) Process(context *goldsmith.Context, inputFile goldsmith.File) error { self.mutex.Lock() defer func() { inputFile.SetProp(self.groupsKey, self.groups) @@ -110,7 +110,7 @@ func (self *Collection) Finalize(context *goldsmith.Context) error { } type fileSorter struct { - files []*goldsmith.File + files []goldsmith.File comparer Comparer } diff --git a/plugins/document/document.go b/plugins/document/document.go index fef2b7c..5a1b458 100644 --- a/plugins/document/document.go +++ b/plugins/document/document.go @@ -14,12 +14,12 @@ import ( ) // Processor callback function to modify documents. -type Processor func(*goldsmith.File, *goquery.Document) error +type Processor func(goldsmith.File, *goquery.Document) error // Document plugin context. type Document struct { callback Processor - files []*goldsmith.File + files []goldsmith.File mutex sync.Mutex } @@ -37,7 +37,7 @@ func (*Document) Initialize(context *goldsmith.Context) error { return nil } -func (self *Document) Process(context *goldsmith.Context, inputFile *goldsmith.File) error { +func (self *Document) Process(context *goldsmith.Context, inputFile goldsmith.File) error { doc, err := goquery.NewDocumentFromReader(inputFile) if err != nil { return err diff --git a/plugins/document/document_test.go b/plugins/document/document_test.go index e8c2094..200f764 100644 --- a/plugins/document/document_test.go +++ b/plugins/document/document_test.go @@ -8,7 +8,7 @@ import ( "github.com/PuerkitoBio/goquery" ) -func process(file *goldsmith.File, doc *goquery.Document) error { +func process(file goldsmith.File, doc *goquery.Document) error { doc.Find("h1").SetAttr("style", "color: red;") return nil } diff --git a/plugins/frontmatter/frontmatter.go b/plugins/frontmatter/frontmatter.go index 8d91b96..31769a6 100644 --- a/plugins/frontmatter/frontmatter.go +++ b/plugins/frontmatter/frontmatter.go @@ -71,7 +71,7 @@ func (*FrontMatter) Initialize(context *goldsmith.Context) error { return nil } -func (*FrontMatter) Process(context *goldsmith.Context, inputFile *goldsmith.File) error { +func (*FrontMatter) Process(context *goldsmith.Context, inputFile goldsmith.File) error { meta, body, err := parse(inputFile) if err != nil { return err diff --git a/plugins/index/index.go b/plugins/index/index.go index 168a617..8c453b3 100644 --- a/plugins/index/index.go +++ b/plugins/index/index.go @@ -18,7 +18,7 @@ type Entry struct { Name string Path string IsDir bool - File *goldsmith.File + File goldsmith.File } // Index chainable plugin context. @@ -60,7 +60,7 @@ func (*Index) Name() string { return "index" } -func (self *Index) Process(context *goldsmith.Context, inputFile *goldsmith.File) error { +func (self *Index) Process(context *goldsmith.Context, inputFile goldsmith.File) error { self.mutex.Lock() defer self.mutex.Unlock() @@ -131,7 +131,7 @@ func (self *Index) Finalize(context *goldsmith.Context) error { type directory struct { entries entriesByName - indexFile *goldsmith.File + indexFile goldsmith.File } type entriesByName []Entry diff --git a/plugins/layout/layout.go b/plugins/layout/layout.go index 79da796..0125080 100644 --- a/plugins/layout/layout.go +++ b/plugins/layout/layout.go @@ -20,8 +20,8 @@ type Layout struct { defaultLayout *string helpers template.FuncMap - inputFiles []*goldsmith.File - templateFiles []*goldsmith.File + inputFiles []goldsmith.File + templateFiles []goldsmith.File mutex sync.Mutex template *template.Template @@ -70,7 +70,7 @@ func (self *Layout) Initialize(context *goldsmith.Context) error { return nil } -func (self *Layout) Process(context *goldsmith.Context, inputFile *goldsmith.File) error { +func (self *Layout) Process(context *goldsmith.Context, inputFile goldsmith.File) error { self.mutex.Lock() defer self.mutex.Unlock() @@ -128,7 +128,7 @@ func (self *Layout) Finalize(context *goldsmith.Context) error { return nil } -func (self *Layout) getFileLayout(file *goldsmith.File) (string, bool) { +func (self *Layout) getFileLayout(file goldsmith.File) (string, bool) { if name, ok := file.Props()[self.layoutKey].(string); ok { return name, true } diff --git a/plugins/livejs/livejs.go b/plugins/livejs/livejs.go index 2a2b8d2..782a481 100644 --- a/plugins/livejs/livejs.go +++ b/plugins/livejs/livejs.go @@ -37,7 +37,7 @@ func (self *LiveJs) Initialize(context *goldsmith.Context) error { return nil } -func (self *LiveJs) Process(context *goldsmith.Context, inputFile *goldsmith.File) error { +func (self *LiveJs) Process(context *goldsmith.Context, inputFile goldsmith.File) error { if outputFile := context.RetrieveCachedFile(inputFile.Path(), inputFile); outputFile != nil { outputFile.CopyProps(inputFile) context.DispatchFile(outputFile) diff --git a/plugins/markdown/markdown.go b/plugins/markdown/markdown.go index f7c6d17..80dc529 100644 --- a/plugins/markdown/markdown.go +++ b/plugins/markdown/markdown.go @@ -47,7 +47,7 @@ func (self *Markdown) Initialize(context *goldsmith.Context) error { return nil } -func (self *Markdown) Process(context *goldsmith.Context, inputFile *goldsmith.File) error { +func (self *Markdown) Process(context *goldsmith.Context, inputFile goldsmith.File) error { outputPath := strings.TrimSuffix(inputFile.Path(), path.Ext(inputFile.Path())) + ".html" if outputFile := context.RetrieveCachedFile(outputPath, inputFile); outputFile != nil { outputFile.CopyProps(inputFile) diff --git a/plugins/minify/minify.go b/plugins/minify/minify.go index d5c744d..97e0d8c 100644 --- a/plugins/minify/minify.go +++ b/plugins/minify/minify.go @@ -37,7 +37,7 @@ func (*Minify) Initialize(context *goldsmith.Context) error { return nil } -func (*Minify) Process(context *goldsmith.Context, inputFile *goldsmith.File) error { +func (*Minify) Process(context *goldsmith.Context, inputFile goldsmith.File) error { if outputFile := context.RetrieveCachedFile(inputFile.Path(), inputFile); outputFile != nil { outputFile.CopyProps(inputFile) context.DispatchFile(outputFile) diff --git a/plugins/pager/pager.go b/plugins/pager/pager.go index 365a3d5..b7f22fb 100644 --- a/plugins/pager/pager.go +++ b/plugins/pager/pager.go @@ -22,13 +22,13 @@ import ( type Namer func(path string, index int) string // Lister callback function is used to return a metadata slice which should be paged across several files. -type Lister func(file *goldsmith.File) interface{} +type Lister func(file goldsmith.File) interface{} // Page represents information about a given metadata segment. type Page struct { Index int Items interface{} - File *goldsmith.File + File goldsmith.File Next *Page Prev *Page @@ -51,7 +51,7 @@ type Pager struct { inheritedKeys []string itemsPerPage int - files []*goldsmith.File + files []goldsmith.File mutex sync.Mutex } @@ -114,7 +114,7 @@ func (*Pager) Initialize(context *goldsmith.Context) error { return nil } -func (self *Pager) Process(context *goldsmith.Context, inputFile *goldsmith.File) error { +func (self *Pager) Process(context *goldsmith.Context, inputFile goldsmith.File) error { self.mutex.Lock() defer self.mutex.Unlock() @@ -208,7 +208,7 @@ func (self *Pager) Finalize(ctx *goldsmith.Context) error { return nil } -func (self *Pager) isEnabledForFile(file *goldsmith.File) (bool, error) { +func (self *Pager) isEnabledForFile(file goldsmith.File) (bool, error) { enableRaw, ok := file.Prop(self.enableKey) if !ok { return false, nil diff --git a/plugins/pager/pager_test.go b/plugins/pager/pager_test.go index 286f57c..28441ff 100644 --- a/plugins/pager/pager_test.go +++ b/plugins/pager/pager_test.go @@ -11,9 +11,9 @@ import ( ) func Test(self *testing.T) { - lister := func(file *goldsmith.File) interface{} { + lister := func(file goldsmith.File) interface{} { if groupsRaw, ok := file.Prop("Groups"); ok { - if groups, ok := groupsRaw.(map[string][]*goldsmith.File); ok { + if groups, ok := groupsRaw.(map[string][]goldsmith.File); ok { if group, ok := groups["group"]; ok { return group } diff --git a/plugins/rule/rule.go b/plugins/rule/rule.go index b42aa8b..ef8cf3c 100644 --- a/plugins/rule/rule.go +++ b/plugins/rule/rule.go @@ -1,7 +1,7 @@ package rule import ( - "io/ioutil" + "io" "path/filepath" "sync" @@ -19,14 +19,14 @@ type rule struct { type ruleApply struct { rule - Props map[string]goldsmith.Prop + Props map[string]goldsmith.FileProp } type ruleDrop struct { rule } -func (self *rule) accept(inputFile *goldsmith.File) bool { +func (self *rule) accept(inputFile goldsmith.File) bool { if !wildcard.New(filepath.Join(self.baseDir, "**")).Accept(inputFile) { return false } @@ -52,7 +52,7 @@ func (self *rule) accept(inputFile *goldsmith.File) bool { return operator.Not(wildcard.New(rejectPaths...)).Accept(inputFile) } -func (self *ruleApply) apply(inputFile *goldsmith.File) { +func (self *ruleApply) apply(inputFile goldsmith.File) { if self.accept(inputFile) { for name, value := range self.Props { inputFile.SetProp(name, value) @@ -60,7 +60,7 @@ func (self *ruleApply) apply(inputFile *goldsmith.File) { } } -func (self *ruleDrop) drop(inputFile *goldsmith.File) bool { +func (self *ruleDrop) drop(inputFile goldsmith.File) bool { return self.accept(inputFile) } @@ -69,8 +69,8 @@ type ruleSet struct { Drop []*ruleDrop } -func newRuleSet(inputFile *goldsmith.File) (*ruleSet, error) { - data, err := ioutil.ReadAll(inputFile) +func newRuleSet(inputFile goldsmith.File) (*ruleSet, error) { + data, err := io.ReadAll(inputFile) if err != nil { return nil, err } @@ -91,7 +91,7 @@ func newRuleSet(inputFile *goldsmith.File) (*ruleSet, error) { return &ruleSet, nil } -func (self *ruleSet) process(inputFile *goldsmith.File) bool { +func (self *ruleSet) process(inputFile goldsmith.File) bool { for _, rule := range self.Apply { rule.apply(inputFile) } @@ -110,7 +110,7 @@ type Rule struct { filename string ruleSets []*ruleSet - inputFiles []*goldsmith.File + inputFiles []goldsmith.File mutex sync.Mutex } @@ -128,7 +128,7 @@ func (*Rule) Name() string { return "rule" } -func (self *Rule) Process(context *goldsmith.Context, inputFile *goldsmith.File) error { +func (self *Rule) Process(context *goldsmith.Context, inputFile goldsmith.File) error { if inputFile.Name() == self.filename { ruleSet, err := newRuleSet(inputFile) if err != nil { diff --git a/plugins/summary/summary.go b/plugins/summary/summary.go index eb330b5..7fe74ca 100644 --- a/plugins/summary/summary.go +++ b/plugins/summary/summary.go @@ -62,7 +62,7 @@ func (*Summary) Initialize(context *goldsmith.Context) error { return nil } -func (self *Summary) Process(context *goldsmith.Context, inputFile *goldsmith.File) error { +func (self *Summary) Process(context *goldsmith.Context, inputFile goldsmith.File) error { doc, err := goquery.NewDocumentFromReader(inputFile) if err != nil { return err diff --git a/plugins/syndicate/syndicate.go b/plugins/syndicate/syndicate.go index e4a979e..83f3720 100644 --- a/plugins/syndicate/syndicate.go +++ b/plugins/syndicate/syndicate.go @@ -120,7 +120,7 @@ func (self *Syndicate) WithFeed(name string, config FeedConfig) *Syndicate { return self } -func (self *Syndicate) Process(context *goldsmith.Context, inputFile *goldsmith.File) error { +func (self *Syndicate) Process(context *goldsmith.Context, inputFile goldsmith.File) error { defer context.DispatchFile(inputFile) getString := func(key string) string { diff --git a/plugins/syntax/syntax.go b/plugins/syntax/syntax.go index dd63665..32d35e3 100644 --- a/plugins/syntax/syntax.go +++ b/plugins/syntax/syntax.go @@ -74,7 +74,7 @@ func (*Syntax) Initialize(context *goldsmith.Context) error { return nil } -func (self *Syntax) Process(context *goldsmith.Context, inputFile *goldsmith.File) error { +func (self *Syntax) Process(context *goldsmith.Context, inputFile goldsmith.File) error { if outputFile := context.RetrieveCachedFile(inputFile.Path(), inputFile); outputFile != nil { outputFile.CopyProps(inputFile) context.DispatchFile(outputFile) diff --git a/plugins/tags/tags.go b/plugins/tags/tags.go index 49ee41d..a7e1826 100644 --- a/plugins/tags/tags.go +++ b/plugins/tags/tags.go @@ -18,7 +18,7 @@ import ( // TagInfo contains site-wide information about a particular tag. type TagInfo struct { TaggedFiles filesByPath - IndexFile *goldsmith.File + IndexFile goldsmith.File SafeName string RawName string } @@ -44,7 +44,7 @@ type Tags struct { infoByName tagInfoByName infoByCount tagInfoByCount - files []*goldsmith.File + files []goldsmith.File mutex sync.Mutex } @@ -98,7 +98,7 @@ func (*Tags) Initialize(context *goldsmith.Context) error { return nil } -func (self *Tags) Process(context *goldsmith.Context, inputFile *goldsmith.File) error { +func (self *Tags) Process(context *goldsmith.Context, inputFile goldsmith.File) error { tagState := &TagState{ TagsByName: &self.infoByName, TagsByCount: &self.infoByCount, @@ -185,8 +185,8 @@ func (self *Tags) Finalize(context *goldsmith.Context) error { return nil } -func (self *Tags) buildPages(context *goldsmith.Context) ([]*goldsmith.File, error) { - var files []*goldsmith.File +func (self *Tags) buildPages(context *goldsmith.Context) ([]goldsmith.File, error) { + var files []goldsmith.File for tag, info := range self.info { var err error info.IndexFile, err = context.CreateFileFromReader(self.tagPagePath(tag), bytes.NewReader(nil)) @@ -273,7 +273,7 @@ func (self tagInfoByName) Less(i, j int) bool { return false } -type filesByPath []*goldsmith.File +type filesByPath []goldsmith.File func (self filesByPath) Len() int { return len(self) diff --git a/plugins/thumbnail/thumbnail.go b/plugins/thumbnail/thumbnail.go index 9f0eb17..d749721 100644 --- a/plugins/thumbnail/thumbnail.go +++ b/plugins/thumbnail/thumbnail.go @@ -81,7 +81,7 @@ func (*Thumbnail) Initialize(context *goldsmith.Context) error { return nil } -func (self *Thumbnail) Process(context *goldsmith.Context, inputFile *goldsmith.File) error { +func (self *Thumbnail) Process(context *goldsmith.Context, inputFile goldsmith.File) error { defer context.DispatchFile(inputFile) thumbPath := self.namer(inputFile.Path(), self.size) @@ -104,7 +104,7 @@ func (self *Thumbnail) Process(context *goldsmith.Context, inputFile *goldsmith. return nil } -func (self *Thumbnail) thumbnail(context *goldsmith.Context, inputFile *goldsmith.File, thumbPath string) (*goldsmith.File, error) { +func (self *Thumbnail) thumbnail(context *goldsmith.Context, inputFile goldsmith.File, thumbPath string) (goldsmith.File, error) { var thumbFormat imaging.Format switch strings.ToLower(filepath.Ext(thumbPath)) { case ".jpg", ".jpeg":