From 90f6466f9cff91d418b5501b3bbeefb8e7e8fcc1 Mon Sep 17 00:00:00 2001
From: Spencer Brower <6729162+sbrow@users.noreply.github.com>
Date: Sun, 19 Jul 2026 11:40:21 -0400
Subject: [PATCH] refactor: Moved OpenGraph fields to a separate struct.
---
defaults/layouts/partials/head.html | 18 ++++----
opengraph.odin | 40 ++++++++++++++++
render.odin | 72 ++++++++++++-----------------
3 files changed, 79 insertions(+), 51 deletions(-)
create mode 100644 opengraph.odin
diff --git a/defaults/layouts/partials/head.html b/defaults/layouts/partials/head.html
index 7f0c126..aa43312 100644
--- a/defaults/layouts/partials/head.html
+++ b/defaults/layouts/partials/head.html
@@ -1,9 +1,9 @@
-
-
-
-
-
-
-{{#is_article}}
-
-{{/is_article}}
+
+
+
+
+
+
+{{#og.is_article}}
+
+{{/og.is_article}}
diff --git a/opengraph.odin b/opengraph.odin
new file mode 100644
index 0000000..c862495
--- /dev/null
+++ b/opengraph.odin
@@ -0,0 +1,40 @@
+package main
+
+import "core:fmt"
+
+Open_Graph :: struct {
+ title: string,
+ type: string,
+ image: string,
+ url: string,
+
+ description: string,
+ locale: string,
+ site_name: string,
+
+ is_article: bool,
+ published_time: string,
+ modified_time: string,
+ section: string,
+}
+
+og_init :: proc(site: ^Site) -> Open_Graph {
+ return {
+ site_name = site.title,
+ description = site.description,
+ image = fmt.tprintf("%s/avatar.jpg", site.base_url),
+ locale = "en_US",
+ }
+}
+
+og_for_page :: proc(site: ^Site, page: Page, base: Open_Graph) -> Open_Graph {
+ og := base
+ is_article := page.section != ""
+ og.url = fmt.tprintf("%s%s", site.base_url, page.permalink)
+ og.title = strip_html_tags(page.title)
+ og.type = "article" if is_article else "website"
+ og.is_article = is_article
+ og.section = page.section
+ og.published_time = page.date
+ return og
+}
diff --git a/render.odin b/render.odin
index 56e3398..5bf737e 100644
--- a/render.odin
+++ b/render.odin
@@ -24,18 +24,12 @@ Year_Section :: struct {
}
Base_Data :: struct {
- now: datetime.DateTime,
- author: string,
- params: json.Value,
- body: string,
- title: string,
- og_site_name: string,
- og_description: string,
- og_image: string,
- og_url: string,
- og_title: string,
- og_type: string,
- is_article: bool,
+ now: datetime.DateTime,
+ author: string,
+ params: json.Value,
+ body: string,
+ title: string,
+ og: Open_Graph,
}
Page_Data :: struct {
@@ -43,8 +37,6 @@ Page_Data :: struct {
page_title: string,
date_iso: string,
date_display: string,
- og_section: string,
- og_published: string,
}
Home_Data :: struct {
@@ -94,13 +86,6 @@ strip_html_tags :: proc(s: string) -> string {
return strings.to_string(sb)
}
-og_type :: proc(is_article: bool) -> string {
- if is_article {
- return "article"
- }
- return "website"
-}
-
load_template :: proc(vfs: ^VFS, virtual_path: string) -> mustache.Template {
data, ok := vfs_get(vfs, virtual_path)
if !ok {
@@ -191,12 +176,15 @@ render_site :: proc(site: ^Site) {
// Build base data once
base := Base_Data {
- now = now,
- author = site.author,
- params = site.params,
- og_site_name = site.title,
- og_description = site.description,
- og_image = fmt.tprintf("%s/avatar.jpg", site.base_url),
+ now = now,
+ author = site.author,
+ params = site.params,
+ og = {
+ site_name = site.title,
+ description = site.description,
+ image = fmt.tprintf("%s/avatar.jpg", site.base_url),
+ locale = "en_US",
+ },
}
// Find home page
@@ -309,12 +297,12 @@ render_page_html :: proc(
data.body = page.body_html
data.date_iso = page.date
data.date_display = format_date(page.date)
- data.og_url = fmt.tprintf("%s%s", site.base_url, page.permalink)
- data.og_title = strip_html_tags(page.title)
- data.og_type = og_type(is_article)
- data.is_article = is_article
- data.og_section = page.section
- data.og_published = page.date
+ data.og.url = fmt.tprintf("%s%s", site.base_url, page.permalink)
+ data.og.title = strip_html_tags(page.title)
+ data.og.type = "article" if is_article else "website"
+ data.og.is_article = is_article
+ data.og.section = page.section
+ data.og.published_time = page.date
return render_template(content_tpl, data, partials)
}
@@ -340,10 +328,10 @@ render_home_html :: proc(
data.title = site.title
data.body = home.body_html
data.pages = list_pages
- data.og_url = fmt.tprintf("%s/", site.base_url)
- data.og_title = site.title
- data.og_type = "website"
- data.is_article = false
+ data.og.url = fmt.tprintf("%s/", site.base_url)
+ data.og.title = site.title
+ data.og.type = "website"
+ data.og.is_article = false
return render_template(content_tpl, data, partials)
}
@@ -378,16 +366,16 @@ render_section :: proc(
data.body = section_index.body_html
data.page_title = section_index.title
data.title = fmt.tprintf("%s | %s", section_index.title, site.title)
- data.og_title = section_index.title
+ data.og.title = section_index.title
} else {
data.page_title = capitalize(section)
data.title = fmt.tprintf("%s | %s", capitalize(section), site.title)
- data.og_title = capitalize(section)
+ data.og.title = capitalize(section)
}
data.by_year = by_year
- data.og_url = fmt.tprintf("%s/%s/", site.base_url, section)
- data.og_type = "website"
- data.is_article = false
+ data.og.url = fmt.tprintf("%s/%s/", site.base_url, section)
+ data.og.type = "website"
+ data.og.is_article = false
return render_template(content_tpl, data, partials)
}