blogo/main.go
main.goRaw
1package main
2
3import (
4 "flag"
5 "fmt"
6 "log"
7 "net/http"
8 "os"
9 "strings"
10
11 "github.com/gomarkdown/markdown"
12 "github.com/gomarkdown/markdown/parser"
13)
14
15const version = "v0_20220514"
16const directory = "blogo-input"
17const defaultOutputDir = "public"
18
19func main() {
20 devMode := flag.Bool("d", false, "dev mode")
21 port := flag.String("p", "8080", "port (only for dev mode)")
22 flag.Parse()
23
24 fmt.Println("Blogo version:", version)
25 readConfig(directory + "/blogo.json")
26 _ = os.Mkdir(config.OutputDir, os.ModePerm)
27
28 fmt.Println("devMode:", *devMode)
29 generateHTML()
30 if !*devMode {
31 return
32 }
33
34 go watch("./blogo-input")
35 // TODO public not watched, until a way to force browser refresh
36 // go watch("./public")
37
38 // serve files
39 fs := http.FileServer(http.Dir(config.OutputDir))
40 http.Handle(config.RelativePath+"/", http.StripPrefix(config.RelativePath, fs))
41 fmt.Printf("Blog being served in: \n http://127.0.0.1:%s%s\n http://localhost:%s%s\n",
42 *port, config.RelativePath, *port, config.RelativePath)
43 log.Fatal(http.ListenAndServe(":"+*port, nil))
44}
45
46func generateHTML() {
47 readConfig(directory + "/blogo.json")
48 fmt.Println(config)
49
50 mdExtensions := parser.NoIntraEmphasis | parser.Tables | parser.FencedCode |
51 parser.Autolink | parser.Strikethrough | parser.SpaceHeadings | parser.HeadingIDs |
52 parser.BackslashLineBreak | parser.DefinitionLists | parser.MathJax
53
54 // generate index page
55 indexTemplate := readFile(directory + "/" + config.IndexTemplate)
56 indexPostTemplate := readFile(directory + "/" + config.PostThumbTemplate)
57 var blogoIndex string
58 blogoIndex = ""
59 for _, post := range config.Posts {
60 mdpostthumb := readFile(directory + "/" + config.PostsDir + post.Thumb)
61 mdParser := parser.NewWithExtensions(mdExtensions)
62 htmlpostthumb := markdown.ToHTML([]byte(mdpostthumb), mdParser, nil)
63
64 //put the htmlpostthumb in the blogo-index-post-template
65 m := make(map[string]string)
66 m["[blogo-index-post-template]"] = string(htmlpostthumb)
67 r := putHTMLToTemplate(indexPostTemplate, m)
68 filename := strings.Split(post.Md, ".")[0]
69 r = "<a href='" + config.RelativePath + "/" + filename + ".html'>" + r + "</a>"
70 blogoIndex = blogoIndex + r
71 }
72 //put the blogoIndex in the index.html
73 m := make(map[string]string)
74 m["[blogo-title]"] = config.Title
75 m["[blogo-content]"] = blogoIndex
76 m["[blogo-summary]"] = config.MetaDescr
77 m["[blogo-img]"] = config.AbsoluteUrl + "/" + config.MetaImg
78 m["[blogo-link]"] = config.AbsoluteUrl
79 r := putHTMLToTemplate(indexTemplate, m)
80 writeFile(config.OutputDir+"/"+"index.html", r)
81
82 // generate posts pages
83
84 for _, post := range config.Posts {
85 mdcontent := readFile(directory + "/" + config.PostsDir + post.Md)
86 mdParser := parser.NewWithExtensions(mdExtensions)
87 htmlcontent := markdown.ToHTML([]byte(mdcontent), mdParser, nil)
88
89 firstline := strings.Split(mdcontent, "\n")[0]
90 title := strings.Replace(firstline, "#", "", -1)
91
92 filename := strings.Split(post.Md, ".")[0]
93
94 m := make(map[string]string)
95 m["[blogo-title]"] = title + " - " + config.Title
96 m["[blogo-content]"] = string(htmlcontent)
97 m["[blogo-summary]"] = post.MetaDescr
98 m["[blogo-link]"] = config.AbsoluteUrl + "/" + filename + ".html"
99 m["[blogo-img]"] = config.AbsoluteUrl + "/" + post.MetaImg
100
101 r := putHTMLToTemplate(indexTemplate, m)
102 writeFile(config.OutputDir+"/"+filename+".html", r)
103 }
104
105 //copy raw
106 fmt.Println("copying raw:")
107 for _, dir := range config.CopyRaw {
108 copyRaw(directory+"/"+dir, config.OutputDir+"/")
109 }
110}
111
112func putHTMLToTemplate(template string, m map[string]string) string {
113 lines := getLines(template)
114 var resultL []string
115 for _, line := range lines {
116 inserted := false
117 for k, v := range m {
118 if strings.Contains(line, k) {
119 //in the line, change [tag] with the content
120 lineReplaced := strings.Replace(line, k, v, -1)
121 resultL = append(resultL, lineReplaced)
122 inserted = true
123 }
124 }
125 if inserted == false {
126 resultL = append(resultL, line)
127 }
128 }
129 result := concatStringsWithJumps(resultL)
130 return result
131}