gen-blogrecs: add
crispy-caesus crispy@crispy-caesus.eu
Tue, 05 May 2026 23:44:46 +0200
7 files changed,
160 insertions(+),
3 deletions(-)
M
cmd/server/genblog.go
→
cmd/server/genblog.go
@@ -25,8 +25,8 @@ fmt.Println("Generating blog page...")
blogDataSlice := generateBlogPage() fmt.Println("Generating blog posts...") generateBlogPosts(blogDataSlice) - fmt.Println("Generating rss...") - genRSS(blogDataSlice) + fmt.Println("Generating blog rss...") + genRSSBlog(blogDataSlice) } func genBlogDir() {
A
cmd/server/genrecs.go
@@ -0,0 +1,90 @@
+package main + +import ( + "fmt" + "os" + "strings" + "text/template" +) + +type ( + blogRec struct { + URL string + Title string + Author string + } +) + +func genRecs() { + fmt.Println("Generating blog recommendations...") + recList := genBlogRecs() + fmt.Println("Generating blog recommendation RSS...") + genRSSBlogRecs(recList) +} + +func readBlogRecs() []blogRec { + // read file + content, err := os.ReadFile("templates/blogrecs.txt") + if err != nil { + fmt.Printf("ERROR reading blogrecs file: %s\n", err) + } + + state := 0 // 1 url, 2 title, 3 author + var b strings.Builder // builder for string parsing + + var recList []blogRec + + for _, char := range content { + switch state { + case 0: + recList = append(recList, blogRec{}) + state = 1 + case 1: + if char == '\n' { + recList[len(recList)-1].URL = b.String() + b.Reset() + state = 2 + } + b.WriteByte(char) + case 2: + if char == '\n' { + recList[len(recList)-1].Title = b.String() + b.Reset() + state = 3 + } + b.WriteByte(char) + case 3: + if char == '\n' { + recList[len(recList)-1].Author = b.String() + b.Reset() + state = 0 + } + b.WriteByte(char) + } + } + + return recList +} + +func genBlogRecs() []blogRec { + recList := readBlogRecs() + + // template + tpl, err := template.ParseFiles("templates/blogrecs.html.gotmpl") + if err != nil { + fmt.Printf("ERROR creating template: %s\n", err) + } + + f, err := os.Create("html/en/blogrecs.html") + if err != nil { + fmt.Printf("ERROR creating html: %s\n", err) + panic(1) + } + + err = tpl.ExecuteTemplate(f, "blogrecs.html.gotmpl", recList) + if err != nil { + fmt.Printf("ERROR executing template: %s\n", err) + } + + return recList +}
M
cmd/server/genrss.go
→
cmd/server/genrss.go
@@ -13,7 +13,7 @@ Link string
} ) -func genRSS(blogDataSlice []blogData) { +func genRSSBlog(blogDataSlice []blogData) { var rssItemSlice []rssItem for _, post := range blogDataSlice { rssItemSlice = append(rssItemSlice, rssItem{@@ -38,3 +38,21 @@ if err != nil {
fmt.Printf("ERROR executing template: %s\n", err) } } + +func genRSSBlogRecs(recList []blogRec) { + tpl, err := template.ParseFiles("templates/blogrecs.xml.gotmpl") + if err != nil { + fmt.Printf("ERROR creating template: %s\n", err) + } + + f, err := os.Create("html/en/blogrecs.xml.html") + if err != nil { + fmt.Printf("ERROR creating xml: %s\n", err) + panic(1) + } + + err = tpl.ExecuteTemplate(f, "blogrecs.xml.gotmpl", recList) + if err != nil { + fmt.Printf("ERROR executing template: %s\n", err) + } +}
M
cmd/server/main.go
→
cmd/server/main.go
@@ -26,6 +26,9 @@ return
case "blog": generateBlog() return + case "recs": + genRecs() + return } }
M
templates/blogindex.html.gotmpl
→
templates/blogindex.html.gotmpl
@@ -16,5 +16,7 @@ {{end}}
</div> <div> <a href="/en/blog/rss.xml">RSS</a> + <br> + <a href="/en/blogrecs">recs</a> </div> </body>
A
templates/blogrecs.html.gotmpl
@@ -0,0 +1,21 @@
+<!doctype html> +<html lang="en"> + <head> + <title>crispy blog recommendations</title> + <meta name="viewport" content="width=device-width, initial-scale=1.0"> + <link rel="stylesheet" href="../static/global.css" /> + <link rel="stylesheet" href="../static/center.css" /> + <link rel="icon" type="image/png" href="/static/banan_icon.png" /> +</head> +<body> + <div> + <h2>some posts I've enjoyed reading and want to share</h2> + {{range .}} + <p><a href="{{.URL}}">{{.Title}}</a> - {{.Author}}</p> + {{end}} + </div> + <div> + <a href="/en/blogrecs.xml">RSS</a> + </div> +</body> +
A
templates/blogrecs.xml.gotmpl
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?> +<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"> +<channel> + <title>crispy blog recommendations</title> + <link>https://crispy-caesus.eu/en/blogrecs</link> + <description> + some posts I've enjoyed reading and want to share + </description> + <language>en-us</language> + <atom:link + href="https://crispy-caesus.eu/en/blogrecs.xml" + rel="self" + type="application/rss+xml" + /> + + {{range .}}<item> + <title>{{.Title}}</title> + <link>{{.URL}}</link> + <author>{{.Author}} + </item> + {{end}} +</channel> +</rss>