ref: dfb848256994289f5571fae8343578cf455c6431
parent: 30d4a26ba07591e423f9a391d58debc990dd087c
author: spf13 <[email protected]>
date: Mon Oct 20 16:15:33 EDT 2014
Handlers WIP - Convert now working
--- a/helpers/general.go
+++ b/helpers/general.go
@@ -36,6 +36,15 @@
return nil, err
}
+func InStringArray(arr []string, el string) bool {
+ for _, v := range arr {
+ if v == el {
+ return true
+ }
+ }
+ return false
+}
+
func GuessType(in string) string {
switch strings.ToLower(in) {
case "md", "markdown", "mdown":
--- a/hugolib/handler_page.go
+++ b/hugolib/handler_page.go
@@ -24,7 +24,7 @@
var markdown = Handle{
extensions: []string{"mdown", "markdown", "md"},
- readrun: func(f *source.File, s *Site, results HandleResults) {
+ read: func(f *source.File, s *Site, results HandleResults) {
page, err := NewPage(f.Path())
if err != nil {
results <- HandledResult{file: f, err: err}
@@ -38,6 +38,15 @@
page.Tmpl = s.Tmpl
results <- HandledResult{file: f, page: page, err: err}
+ },
+ pageConvert: func(p *Page, s *Site, results HandleResults) {
+ p.ProcessShortcodes(s.Tmpl)
+ err := p.Convert()
+ if err != nil {
+ results <- HandledResult{err: err}
+ }
+
+ results <- HandledResult{err: err}
},
}
--- a/hugolib/handlers.go
+++ b/hugolib/handlers.go
@@ -18,7 +18,7 @@
type Handler interface {
Read(*source.File, *Site, HandleResults)
//Render()
- //Convert()
+ Convert(interface{}, *Site, HandleResults)
Extensions() []string
}
@@ -31,10 +31,14 @@
type HandleResults chan<- HandledResult
type ReadFunc func(*source.File, *Site, HandleResults)
+type PageConvertFunc func(*Page, *Site, HandleResults)
+type FileConvertFunc ReadFunc
type Handle struct {
- extensions []string
- readrun ReadFunc
+ extensions []string
+ read ReadFunc
+ pageConvert PageConvertFunc
+ fileConvert FileConvertFunc
}
var handlers []Handler
@@ -44,7 +48,15 @@
}
func (h Handle) Read(f *source.File, s *Site, results HandleResults) {
- h.readrun(f, s, results)
+ h.read(f, s, results)
+}
+
+func (h Handle) Convert(i interface{}, s *Site, results HandleResults) {
+ if h.pageConvert != nil {
+ h.pageConvert(i.(*Page), s, results)
+ } else {
+ h.fileConvert(i.(*source.File), s, results)
+ }
}
func RegisterHandler(h Handler) {
--- a/hugolib/site.go
+++ b/hugolib/site.go
@@ -59,6 +59,7 @@
// 5. The entire collection of files is written to disk.
type Site struct {
Pages Pages
+ Files []*source.File
Tmpl Template
Taxonomies TaxonomyList
Source source.Input
@@ -82,6 +83,7 @@
Indexes *TaxonomyList // legacy, should be identical to Taxonomies
Sections Taxonomy
Pages *Pages
+ Files []*source.File
Recent *Pages // legacy, should be identical to Pages
Menus *Menus
Title string
@@ -363,11 +365,18 @@
results = make(chan HandledResult)
pagechan := make(chan *Page)
+ filechan = make(chan *source.File)
wg = &sync.WaitGroup{}
for i := 0; i < procs*4; i++ {
wg.Add(1)
+ go fileConverter(s, filechan, results, wg)
+ }
+
+ wg = &sync.WaitGroup{}
+ for i := 0; i < procs*4; i++ {
+ wg.Add(1)
go pageConverter(s, pagechan, results, wg)
}
@@ -377,7 +386,13 @@
pagechan <- p
}
+ for _, f := range s.Files {
+ fmt.Println(f)
+ filechan <- f
+ }
+
close(pagechan)
+ close(filechan)
wg.Wait()
@@ -412,15 +427,22 @@
func pageConverter(s *Site, pages <-chan *Page, results HandleResults, wg *sync.WaitGroup) {
defer wg.Done()
for page := range pages {
- //Handling short codes prior to Conversion to HTML
- page.ProcessShortcodes(s.Tmpl)
+ h := FindHandler(page.File.Extension())
+ if h != nil {
+ h.Convert(page, s, results)
+ }
+ }
+}
- err := page.Convert()
- if err != nil {
- results <- HandledResult{err: err}
- continue
+func fileConverter(s *Site, files <-chan *source.File, results HandleResults, wg *sync.WaitGroup) {
+ defer wg.Done()
+ for file := range files {
+ fmt.Println(file.Path())
+ //Handling short codes prior to Conversion to HTML
+ h := FindHandler(file.Extension())
+ if h != nil {
+ h.Convert(file, s, results)
}
- results <- HandledResult{err: err}
}
}
@@ -447,18 +469,24 @@
continue
}
- if r.page.ShouldBuild() {
- s.Pages = append(s.Pages, r.page)
- }
+ // !page == file
+ if r.page == nil {
+ s.Files = append(s.Files, r.file)
+ } else {
+ if r.page.ShouldBuild() {
+ s.Pages = append(s.Pages, r.page)
+ }
- if r.page.IsDraft() {
- s.draftCount += 1
- }
+ if r.page.IsDraft() {
+ s.draftCount += 1
+ }
- if r.page.IsFuture() {
- s.futureCount += 1
+ if r.page.IsFuture() {
+ s.futureCount += 1
+ }
}
}
+
s.Pages.Sort()
if len(errMsgs) == 0 {
errs <- nil
@@ -623,21 +651,12 @@
func (s *Site) possibleTaxonomies() (taxonomies []string) {
for _, p := range s.Pages {
for k := range p.Params {
- if !inStringArray(taxonomies, k) {
+ if !helpers.InStringArray(taxonomies, k) {
taxonomies = append(taxonomies, k)
}
}
}
return
-}
-
-func inStringArray(arr []string, el string) bool {
- for _, v := range arr {
- if v == el {
- return true
- }
- }
- return false
}
// Render shell pages that simply have a redirect in the header