server: reorganize code into smaller functions
This commit is contained in:
parent
fda0b95132
commit
8afaaa10d2
1 changed files with 56 additions and 30 deletions
86
server.go
86
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")
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue