shithub: hugo

Download patch

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