Make Context be an interface

This commit is contained in:
Alex Yatskov 2024-03-03 11:14:50 -08:00
parent 01fac8cb96
commit ab0c1c53d2
24 changed files with 92 additions and 65 deletions

View File

@ -15,7 +15,7 @@ type cache struct {
baseDir string baseDir string
} }
func (self *cache) retrieveFile(context *Context, outputPath string, inputFiles []File) (File, error) { func (self *cache) retrieveFile(context *contextImpl, outputPath string, inputFiles []File) (File, error) {
cachePath, err := self.buildCachePath(context, outputPath, inputFiles) cachePath, err := self.buildCachePath(context, outputPath, inputFiles)
if err != nil { if err != nil {
return nil, err return nil, err
@ -33,7 +33,7 @@ func (self *cache) retrieveFile(context *Context, outputPath string, inputFiles
return outputFile, nil return outputFile, nil
} }
func (self *cache) storeFile(context *Context, outputFile File, inputFiles []File) error { func (self *cache) storeFile(context *contextImpl, outputFile File, inputFiles []File) error {
cachePath, err := self.buildCachePath(context, outputFile.Path(), inputFiles) cachePath, err := self.buildCachePath(context, outputFile.Path(), inputFiles)
if err != nil { if err != nil {
return err return err
@ -69,7 +69,7 @@ func (self *cache) storeFile(context *Context, outputFile File, inputFiles []Fil
return nil return nil
} }
func (self *cache) buildCachePath(context *Context, outputPath string, inputFiles []File) (string, error) { func (self *cache) buildCachePath(context *contextImpl, outputPath string, inputFiles []File) (string, error) {
hasher := crc32.NewIEEE() hasher := crc32.NewIEEE()
hasher.Write([]byte(outputPath)) hasher.Write([]byte(outputPath))

View File

@ -13,7 +13,34 @@ import (
// Context corresponds to the current link in the chain and provides methods // Context corresponds to the current link in the chain and provides methods
// that enable plugins to inject new files into the chain. // that enable plugins to inject new files into the chain.
type Context struct { type Context interface {
// CreateFileFrom data creates a new file instance from the provided data buffer.
CreateFileFromReader(sourcePath string, reader io.Reader) (File, error)
// CreateFileFromAsset creates a new file instance from the provided file path.
CreateFileFromAsset(sourcePath, dataPath string) (File, error)
// DispatchFile causes the file to get passed to the next link in the chain.
DispatchFile(file 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.
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.
RetrieveCachedFile(outputPath string, inputFiles ...File) File
// Specify internal filter(s) that exclude files from being processed.
Filter(filters ...Filter) Context
// Specify the maximum number of threads used for processing.
Threads(threads int) Context
}
type contextImpl struct {
goldsmith *Goldsmith goldsmith *Goldsmith
plugin Plugin plugin Plugin
@ -29,7 +56,7 @@ type Context struct {
} }
// CreateFileFrom data creates a new file instance from the provided data buffer. // 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 *contextImpl) CreateFileFromReader(sourcePath string, reader io.Reader) (File, error) {
data, err := io.ReadAll(reader) data, err := io.ReadAll(reader)
if err != nil { if err != nil {
return nil, err return nil, err
@ -50,7 +77,7 @@ func (self *Context) CreateFileFromReader(sourcePath string, reader io.Reader) (
} }
// CreateFileFromAsset creates a new file instance from the provided file path. // CreateFileFromAsset creates a new file instance from the provided file path.
func (self *Context) CreateFileFromAsset(sourcePath, dataPath string) (File, error) { func (self *contextImpl) CreateFileFromAsset(sourcePath, dataPath string) (File, error) {
if filepath.IsAbs(sourcePath) { if filepath.IsAbs(sourcePath) {
return nil, errors.New("source paths must be relative") return nil, errors.New("source paths must be relative")
} }
@ -82,14 +109,14 @@ func (self *Context) CreateFileFromAsset(sourcePath, dataPath string) (File, err
} }
// DispatchFile causes the file to get passed to the next link in the chain. // DispatchFile causes the file to get passed to the next link in the chain.
func (self *Context) DispatchFile(file File) { func (self *contextImpl) DispatchFile(file File) {
self.filesOut <- file self.filesOut <- file
} }
// DispatchAndCacheFile caches the file data (excluding the metadata), taking // DispatchAndCacheFile caches the file data (excluding the metadata), taking
// dependencies on any input files that are needed to generate it, and then // dependencies on any input files that are needed to generate it, and then
// passes it to the next link in the chain. // passes it to the next link in the chain.
func (self *Context) DispatchAndCacheFile(outputFile File, inputFiles ...File) { func (self *contextImpl) DispatchAndCacheFile(outputFile File, inputFiles ...File) {
if self.goldsmith.cache != nil { if self.goldsmith.cache != nil {
self.goldsmith.cache.storeFile(self, outputFile, inputFiles) self.goldsmith.cache.storeFile(self, outputFile, inputFiles)
} }
@ -100,7 +127,7 @@ func (self *Context) DispatchAndCacheFile(outputFile File, inputFiles ...File) {
// RetrieveCachedFile looks up file data (excluding the metadata), given an // RetrieveCachedFile looks up file data (excluding the metadata), given an
// output path and any input files that are needed to generate it. The function // 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. // will return nil if the desired file is not found in the cache.
func (self *Context) RetrieveCachedFile(outputPath string, inputFiles ...File) File { func (self *contextImpl) RetrieveCachedFile(outputPath string, inputFiles ...File) File {
var outputFile File var outputFile File
if self.goldsmith.cache != nil { if self.goldsmith.cache != nil {
outputFile, _ = self.goldsmith.cache.retrieveFile(self, outputPath, inputFiles) outputFile, _ = self.goldsmith.cache.retrieveFile(self, outputPath, inputFiles)
@ -110,7 +137,7 @@ func (self *Context) RetrieveCachedFile(outputPath string, inputFiles ...File) F
} }
// Specify internal filter(s) that exclude files from being processed. // Specify internal filter(s) that exclude files from being processed.
func (self *Context) Filter(filters ...Filter) *Context { func (self *contextImpl) Filter(filters ...Filter) Context {
for _, filter := range filters { for _, filter := range filters {
self.filtersInt.push(filter, self.index) self.filtersInt.push(filter, self.index)
} }
@ -119,12 +146,12 @@ func (self *Context) Filter(filters ...Filter) *Context {
} }
// Specify the maximum number of threads used for processing. // Specify the maximum number of threads used for processing.
func (self *Context) Threads(threads int) *Context { func (self *contextImpl) Threads(threads int) Context {
self.threads = threads self.threads = threads
return self return self
} }
func (self *Context) step() { func (self *contextImpl) step() {
defer close(self.filesOut) defer close(self.filesOut)
if initializer, ok := self.plugin.(Initializer); ok { if initializer, ok := self.plugin.(Initializer); ok {

View File

@ -9,18 +9,18 @@ type Plugin interface {
// Initializer is used to optionally initialize a plugin and to specify a // Initializer is used to optionally initialize a plugin and to specify a
// filter to be used for determining which files will be processed. // filter to be used for determining which files will be processed.
type Initializer interface { type Initializer interface {
Initialize(context *Context) error Initialize(context Context) error
} }
// Processor allows for optional processing of files passing through a plugin. // Processor allows for optional processing of files passing through a plugin.
type Processor interface { 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 // Finalizer allows for optional finalization of a plugin after all files
// queued in the chain have passed through it. // queued in the chain have passed through it.
type Finalizer interface { type Finalizer interface {
Finalize(context *Context) error Finalize(context Context) error
} }
// Filter is used to determine which files should continue in the chain. // Filter is used to determine which files should continue in the chain.

View File

@ -16,13 +16,13 @@ func (*fileExporter) Name() string {
return "exporter" return "exporter"
} }
func (self *fileExporter) Initialize(context *Context) error { func (self *fileExporter) Initialize(context Context) error {
self.tokens = make(map[string]bool) self.tokens = make(map[string]bool)
context.Threads(1) context.Threads(1)
return nil 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 { slicePath := func(path string) string {
if filepath.IsAbs(path) { if filepath.IsAbs(path) {
var err error var err error
@ -64,7 +64,7 @@ func (self *fileExporter) Process(context *Context, file File) error {
return nil return nil
} }
func (self *fileExporter) Finalize(context *Context) error { func (self *fileExporter) Finalize(context Context) error {
if !self.clean { if !self.clean {
return nil return nil
} }

View File

@ -13,7 +13,7 @@ func (*fileImporter) Name() string {
return "importer" return "importer"
} }
func (self *fileImporter) Initialize(context *Context) error { func (self *fileImporter) Initialize(context Context) error {
return filepath.Walk(self.sourceDir, func(path string, info os.FileInfo, err error) error { return filepath.Walk(self.sourceDir, func(path string, info os.FileInfo, err error) error {
if info.IsDir() { if info.IsDir() {
return nil return nil

View File

@ -8,7 +8,7 @@ import (
// Goldsmith chainable context. // Goldsmith chainable context.
type Goldsmith struct { type Goldsmith struct {
contexts []*Context contexts []*contextImpl
cache *cache cache *cache
filters filterStack filters filterStack
@ -40,7 +40,7 @@ func (self *Goldsmith) Clean(clean bool) *Goldsmith {
// Chain links a plugin instance into the chain. // Chain links a plugin instance into the chain.
func (self *Goldsmith) Chain(plugin Plugin) *Goldsmith { func (self *Goldsmith) Chain(plugin Plugin) *Goldsmith {
context := &Context{ context := &contextImpl{
goldsmith: self, goldsmith: self,
plugin: plugin, plugin: plugin,
filtersExt: append(filterStack(nil), self.filters...), filtersExt: append(filterStack(nil), self.filters...),

View File

@ -45,12 +45,12 @@ func (*Absolute) Name() string {
return "absolute" return "absolute"
} }
func (*Absolute) Initialize(context *goldsmith.Context) error { func (*Absolute) Initialize(context goldsmith.Context) error {
context.Filter(wildcard.New("**/*.html", "**/*.htm")) context.Filter(wildcard.New("**/*.html", "**/*.htm"))
return nil 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 { if outputFile := context.RetrieveCachedFile(inputFile.Path(), inputFile); outputFile != nil {
outputFile.CopyProps(inputFile) outputFile.CopyProps(inputFile)
context.DispatchFile(outputFile) context.DispatchFile(outputFile)

View File

@ -70,12 +70,12 @@ func (*Breadcrumbs) Name() string {
return "breadcrumbs" return "breadcrumbs"
} }
func (*Breadcrumbs) Initialize(context *goldsmith.Context) error { func (*Breadcrumbs) Initialize(context goldsmith.Context) error {
context.Filter(wildcard.New("**/*.html", "**/*.htm")) context.Filter(wildcard.New("**/*.html", "**/*.htm"))
return nil 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 var parentNameStr string
if parentName, ok := inputFile.Prop(self.parentKey); ok { if parentName, ok := inputFile.Prop(self.parentKey); ok {
parentNameStr, _ = parentName.(string) parentNameStr, _ = parentName.(string)
@ -103,7 +103,7 @@ func (self *Breadcrumbs) Process(context *goldsmith.Context, inputFile goldsmith
return nil return nil
} }
func (self *Breadcrumbs) Finalize(context *goldsmith.Context) error { func (self *Breadcrumbs) Finalize(context goldsmith.Context) error {
for _, node := range self.allNodes { for _, node := range self.allNodes {
if len(node.parentName) == 0 { if len(node.parentName) == 0 {
continue continue

View File

@ -61,12 +61,12 @@ func (*Collection) Name() string {
return "collection" return "collection"
} }
func (*Collection) Initialize(context *goldsmith.Context) error { func (*Collection) Initialize(context goldsmith.Context) error {
context.Filter(wildcard.New("**/*.html", "**/*.htm")) context.Filter(wildcard.New("**/*.html", "**/*.htm"))
return nil 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() self.mutex.Lock()
defer func() { defer func() {
inputFile.SetProp(self.groupsKey, self.groups) inputFile.SetProp(self.groupsKey, self.groups)
@ -96,7 +96,7 @@ func (self *Collection) Process(context *goldsmith.Context, inputFile goldsmith.
return nil return nil
} }
func (self *Collection) Finalize(context *goldsmith.Context) error { func (self *Collection) Finalize(context goldsmith.Context) error {
for _, files := range self.groups { for _, files := range self.groups {
fg := &fileSorter{files, self.comparer} fg := &fileSorter{files, self.comparer}
sort.Sort(fg) sort.Sort(fg)

View File

@ -32,12 +32,12 @@ func (*Document) Name() string {
return "document" return "document"
} }
func (*Document) Initialize(context *goldsmith.Context) error { func (*Document) Initialize(context goldsmith.Context) error {
context.Filter(wildcard.New("**/*.html", "**/*.htm")) context.Filter(wildcard.New("**/*.html", "**/*.htm"))
return nil 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) doc, err := goquery.NewDocumentFromReader(inputFile)
if err != nil { if err != nil {
return err return err
@ -61,7 +61,7 @@ func (self *Document) Process(context *goldsmith.Context, inputFile goldsmith.Fi
return nil return nil
} }
func (self *Document) Finalize(context *goldsmith.Context) error { func (self *Document) Finalize(context goldsmith.Context) error {
for _, file := range self.files { for _, file := range self.files {
context.DispatchFile(file) context.DispatchFile(file)
} }

View File

@ -53,7 +53,7 @@ func (*Forward) Name() string {
return "forward" return "forward"
} }
func (self *Forward) Initialize(context *goldsmith.Context) error { func (self *Forward) Initialize(context goldsmith.Context) error {
for sourcePath, targetPath := range self.pathMap { for sourcePath, targetPath := range self.pathMap {
sourceFile, err := context.CreateFileFromReader(sourcePath, bytes.NewReader(nil)) sourceFile, err := context.CreateFileFromReader(sourcePath, bytes.NewReader(nil))
if err != nil { if err != nil {

View File

@ -66,12 +66,12 @@ func (*FrontMatter) Name() string {
return "frontmatter" return "frontmatter"
} }
func (*FrontMatter) Initialize(context *goldsmith.Context) error { func (*FrontMatter) Initialize(context goldsmith.Context) error {
context.Filter(wildcard.New("**/*.md", "**/*.markdown", "**/*.rst", "**/*.txt", "**/*.html", "**/*.htm")) context.Filter(wildcard.New("**/*.md", "**/*.markdown", "**/*.rst", "**/*.txt", "**/*.html", "**/*.htm"))
return nil 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) meta, body, err := parse(inputFile)
if err != nil { if err != nil {
return err return err

View File

@ -60,7 +60,7 @@ func (*Index) Name() string {
return "index" 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() self.mutex.Lock()
defer self.mutex.Unlock() defer self.mutex.Unlock()
@ -105,7 +105,7 @@ func (self *Index) Process(context *goldsmith.Context, inputFile goldsmith.File)
return nil return nil
} }
func (self *Index) Finalize(context *goldsmith.Context) error { func (self *Index) Finalize(context goldsmith.Context) error {
for name, list := range self.dirLists { for name, list := range self.dirLists {
sort.Sort(list.entries) sort.Sort(list.entries)

View File

@ -64,13 +64,13 @@ func (*Layout) Name() string {
return "layout" return "layout"
} }
func (self *Layout) Initialize(context *goldsmith.Context) error { func (self *Layout) Initialize(context goldsmith.Context) error {
self.template = template.New("").Funcs(self.helpers) self.template = template.New("").Funcs(self.helpers)
context.Filter(wildcard.New("**/*.html", "**/*.htm", "**/*.tmpl", "**/*.gohtml")) context.Filter(wildcard.New("**/*.html", "**/*.htm", "**/*.tmpl", "**/*.gohtml"))
return nil 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() self.mutex.Lock()
defer self.mutex.Unlock() defer self.mutex.Unlock()
@ -94,7 +94,7 @@ func (self *Layout) Process(context *goldsmith.Context, inputFile goldsmith.File
return nil return nil
} }
func (self *Layout) Finalize(context *goldsmith.Context) error { func (self *Layout) Finalize(context goldsmith.Context) error {
for _, templateFile := range self.templateFiles { for _, templateFile := range self.templateFiles {
var buff bytes.Buffer var buff bytes.Buffer
if _, err := templateFile.WriteTo(&buff); err != nil { if _, err := templateFile.WriteTo(&buff); err != nil {

View File

@ -31,13 +31,13 @@ func (*LiveJs) Name() string {
return "livejs" return "livejs"
} }
func (self *LiveJs) Initialize(context *goldsmith.Context) error { func (self *LiveJs) Initialize(context goldsmith.Context) error {
self.html = fmt.Sprintf("\n<!-- begin livejs code -->\n<script>\n%s\n</script>\n<!-- end livejs code -->\n", livejs) self.html = fmt.Sprintf("\n<!-- begin livejs code -->\n<script>\n%s\n</script>\n<!-- end livejs code -->\n", livejs)
context.Filter(wildcard.New("**/*.html", "**/*.htm")) context.Filter(wildcard.New("**/*.html", "**/*.htm"))
return nil 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 { if outputFile := context.RetrieveCachedFile(inputFile.Path(), inputFile); outputFile != nil {
outputFile.CopyProps(inputFile) outputFile.CopyProps(inputFile)
context.DispatchFile(outputFile) context.DispatchFile(outputFile)

View File

@ -42,12 +42,12 @@ func (*Markdown) Name() string {
return "markdown" return "markdown"
} }
func (self *Markdown) Initialize(context *goldsmith.Context) error { func (self *Markdown) Initialize(context goldsmith.Context) error {
context.Filter(wildcard.New("**/*.md", "**/*.markdown")) context.Filter(wildcard.New("**/*.md", "**/*.markdown"))
return nil 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" outputPath := strings.TrimSuffix(inputFile.Path(), path.Ext(inputFile.Path())) + ".html"
if outputFile := context.RetrieveCachedFile(outputPath, inputFile); outputFile != nil { if outputFile := context.RetrieveCachedFile(outputPath, inputFile); outputFile != nil {
outputFile.CopyProps(inputFile) outputFile.CopyProps(inputFile)

View File

@ -32,12 +32,12 @@ func (*Minify) Name() string {
return "minify" return "minify"
} }
func (*Minify) Initialize(context *goldsmith.Context) error { func (*Minify) Initialize(context goldsmith.Context) error {
context.Filter(wildcard.New("**/*.css", "**/*.html", "**/*.htm", "**/*.js", "**/*.svg", "**/*.json", "**/*.xml")) context.Filter(wildcard.New("**/*.css", "**/*.html", "**/*.htm", "**/*.js", "**/*.svg", "**/*.json", "**/*.xml"))
return nil 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 { if outputFile := context.RetrieveCachedFile(inputFile.Path(), inputFile); outputFile != nil {
outputFile.CopyProps(inputFile) outputFile.CopyProps(inputFile)
context.DispatchFile(outputFile) context.DispatchFile(outputFile)

View File

@ -109,12 +109,12 @@ func (*Pager) Name() string {
return "pager" return "pager"
} }
func (*Pager) Initialize(context *goldsmith.Context) error { func (*Pager) Initialize(context goldsmith.Context) error {
context.Filter(wildcard.New("**/*.html", "**/*.htm")) context.Filter(wildcard.New("**/*.html", "**/*.htm"))
return nil 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() self.mutex.Lock()
defer self.mutex.Unlock() defer self.mutex.Unlock()
@ -200,7 +200,7 @@ func (self *Pager) Process(context *goldsmith.Context, inputFile goldsmith.File)
return nil return nil
} }
func (self *Pager) Finalize(ctx *goldsmith.Context) error { func (self *Pager) Finalize(ctx goldsmith.Context) error {
for _, f := range self.files { for _, f := range self.files {
ctx.DispatchFile(f) ctx.DispatchFile(f)
} }

View File

@ -128,7 +128,7 @@ func (*Rule) Name() string {
return "rule" 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 { if inputFile.Name() == self.filename {
ruleSet, err := newRuleSet(inputFile) ruleSet, err := newRuleSet(inputFile)
if err != nil { if err != nil {
@ -147,7 +147,7 @@ func (self *Rule) Process(context *goldsmith.Context, inputFile goldsmith.File)
return nil return nil
} }
func (self *Rule) Finalize(context *goldsmith.Context) error { func (self *Rule) Finalize(context goldsmith.Context) error {
for _, inputFile := range self.inputFiles { for _, inputFile := range self.inputFiles {
var block bool var block bool
for _, ruleSet := range self.ruleSets { for _, ruleSet := range self.ruleSets {

View File

@ -57,12 +57,12 @@ func (*Summary) Name() string {
return "summary" return "summary"
} }
func (*Summary) Initialize(context *goldsmith.Context) error { func (*Summary) Initialize(context goldsmith.Context) error {
context.Filter(wildcard.New("**/*.html", "**/*.htm")) context.Filter(wildcard.New("**/*.html", "**/*.htm"))
return nil 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) doc, err := goquery.NewDocumentFromReader(inputFile)
if err != nil { if err != nil {
return err return err

View File

@ -120,7 +120,7 @@ func (self *Syndicate) WithFeed(name string, config FeedConfig) *Syndicate {
return self 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) defer context.DispatchFile(inputFile)
getString := func(key string) string { getString := func(key string) string {
@ -214,7 +214,7 @@ func (self *Syndicate) Process(context *goldsmith.Context, inputFile goldsmith.F
return nil return nil
} }
func (self *feed) output(context *goldsmith.Context) error { func (self *feed) output(context goldsmith.Context) error {
feed := feeds.Feed{ feed := feeds.Feed{
Title: self.config.Title, Title: self.config.Title,
Link: &feeds.Link{Href: self.config.Url}, Link: &feeds.Link{Href: self.config.Url},
@ -310,7 +310,7 @@ func (self *feed) output(context *goldsmith.Context) error {
return nil return nil
} }
func (self *Syndicate) Finalize(context *goldsmith.Context) error { func (self *Syndicate) Finalize(context goldsmith.Context) error {
for _, feed := range self.feeds { for _, feed := range self.feeds {
feed.output(context) feed.output(context)
} }

View File

@ -69,12 +69,12 @@ func (*Syntax) Name() string {
return "syntax" return "syntax"
} }
func (*Syntax) Initialize(context *goldsmith.Context) error { func (*Syntax) Initialize(context goldsmith.Context) error {
context.Filter(wildcard.New("**/*.html", "**/*.htm")) context.Filter(wildcard.New("**/*.html", "**/*.htm"))
return nil 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 { if outputFile := context.RetrieveCachedFile(inputFile.Path(), inputFile); outputFile != nil {
outputFile.CopyProps(inputFile) outputFile.CopyProps(inputFile)
context.DispatchFile(outputFile) context.DispatchFile(outputFile)

View File

@ -93,12 +93,12 @@ func (*Tags) Name() string {
return "tags" return "tags"
} }
func (*Tags) Initialize(context *goldsmith.Context) error { func (*Tags) Initialize(context goldsmith.Context) error {
context.Filter(wildcard.New("**/*.html", "**/*.htm")) context.Filter(wildcard.New("**/*.html", "**/*.htm"))
return nil 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{ tagState := &TagState{
TagsByName: &self.infoByName, TagsByName: &self.infoByName,
TagsByCount: &self.infoByCount, TagsByCount: &self.infoByCount,
@ -158,7 +158,7 @@ func (self *Tags) Process(context *goldsmith.Context, inputFile goldsmith.File)
return nil return nil
} }
func (self *Tags) Finalize(context *goldsmith.Context) error { func (self *Tags) Finalize(context goldsmith.Context) error {
for _, info := range self.info { for _, info := range self.info {
sort.Sort(info.TaggedFiles) sort.Sort(info.TaggedFiles)
@ -185,7 +185,7 @@ func (self *Tags) Finalize(context *goldsmith.Context) error {
return nil return nil
} }
func (self *Tags) buildPages(context *goldsmith.Context) ([]goldsmith.File, error) { func (self *Tags) buildPages(context goldsmith.Context) ([]goldsmith.File, error) {
var files []goldsmith.File var files []goldsmith.File
for tag, info := range self.info { for tag, info := range self.info {
var err error var err error

View File

@ -76,12 +76,12 @@ func (*Thumbnail) Name() string {
return "thumbnail" return "thumbnail"
} }
func (*Thumbnail) Initialize(context *goldsmith.Context) error { func (*Thumbnail) Initialize(context goldsmith.Context) error {
context.Filter(wildcard.New("**/*.jpg", "**/*.jpeg", "**/*.gif", "**/*.png")) context.Filter(wildcard.New("**/*.jpg", "**/*.jpeg", "**/*.gif", "**/*.png"))
return nil 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) defer context.DispatchFile(inputFile)
thumbPath := self.namer(inputFile.Path(), self.size) thumbPath := self.namer(inputFile.Path(), self.size)
@ -104,7 +104,7 @@ func (self *Thumbnail) Process(context *goldsmith.Context, inputFile goldsmith.F
return nil 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 var thumbFormat imaging.Format
switch strings.ToLower(filepath.Ext(thumbPath)) { switch strings.ToLower(filepath.Ext(thumbPath)) {
case ".jpg", ".jpeg": case ".jpg", ".jpeg":