/
article_rendering_handler.go
60 lines (51 loc) · 1.26 KB
/
article_rendering_handler.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
package core
import (
"path/filepath"
"github.com/mdwhatcott/huguinho/contracts"
)
type RenderingFileSystem interface {
contracts.MkdirAll
contracts.WriteFile
}
type ArticleRenderingHandler struct {
disk RenderingFileSystem
renderer contracts.Renderer
output string
}
func NewArticleRenderingHandler(
disk RenderingFileSystem,
renderer contracts.Renderer,
output string,
) *ArticleRenderingHandler {
return &ArticleRenderingHandler{
disk: disk,
renderer: renderer,
output: output,
}
}
func (this *ArticleRenderingHandler) Handle(article *contracts.Article) {
data := contracts.RenderedArticle{
Slug: article.Metadata.Slug,
Title: article.Metadata.Title,
Intro: article.Metadata.Intro,
Date: article.Metadata.Date,
Topics: article.Metadata.Topics,
Content: article.Content.Converted,
}
rendered, err := this.renderer.Render(data)
if err != nil {
article.Error = StackTraceError(err)
return
}
folder := filepath.Join(this.output, article.Metadata.Slug)
err = this.disk.MkdirAll(folder, 0755)
if err != nil {
article.Error = StackTraceError(err)
return
}
err = this.disk.WriteFile(filepath.Join(folder, "index.html"), []byte(rendered), 0644)
if err != nil {
article.Error = StackTraceError(err)
return
}
}