diff --git a/server.go b/server.go index d67efab..cb90ddc 100644 --- a/server.go +++ b/server.go @@ -22,80 +22,106 @@ type server struct { } func newServer() (*server, error) { - files, err := ioutil.ReadDir("posts/") + s := &server{ + staticHandler: http.FileServer(http.Dir("static/")), + } + err := s.refreshPages() if err != nil { return nil, err } - s := &server{ - pages: make([]*Page, 0, len(files)), - staticHandler: http.FileServer(http.Dir("static/")), + err = s.refreshTemplates() + if err != nil { + return nil, err } + err = s.refreshStyles() + if err != nil { + return nil, err + } + + return s, nil +} + +func (s *server) refreshPages() error { + files, err := ioutil.ReadDir("posts/") + if err != nil { + return err + } + + s.pages = make([]*Page, 0, len(files)) for _, f := range files { filename := f.Name() if strings.HasSuffix(filename, ".md") { page, err := newPage(strings.TrimSuffix(filename, ".md")) if err != nil { - return nil, fmt.Errorf("could not render %s: %s", filename, err) + return fmt.Errorf("could not render %s: %s", filename, err) } s.pages = append(s.pages, page) log.Printf("Loaded page %s", filename) } } + return nil +} + +func (s *server) refreshTemplates() error { + var err error s.pageTpl, err = raymond.ParseFile("templates/page.html") if err != nil { - return nil, fmt.Errorf("could not parse page template") + return fmt.Errorf("could not parse page template") } log.Printf("Loaded page template") s.fullPostTpl, err = raymond.ParseFile("templates/fullpost.html") if err != nil { - return nil, fmt.Errorf("could not parse full post template") + return fmt.Errorf("could not parse full post template") } log.Printf("Loaded full post template") s.summaryTpl, err = raymond.ParseFile("templates/summary.html") if err != nil { - return nil, fmt.Errorf("could not parse summary template") + return fmt.Errorf("could not parse summary template") } log.Printf("Loaded summary template") + return nil +} +func (s *server) refreshStyles() error { styles, err := ioutil.ReadDir("styles/") if err != nil { - return nil, fmt.Errorf("Could not load styles directory: %s", err) + return fmt.Errorf("Could not load styles directory: %s", err) } for _, s := range styles { filename := s.Name() in, err := os.Open("styles/" + filename) if err != nil { - return nil, fmt.Errorf("Could not open style infile %s: %s", filename, err) + return fmt.Errorf("Could not open style infile %s: %s", filename, err) } if strings.HasSuffix(filename, ".scss") { outFilename := strings.TrimSuffix(filename, ".scss") + ".css" out, err := os.Create("static/css/" + outFilename) if err != nil { - return nil, fmt.Errorf("Could not open style outfile %s: %s", outFilename, err) + return fmt.Errorf("Could not open style outfile %s: %s", outFilename, err) } comp, err := libsass.New(out, in) if err != nil { - return nil, fmt.Errorf("Could not start sass compiler for file %s: %s", filename, err) + return fmt.Errorf("Could not start sass compiler for file %s: %s", filename, err) } if err = comp.Run(); err != nil { - return nil, fmt.Errorf("Could not generate stylesheet %s: %s", filename, err) + return fmt.Errorf("Could not generate stylesheet %s: %s", filename, err) } } else if strings.HasSuffix(filename, ".css") { out, err := os.Create("static/css/" + filename) if err != nil { - return nil, fmt.Errorf("Could not open style outfile %s: %s", filename, err) + return fmt.Errorf("Could not open style outfile %s: %s", filename, err) } _, err = io.Copy(out, in) if err != nil { - return nil, fmt.Errorf("Could not copy stylesheet %s: %s", filename, err) + return fmt.Errorf("Could not copy stylesheet %s: %s", filename, err) } } else { log.Printf("Skipping stylesheet %s, don't know how to handle", filename) @@ -103,8 +129,7 @@ func newServer() (*server, error) { } log.Printf("Loaded stylesheet %s", filename) } - - return s, nil + return nil } func (s *server) logRequest(req *http.Request) { @@ -122,19 +147,7 @@ func (s *server) router(res http.ResponseWriter, req *http.Request) { for _, p := range s.pages { if p.Slug == slug { - res.Header().Add("content-type", "text/html") - - contents, err := p.render(s.fullPostTpl) - if err != nil { - s.errorInRequest(res, req, err) - } - - page, err := s.createPage(p.Metadata.Title, contents) - if err != nil { - s.errorInRequest(res, req, err) - } - - res.Write([]byte(page)) + s.renderPage(p, res, req) return } } @@ -156,6 +169,19 @@ func (s *server) createPage(title, contents string) (string, error) { return s.pageTpl.Exec(ctx) } +func (s *server) renderPage(p *Page, res http.ResponseWriter, req *http.Request) { + res.Header().Add("content-type", "text/html") + contents, err := p.render(s.fullPostTpl) + if err != nil { + s.errorInRequest(res, req, err) + } + page, err := s.createPage(p.Metadata.Title, contents) + if err != nil { + s.errorInRequest(res, req, err) + } + res.Write([]byte(page)) +} + func (s *server) homePage(res http.ResponseWriter, req *http.Request) { res.Header().Add("content-type", "text/html")