arnaucube
arnaucube/blogoPublic Self-hosted repository
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}