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