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