diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..bcd69cc
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,14 @@
+# macOS
+.DS_Store
+
+# Window
+*.exe
+
+# IntelliJ
+.idea/
+
+# VSCode
+.vscode/
+
+# HTML
+generated/
diff --git a/custom/head.html b/custom/head.html
new file mode 100644
index 0000000..959258a
--- /dev/null
+++ b/custom/head.html
@@ -0,0 +1,18 @@
+
+
+
+
+
diff --git a/go.mod b/go.mod
new file mode 100644
index 0000000..090056d
--- /dev/null
+++ b/go.mod
@@ -0,0 +1,5 @@
+module github.com/haunt98/posts-go
+
+go 1.17
+
+require github.com/gomarkdown/markdown v0.0.0-20211128002848-ab7d7bf476b3 // indirect
diff --git a/go.sum b/go.sum
new file mode 100644
index 0000000..a8d8c40
--- /dev/null
+++ b/go.sum
@@ -0,0 +1,2 @@
+github.com/gomarkdown/markdown v0.0.0-20211128002848-ab7d7bf476b3 h1:TyhCPRkxLfBBOuOy8oambova4pG4Iivc0lTdTrkhN98=
+github.com/gomarkdown/markdown v0.0.0-20211128002848-ab7d7bf476b3/go.mod h1:JDGcbDT52eL4fju3sZ4TeHGsQwhG9nbDV21aMyhwPoA=
diff --git a/main.go b/main.go
new file mode 100644
index 0000000..58ae3be
--- /dev/null
+++ b/main.go
@@ -0,0 +1,67 @@
+package main
+
+import (
+ "log"
+ "os"
+ "path/filepath"
+ "strings"
+
+ "github.com/gomarkdown/markdown"
+ "github.com/gomarkdown/markdown/html"
+)
+
+const (
+ postsPath = "posts"
+ headHTMLPath = "custom/head.html"
+ generatedPath = "generated"
+ htmlExt = ".html"
+)
+
+func main() {
+ headHTML, err := os.ReadFile(headHTMLPath)
+ if err != nil {
+ log.Fatalln("Failed to read file", headHTML)
+ }
+
+ files, err := os.ReadDir(postsPath)
+ if err != nil {
+ log.Fatalln("Failed to read dir", postsPath)
+ }
+
+ if err := os.RemoveAll(generatedPath); err != nil {
+ log.Fatalln("Failed to remove all", generatedPath, err)
+ }
+
+ if err := os.MkdirAll(generatedPath, 0777); err != nil {
+ log.Fatalln("Failed to mkdir all", generatedPath)
+ }
+
+ for _, file := range files {
+ if file.IsDir() {
+ continue
+ }
+
+ filePath := filepath.Join(postsPath, file.Name())
+ md, err := os.ReadFile(filePath)
+ if err != nil {
+ log.Fatalln("Failed to read file", filePath)
+ }
+
+ htmlFlags := html.CommonFlags | html.CompletePage | html.TOC
+ htmlRendererOtps := html.RendererOptions{
+ Title: file.Name(),
+ Head: headHTML,
+ Flags: htmlFlags,
+ }
+
+ htmlRenderer := html.NewRenderer(htmlRendererOtps)
+ generatedHTML := markdown.ToHTML(md, nil, htmlRenderer)
+
+ generatedFileName := strings.TrimSuffix(file.Name(), filepath.Ext(file.Name())) + htmlExt
+ generatedFilePath := filepath.Join(generatedPath, generatedFileName)
+
+ if err := os.WriteFile(generatedFilePath, generatedHTML, 0666); err != nil {
+ log.Fatalln("Failed to write file", generatedFilePath, err)
+ }
+ }
+}