Handlers WIP - Convert now working

This commit is contained in:
spf13 2014-10-20 20:15:33 -04:00
parent 30d4a26ba0
commit dfb8482569
4 changed files with 80 additions and 31 deletions

View file

@ -36,6 +36,15 @@ func FindAvailablePort() (*net.TCPAddr, error) {
return nil, err 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 { func GuessType(in string) string {
switch strings.ToLower(in) { switch strings.ToLower(in) {
case "md", "markdown", "mdown": case "md", "markdown", "mdown":

View file

@ -24,7 +24,7 @@ var Pager interface {
var markdown = Handle{ var markdown = Handle{
extensions: []string{"mdown", "markdown", "md"}, 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()) page, err := NewPage(f.Path())
if err != nil { if err != nil {
results <- HandledResult{file: f, err: err} results <- HandledResult{file: f, err: err}
@ -39,6 +39,15 @@ var markdown = Handle{
results <- HandledResult{file: f, page: page, err: err} 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}
},
} }
func init() { func init() {

View file

@ -18,7 +18,7 @@ import "github.com/spf13/hugo/source"
type Handler interface { type Handler interface {
Read(*source.File, *Site, HandleResults) Read(*source.File, *Site, HandleResults)
//Render() //Render()
//Convert() Convert(interface{}, *Site, HandleResults)
Extensions() []string Extensions() []string
} }
@ -31,10 +31,14 @@ type HandledResult struct {
type HandleResults chan<- HandledResult type HandleResults chan<- HandledResult
type ReadFunc func(*source.File, *Site, HandleResults) type ReadFunc func(*source.File, *Site, HandleResults)
type PageConvertFunc func(*Page, *Site, HandleResults)
type FileConvertFunc ReadFunc
type Handle struct { type Handle struct {
extensions []string extensions []string
readrun ReadFunc read ReadFunc
pageConvert PageConvertFunc
fileConvert FileConvertFunc
} }
var handlers []Handler var handlers []Handler
@ -44,7 +48,15 @@ func (h Handle) Extensions() []string {
} }
func (h Handle) Read(f *source.File, s *Site, results HandleResults) { 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) { func RegisterHandler(h Handler) {

View file

@ -59,6 +59,7 @@ var DefaultTimer *nitro.B
// 5. The entire collection of files is written to disk. // 5. The entire collection of files is written to disk.
type Site struct { type Site struct {
Pages Pages Pages Pages
Files []*source.File
Tmpl Template Tmpl Template
Taxonomies TaxonomyList Taxonomies TaxonomyList
Source source.Input Source source.Input
@ -82,6 +83,7 @@ type SiteInfo struct {
Indexes *TaxonomyList // legacy, should be identical to Taxonomies Indexes *TaxonomyList // legacy, should be identical to Taxonomies
Sections Taxonomy Sections Taxonomy
Pages *Pages Pages *Pages
Files []*source.File
Recent *Pages // legacy, should be identical to Pages Recent *Pages // legacy, should be identical to Pages
Menus *Menus Menus *Menus
Title string Title string
@ -363,9 +365,16 @@ func (s *Site) CreatePages() error {
results = make(chan HandledResult) results = make(chan HandledResult)
pagechan := make(chan *Page) pagechan := make(chan *Page)
filechan = make(chan *source.File)
wg = &sync.WaitGroup{} 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++ { for i := 0; i < procs*4; i++ {
wg.Add(1) wg.Add(1)
go pageConverter(s, pagechan, results, wg) go pageConverter(s, pagechan, results, wg)
@ -377,7 +386,13 @@ func (s *Site) CreatePages() error {
pagechan <- p pagechan <- p
} }
for _, f := range s.Files {
fmt.Println(f)
filechan <- f
}
close(pagechan) close(pagechan)
close(filechan)
wg.Wait() wg.Wait()
@ -412,15 +427,22 @@ func sourceReader(s *Site, files <-chan *source.File, results chan<- HandledResu
func pageConverter(s *Site, pages <-chan *Page, results HandleResults, wg *sync.WaitGroup) { func pageConverter(s *Site, pages <-chan *Page, results HandleResults, wg *sync.WaitGroup) {
defer wg.Done() defer wg.Done()
for page := range pages { for page := range pages {
//Handling short codes prior to Conversion to HTML h := FindHandler(page.File.Extension())
page.ProcessShortcodes(s.Tmpl) 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 @@ func readCollator(s *Site, results <-chan HandledResult, errs chan<- error) {
continue continue
} }
if r.page.ShouldBuild() { // !page == file
s.Pages = append(s.Pages, r.page) 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() { if r.page.IsDraft() {
s.draftCount += 1 s.draftCount += 1
} }
if r.page.IsFuture() { if r.page.IsFuture() {
s.futureCount += 1 s.futureCount += 1
}
} }
} }
s.Pages.Sort() s.Pages.Sort()
if len(errMsgs) == 0 { if len(errMsgs) == 0 {
errs <- nil errs <- nil
@ -623,7 +651,7 @@ func (s *Site) assembleSections() {
func (s *Site) possibleTaxonomies() (taxonomies []string) { func (s *Site) possibleTaxonomies() (taxonomies []string) {
for _, p := range s.Pages { for _, p := range s.Pages {
for k := range p.Params { for k := range p.Params {
if !inStringArray(taxonomies, k) { if !helpers.InStringArray(taxonomies, k) {
taxonomies = append(taxonomies, k) taxonomies = append(taxonomies, k)
} }
} }
@ -631,15 +659,6 @@ func (s *Site) possibleTaxonomies() (taxonomies []string) {
return 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 // Render shell pages that simply have a redirect in the header
func (s *Site) RenderAliases() error { func (s *Site) RenderAliases() error {
for _, p := range s.Pages { for _, p := range s.Pages {