package blog
import (
"encoding/xml"
"fmt"
"strings"
"time"
)
const baseURL = "https://chaosmith.systems"
func generateRSS(s *Store) string {
var b strings.Builder
b.WriteString(`` + "\n")
b.WriteString(`` + "\n")
b.WriteString(" \n")
b.WriteString(" Chaosmith Systems — Field Notes\n")
b.WriteString(" " + baseURL + "/blog/\n")
b.WriteString(" Engineering, music, and experiments from controlled chaos.\n")
b.WriteString(" en\n")
b.WriteString(` ` + "\n")
for _, p := range s.All() {
b.WriteString(" - \n")
b.WriteString(" " + xmlEscape(p.Title) + "\n")
b.WriteString(" " + baseURL + "/blog/posts/" + p.Slug + "\n")
b.WriteString(" " + baseURL + "/blog/posts/" + p.Slug + "\n")
b.WriteString(" " + xmlEscape(p.Description) + "\n")
b.WriteString(" " + p.Date.Format(time.RFC1123Z) + "\n")
b.WriteString("
\n")
}
b.WriteString(" \n\n")
return b.String()
}
func generateJSONFeed(s *Store) string {
var b strings.Builder
b.WriteString(`{"version":"https://jsonfeed.org/version/1.1","title":"Chaosmith Systems — Field Notes","home_page_url":"` + baseURL + `/blog/","feed_url":"` + baseURL + `/blog/feed.json","items":[`)
first := true
for _, p := range s.All() {
if !first {
b.WriteString(",")
}
first = false
b.WriteString(`{`)
b.WriteString(`"id":"` + baseURL + "/blog/posts/" + p.Slug + `",`)
b.WriteString(`"url":"` + baseURL + "/blog/posts/" + p.Slug + `",`)
b.WriteString(`"title":"` + jsonEscape(p.Title) + `",`)
b.WriteString(`"summary":"` + jsonEscape(p.Description) + `",`)
b.WriteString(`"date_published":"` + p.Date.Format(time.RFC3339) + `"`)
b.WriteString(`}`)
}
b.WriteString("]}")
return b.String()
}
func generateSitemap(s *Store) string {
var b strings.Builder
b.WriteString(`` + "\n")
b.WriteString(`` + "\n")
// Static pages
b.WriteString(" \n")
b.WriteString(" " + baseURL + "/\n")
b.WriteString(" monthly\n")
b.WriteString(" \n")
b.WriteString(" \n")
b.WriteString(" " + baseURL + "/blog/\n")
b.WriteString(" weekly\n")
b.WriteString(" \n")
for _, p := range s.All() {
b.WriteString(" \n")
b.WriteString(" " + baseURL + "/blog/posts/" + p.Slug + "\n")
b.WriteString(" " + p.Date.Format("2006-01-02") + "\n")
b.WriteString(" \n")
}
b.WriteString("\n")
return b.String()
}
func xmlEscape(s string) string {
var b strings.Builder
xml.EscapeText(&b, []byte(s))
return b.String()
}
func jsonEscape(s string) string {
var b strings.Builder
for _, r := range s {
switch r {
case '"':
b.WriteString(`\"`)
case '\\':
b.WriteString(`\\`)
case '\n':
b.WriteString(`\n`)
case '\r':
b.WriteString(`\r`)
case '\t':
b.WriteString(`\t`)
default:
if r < 0x20 {
b.WriteString(fmt.Sprintf(`\u%04x`, r))
} else {
b.WriteRune(r)
}
}
}
return b.String()
}