Revert "Change File to interface"

This reverts commit 2f95fdba2d.
This commit is contained in:
Alex Yatskov 2024-03-03 18:09:21 -08:00
parent 9ba1c7cfeb
commit e24e892773
29 changed files with 228 additions and 115 deletions

View File

@ -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 []Fil
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))

View File

@ -24,33 +24,31 @@ 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
}
cf := &contextFile{
rawFile{
relPath: sourcePath,
props: make(map[string]FileProp),
modTime: time.Now(),
size: int64(len(data)),
reader: bytes.NewReader(data),
},
self.index,
file := &File{
relPath: sourcePath,
props: make(FileProps),
modTime: time.Now(),
size: int64(len(data)),
reader: bytes.NewReader(data),
index: self.index,
}
return cf, nil
return file, nil
}
// 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")
}
@ -67,29 +65,27 @@ func (self *Context) CreateFileFromAsset(sourcePath, dataPath string) (File, err
return nil, errors.New("assets must be files")
}
cf := &contextFile{
rawFile{
relPath: sourcePath,
props: make(map[string]FileProp),
modTime: info.ModTime(),
size: info.Size(),
dataPath: dataPath,
},
self.index,
file := &File{
relPath: sourcePath,
props: make(FileProps),
modTime: info.ModTime(),
size: info.Size(),
dataPath: dataPath,
index: self.index,
}
return cf, nil
return file, nil
}
// 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.state.cache != nil {
self.goldsmith.state.cache.storeFile(self, outputFile, inputFiles)
}
@ -100,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.state.cache != nil {
outputFile, _ = self.goldsmith.state.cache.retrieveFile(self, outputPath, inputFiles)
}

View File

@ -14,7 +14,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 +26,5 @@ 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
}

159
file.go
View File

@ -1,7 +1,11 @@
package goldsmith
import (
"bytes"
"fmt"
"io"
"os"
"path/filepath"
"time"
)
@ -11,26 +15,141 @@ type (
)
// 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
type File struct {
relPath string
props FileProps
modTime time.Time
size int64
Size() int64
ModTime() time.Time
dataPath string
reader *bytes.Reader
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
}
// Rename modifies the file path relative to the source directory.
func (self *File) Rename(path string) error {
if filepath.IsAbs(path) {
return fmt.Errorf("unexpected absolute path: %s", path)
}
self.relPath = path
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 {
return self.size
}
// ModTime returns the time of the file's last modification.
func (self *File) ModTime() time.Time {
return self.modTime
}
// Read reads file data into the provided buffer.
func (self *File) Read(data []byte) (int, error) {
if err := self.load(); err != nil {
return 0, err
}
return self.reader.Read(data)
}
// Write writes file data into the provided writer.
func (self *File) WriteTo(writer io.Writer) (int64, error) {
if err := self.load(); err != nil {
return 0, err
}
return self.reader.WriteTo(writer)
}
// Seek updates the file pointer to the desired position.
func (self *File) Seek(offset int64, whence int) (int64, error) {
if self.reader == nil && offset == 0 && (whence == io.SeekStart || whence == io.SeekCurrent) {
return 0, nil
}
if err := self.load(); err != nil {
return 0, err
}
return self.reader.Seek(offset, whence)
}
// GoString returns value for string formatting.
func (self *File) 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 FileProp) {
self.props[name] = value
}
// Prop returns the metadata property for the provided name.
func (self *File) 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 FileProp) FileProp {
if value, ok := self.Prop(name); ok {
return value
}
return valueDef
}
// Props returns all of the metadata properties.
func (self *File) 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 {
self.props[key] = value
}
}
func (self *File) load() error {
if self.reader != nil {
return nil
}
data, err := os.ReadFile(self.dataPath)
if err != nil {
return err
}
self.reader = bytes.NewReader(data)
return nil
}

View File

@ -22,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

View File

@ -7,11 +7,9 @@ type filterEntry struct {
type filterStack []filterEntry
func (self *filterStack) accept(file File) bool {
cf := file.(*contextFile)
func (self *filterStack) accept(file *File) bool {
for _, entry := range *self {
if entry.index >= cf.index && !entry.filter.Accept(file) {
if entry.index >= file.index && !entry.filter.Accept(file) {
return false
}
}

View File

@ -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
}

View File

@ -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

View File

@ -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 {

View File

@ -49,7 +49,7 @@ func (self *Goldsmith) Chain(plugin Plugin) *Goldsmith {
plugin: plugin,
filtersExt: append(filterStack(nil), self.state.filters...),
index: self.state.index,
filesOut: make(chan File),
filesOut: make(chan *File),
}
if len(self.state.contexts) > 0 {
@ -94,7 +94,7 @@ func (self *Goldsmith) End(targetDir string) []error {
return errors
}
func (self *Goldsmith) fault(name string, file File, err error) {
func (self *Goldsmith) fault(name string, file *File, err error) {
self.state.mutex.Lock()
defer self.state.mutex.Unlock()

View File

@ -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)

View File

@ -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)

View File

@ -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
}

View File

@ -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

View File

@ -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
}

View File

@ -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

View File

@ -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

View File

@ -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
}

View File

@ -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)

View File

@ -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)

View File

@ -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)

View File

@ -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

View File

@ -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
}

View File

@ -19,14 +19,14 @@ type rule struct {
type ruleApply struct {
rule
Props map[string]goldsmith.FileProp
Props goldsmith.FileProps
}
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,7 +69,7 @@ type ruleSet struct {
Drop []*ruleDrop
}
func newRuleSet(inputFile goldsmith.File) (*ruleSet, error) {
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 {

View File

@ -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

View File

@ -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 {

View File

@ -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)

View File

@ -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)

View File

@ -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.F
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":