package main import "core:fmt" import "core:strings" WEEKDAYS: [7]string = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"} generate_rss :: proc( pages: []Page, site_title: string, site_desc: string, base_url: string, ) -> string { parts: [dynamic]string defer delete(parts) append(&parts, fmt.aprintf( ` %s %s/ %s en-us `, xml_escape(site_title), base_url, xml_escape(site_desc), base_url, )) for page in pages { if page.type == .Home { continue } pub_date := "Mon, 01 Jan 0001 00:00:00 +0000" if page.date != "" { pub_date = format_rfc822(page.date) } append(&parts, fmt.aprintf( ` %s %s%s %s %s%s %s `, xml_escape(page.title), base_url, page.permalink, pub_date, base_url, page.permalink, xml_escape(page.body_html), )) } append(&parts, "\n") return strings.join(parts[:], "") } generate_sitemap :: proc(pages: []Page, base_url: string) -> string { parts: [dynamic]string defer delete(parts) append( &parts, ` `, ) for page in pages { lastmod := "" if page.date != "" { lastmod = fmt.aprintf("%s", page.date) } append(&parts, fmt.aprintf( "%s%s%s\n", base_url, page.permalink, lastmod, )) } // Posts list page posts_lastmod := "" for page in pages { if page.type == .Post && page.date > posts_lastmod { posts_lastmod = page.date } } posts_lm := "" if posts_lastmod != "" { posts_lm = fmt.aprintf("%s", posts_lastmod) } append(&parts, fmt.aprintf("%s/posts/%s\n", base_url, posts_lm)) append(&parts, "") return strings.join(parts[:], "") } format_rfc822 :: proc(iso: string) -> string { if len(iso) < 19 { return iso } year := (int(iso[0]) - 0x30) * 1000 + (int(iso[1]) - 0x30) * 100 + (int(iso[2]) - 0x30) * 10 + (int(iso[3]) - 0x30) month := (int(iso[5]) - 0x30) * 10 + (int(iso[6]) - 0x30) day := (int(iso[8]) - 0x30) * 10 + (int(iso[9]) - 0x30) time := iso[11:19] // Timezone: -04:00 → -0400 tz := "+0000" if len(iso) >= 25 && (iso[19] == '+' || iso[19] == '-') { tz = fmt.tprintf("%c%s%s", iso[19], iso[20:22], iso[23:25]) } // Sakamoto's method for day of week (0=Sunday) t := [12]int{0, 3, 2, 5, 0, 3, 5, 1, 4, 6, 2, 4} y := year if month < 3 { y -= 1 } dow := (y + y / 4 - y / 100 + y / 400 + t[month - 1] + day) % 7 return fmt.aprintf( "%s, %d %s %d %s %s", WEEKDAYS[dow], day, MONTHS[month - 1], year, time, tz, ) } xml_escape :: proc(s: string) -> string { r, _ := strings.replace_all(s, "&", "&") r, _ = strings.replace_all(r, "<", "<") r, _ = strings.replace_all(r, ">", ">") return r }