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_20221124"
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 if post.OutsideArticle != "" {
69 r = "<a href='" + post.OutsideArticle + "'>" + r + "</a>"
70 } else {
71 filename := strings.Split(post.Md, ".")[0]
72 r = "<a href='" + config.RelativePath + "/" + filename + ".html'>" + r + "</a>"
73 }
74 blogoIndex = blogoIndex + r
75 }
76 //put the blogoIndex in the index.html
77 m := make(map[string]string)
78 m["[blogo-title]"] = config.Title
79 m["[blogo-content]"] = blogoIndex
80 m["[blogo-summary]"] = config.MetaDescr
81 m["[blogo-img]"] = config.AbsoluteUrl + "/" + config.MetaImg
82 m["[blogo-link]"] = config.AbsoluteUrl
83 r := putHTMLToTemplate(indexTemplate, m)
84 r = addRSSDiscovery(r)
85 writeFile(config.OutputDir+"/"+"index.html", r)
86
87 // generate posts pages
88
89 for _, post := range config.Posts {
90 if post.OutsideArticle != "" {
91 continue
92 }
93 mdcontent := readFile(directory + "/" + config.PostsDir + post.Md)
94 mdParser := parser.NewWithExtensions(mdExtensions)
95 htmlcontent := markdown.ToHTML([]byte(mdcontent), mdParser, nil)
96
97 firstline := strings.Split(mdcontent, "\n")[0]
98 title := strings.Replace(firstline, "#", "", -1)
99
100 filename := strings.Split(post.Md, ".")[0]
101
102 m := make(map[string]string)
103 m["[blogo-title]"] = title + " - " + config.Title
104 m["[blogo-content]"] = string(htmlcontent)
105 m["[blogo-summary]"] = post.MetaDescr
106 m["[blogo-link]"] = config.AbsoluteUrl + "/" + filename + ".html"
107 m["[blogo-img]"] = config.AbsoluteUrl + "/" + post.MetaImg
108
109 r := putHTMLToTemplate(indexTemplate, m)
110 r = addRSSDiscovery(r)
111 writeFile(config.OutputDir+"/"+filename+".html", r)
112 }
113
114 generateRSS()
115
116 //copy raw
117 fmt.Println("copying raw:")
118 for _, dir := range config.CopyRaw {
119 copyRaw(directory+"/"+dir, config.OutputDir+"/")
120 }
121}
122
123func putHTMLToTemplate(template string, m map[string]string) string {
124 lines := getLines(template)
125 var resultL []string
126 for _, line := range lines {
127 inserted := false
128 for k, v := range m {
129 if strings.Contains(line, k) {
130 //in the line, change [tag] with the content
131 lineReplaced := strings.Replace(line, k, v, -1)
132 resultL = append(resultL, lineReplaced)
133 inserted = true
134 }
135 }
136 if inserted == false {
137 resultL = append(resultL, line)
138 }
139 }
140 result := concatStringsWithJumps(resultL)
141 return result
142}