parent
05f7ee5280
commit
9ba1c7cfeb
6
cache.go
6
cache.go
@ -15,7 +15,7 @@ type cache struct {
|
|||||||
baseDir string
|
baseDir string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *cache) retrieveFile(context *contextImpl, 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)
|
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 *contextImpl, outputPath string, inputFi
|
|||||||
return outputFile, nil
|
return outputFile, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *cache) storeFile(context *contextImpl, outputFile File, inputFiles []File) error {
|
func (self *cache) storeFile(context *Context, 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 *contextImpl, outputFile File, inputFiles [
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *cache) buildCachePath(context *contextImpl, outputPath string, inputFiles []File) (string, error) {
|
func (self *cache) buildCachePath(context *Context, outputPath string, inputFiles []File) (string, error) {
|
||||||
hasher := crc32.NewIEEE()
|
hasher := crc32.NewIEEE()
|
||||||
hasher.Write([]byte(outputPath))
|
hasher.Write([]byte(outputPath))
|
||||||
|
|
||||||
|
45
context.go
45
context.go
@ -13,34 +13,7 @@ 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 interface {
|
type Context struct {
|
||||||
// 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
|
||||||
@ -56,7 +29,7 @@ type contextImpl 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 *contextImpl) CreateFileFromReader(sourcePath string, reader io.Reader) (File, error) {
|
func (self *Context) 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
|
||||||
@ -77,7 +50,7 @@ func (self *contextImpl) CreateFileFromReader(sourcePath string, reader io.Reade
|
|||||||
}
|
}
|
||||||
|
|
||||||
// CreateFileFromAsset creates a new file instance from the provided file path.
|
// CreateFileFromAsset creates a new file instance from the provided file path.
|
||||||
func (self *contextImpl) CreateFileFromAsset(sourcePath, dataPath string) (File, error) {
|
func (self *Context) 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")
|
||||||
}
|
}
|
||||||
@ -109,14 +82,14 @@ func (self *contextImpl) CreateFileFromAsset(sourcePath, dataPath string) (File,
|
|||||||
}
|
}
|
||||||
|
|
||||||
// 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 *contextImpl) DispatchFile(file File) {
|
func (self *Context) 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 *contextImpl) DispatchAndCacheFile(outputFile File, inputFiles ...File) {
|
func (self *Context) DispatchAndCacheFile(outputFile File, inputFiles ...File) {
|
||||||
if self.goldsmith.state.cache != nil {
|
if self.goldsmith.state.cache != nil {
|
||||||
self.goldsmith.state.cache.storeFile(self, outputFile, inputFiles)
|
self.goldsmith.state.cache.storeFile(self, outputFile, inputFiles)
|
||||||
}
|
}
|
||||||
@ -127,7 +100,7 @@ func (self *contextImpl) DispatchAndCacheFile(outputFile File, inputFiles ...Fil
|
|||||||
// 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 *contextImpl) RetrieveCachedFile(outputPath string, inputFiles ...File) File {
|
func (self *Context) RetrieveCachedFile(outputPath string, inputFiles ...File) File {
|
||||||
var outputFile File
|
var outputFile File
|
||||||
if self.goldsmith.state.cache != nil {
|
if self.goldsmith.state.cache != nil {
|
||||||
outputFile, _ = self.goldsmith.state.cache.retrieveFile(self, outputPath, inputFiles)
|
outputFile, _ = self.goldsmith.state.cache.retrieveFile(self, outputPath, inputFiles)
|
||||||
@ -137,7 +110,7 @@ func (self *contextImpl) RetrieveCachedFile(outputPath string, inputFiles ...Fil
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Specify internal filter(s) that exclude files from being processed.
|
// Specify internal filter(s) that exclude files from being processed.
|
||||||
func (self *contextImpl) Filter(filters ...Filter) Context {
|
func (self *Context) Filter(filters ...Filter) *Context {
|
||||||
for _, filter := range filters {
|
for _, filter := range filters {
|
||||||
self.filtersInt.push(filter, self.index)
|
self.filtersInt.push(filter, self.index)
|
||||||
}
|
}
|
||||||
@ -146,12 +119,12 @@ func (self *contextImpl) Filter(filters ...Filter) Context {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Specify the maximum number of threads used for processing.
|
// Specify the maximum number of threads used for processing.
|
||||||
func (self *contextImpl) Threads(threads int) Context {
|
func (self *Context) Threads(threads int) *Context {
|
||||||
self.threads = threads
|
self.threads = threads
|
||||||
return self
|
return self
|
||||||
}
|
}
|
||||||
|
|
||||||
func (self *contextImpl) step() {
|
func (self *Context) step() {
|
||||||
defer close(self.filesOut)
|
defer close(self.filesOut)
|
||||||
|
|
||||||
if initializer, ok := self.plugin.(Initializer); ok {
|
if initializer, ok := self.plugin.(Initializer); ok {
|
||||||
|
@ -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.
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
|
@ -7,7 +7,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
type chainState struct {
|
type chainState struct {
|
||||||
contexts []*contextImpl
|
contexts []*Context
|
||||||
|
|
||||||
cache *cache
|
cache *cache
|
||||||
filters filterStack
|
filters filterStack
|
||||||
@ -44,7 +44,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 := &contextImpl{
|
context := &Context{
|
||||||
goldsmith: self,
|
goldsmith: self,
|
||||||
plugin: plugin,
|
plugin: plugin,
|
||||||
filtersExt: append(filterStack(nil), self.state.filters...),
|
filtersExt: append(filterStack(nil), self.state.filters...),
|
||||||
|
@ -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)
|
||||||
|
@ -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
|
||||||
|
@ -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.F
|
|||||||
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)
|
||||||
|
@ -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.Fil
|
|||||||
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)
|
||||||
}
|
}
|
||||||
|
@ -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 {
|
||||||
|
@ -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
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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) e
|
|||||||
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 {
|
||||||
|
@ -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
|
||||||
|
@ -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.Fi
|
|||||||
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)
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
@ -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) e
|
|||||||
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
|
||||||
|
@ -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.Fi
|
|||||||
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":
|
||||||
|
Loading…
Reference in New Issue
Block a user