From 87bd2b828b01ebcb616cdd8202508b742574c90b Mon Sep 17 00:00:00 2001
From: Spencer Brower <6729162+sbrow@users.noreply.github.com>
Date: Fri, 10 Jul 2026 18:10:38 -0400
Subject: [PATCH] feat: Post index gets rendered.
---
render.odin | 178 +++++++++++++++++++++++++++++++++++++---------------
1 file changed, 127 insertions(+), 51 deletions(-)
diff --git a/render.odin b/render.odin
index 99f9cfc..002cade 100644
--- a/render.odin
+++ b/render.odin
@@ -7,6 +7,12 @@ import "core:strings"
SITE_TITLE :: "One Idiot Developer"
SITE_DESC :: "This is fine...right?"
+@(rodata)
+MONTHS: [12]string = {
+ "Jan", "Feb", "Mar", "Apr", "May", "Jun",
+ "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
+}
+
CSS :: `
body { background: #020617; color: #e2e8f0; font-family: system-ui, sans-serif; max-width: 720px; margin: 0 auto; padding: 2rem; line-height: 1.6; }
a { color: #7dd3fc; }
@@ -31,6 +37,8 @@ NAV :: `
`
render_site :: proc(pages: []Page, output_dir: string) {
+ sort_pages_by_date(pages)
+
for page in pages {
html := render_page_html(page)
write_page(output_dir, page.permalink, html)
@@ -39,37 +47,27 @@ render_site :: proc(pages: []Page, output_dir: string) {
home_html := render_home_html(pages)
write_file(fmt.tprintf("%s/index.html", output_dir), home_html)
- fmt.printfln("Rendered %d pages to %s", len(pages) + 1, output_dir)
+ posts_html := render_posts_html(pages)
+ write_page(output_dir, "/posts/", posts_html)
+
+ fmt.printfln("Rendered %d pages to %s", len(pages) + 2, output_dir)
}
render_page_html :: proc(page: Page) -> string {
- return fmt.aprintf(
- `
-
-
-
-
- %s | %s
-
-
-
-%s
+ body := fmt.aprintf(
+ `
%s
%s %s
-
-
`,
- page.title,
- SITE_TITLE,
- CSS,
- NAV,
page.title,
render_date(page),
page.body_html,
)
+ title := fmt.tprintf("%s | %s", page.title, SITE_TITLE)
+ return render_chrome(title, body)
}
render_home_html :: proc(pages: []Page) -> string {
@@ -77,25 +75,65 @@ render_home_html :: proc(pages: []Page) -> string {
defer delete(items)
for page in pages {
- if page.type != .Post {
- continue
- }
- date_short := page.date
- if len(date_short) > 10 {
- date_short = date_short[:10]
- }
- star := ""
- if page.is_starred {
- star = " \xe2\x98\x85"
- }
- append(
- &items,
- fmt.aprintf(` %s %s`, page.permalink, page.title, date_short, star),
- )
+ append(&items, render_post_item(page))
}
post_list := strings.join(items[:], "\n")
+ body := fmt.aprintf(
+ `
+
+
+
+`,
+ SITE_TITLE,
+ SITE_DESC,
+ post_list,
+ )
+
+ return render_chrome(SITE_TITLE, body)
+}
+
+render_posts_html :: proc(pages: []Page) -> string {
+ parts: [dynamic]string
+ defer delete(parts)
+
+ append(&parts, "\n Posts
\n")
+
+ current_year := ""
+ open := false
+ for page in pages {
+ if page.type != .Post {
+ continue
+ }
+ year := get_year(page.date)
+ if year != current_year {
+ if open {
+ append(&parts, " \n")
+ }
+ open = true
+ current_year = year
+ append(&parts, fmt.aprintf(" %s
\n
\n \n", year))
+ }
+ append(&parts, render_post_item(page))
+ append(&parts, "\n")
+ }
+ if open {
+ append(&parts, "
\n")
+ }
+ append(&parts, "\n")
+
+ body := strings.join(parts[:], "")
+ title := fmt.tprintf("Posts | %s", SITE_TITLE)
+ return render_chrome(title, body)
+}
+
+render_chrome :: proc(page_title: string, body: string) -> string {
return fmt.aprintf(
`
@@ -106,24 +144,32 @@ render_home_html :: proc(pages: []Page) -> string {
-%s
-
-
-
+%s%s