refactor: Created Open_Graph struct for og data.

This commit is contained in:
Spencer Brower
2026-07-19 11:59:54 -04:00
parent 90f6466f9c
commit 4fc3eae64c
3 changed files with 32 additions and 40 deletions
+2
View File
@@ -1,5 +1,7 @@
- [ ] Content-hash fingerprinting for CSS and JS cache busting - [ ] Content-hash fingerprinting for CSS and JS cache busting
- [ ] Clean up the default layouts - [ ] Clean up the default layouts
- [ ] Memory
- [ ] Not sure whether to use temp allocator or site_allocator in opengraph.odin.
- [ ] Performance - [ ] Performance
- [ ] See if we can disable bounds checks in `write_indented` and elsewhere. - [ ] See if we can disable bounds checks in `write_indented` and elsewhere.
- [ ] Instead of loading the site fresh each time in watch mode, create a - [ ] Instead of loading the site fresh each time in watch mode, create a
+15 -15
View File
@@ -3,38 +3,38 @@ package main
import "core:fmt" import "core:fmt"
Open_Graph :: struct { Open_Graph :: struct {
title: string, title: string,
type: string, type: string,
image: string, image: string,
url: string, url: string,
description: string,
description: string, locale: string,
locale: string, site_name: string,
site_name: string,
is_article: bool, is_article: bool,
published_time: string, published_time: string,
modified_time: string, modified_time: string,
section: string, section: string,
} }
og_init :: proc(site: ^Site) -> Open_Graph { og_init :: proc(site: Site) -> Open_Graph {
return { return {
site_name = site.title, site_name = site.title,
description = site.description, description = site.description,
image = fmt.tprintf("%s/avatar.jpg", site.base_url), image = fmt.tprintf("%s/avatar.jpg", site.base_url),
locale = "en_US", locale = "en_US",
} }
} }
og_for_page :: proc(site: ^Site, page: Page, base: Open_Graph) -> Open_Graph { og_for_page :: proc(site: Site, page: Page, base: Open_Graph) -> Open_Graph {
og := base og := base
is_article := page.section != "" is_article := page.section != ""
og.url = fmt.tprintf("%s%s", site.base_url, page.permalink) og.url = fmt.tprintf("%s%s", site.base_url, page.permalink)
og.title = strip_html_tags(page.title) og.title = strip_html_tags(page.title, context.temp_allocator)
og.type = "article" if is_article else "website" og.type = "article" if is_article else "website"
og.is_article = is_article og.is_article = is_article
og.section = page.section og.section = page.section
og.published_time = page.date og.published_time = page.date
return og return og
} }
+15 -25
View File
@@ -24,12 +24,12 @@ Year_Section :: struct {
} }
Base_Data :: struct { Base_Data :: struct {
now: datetime.DateTime, now: datetime.DateTime,
author: string, author: string,
params: json.Value, params: json.Value,
body: string, body: string,
title: string, title: string,
og: Open_Graph, og: Open_Graph,
} }
Page_Data :: struct { Page_Data :: struct {
@@ -41,13 +41,13 @@ Page_Data :: struct {
Home_Data :: struct { Home_Data :: struct {
using base: Base_Data, using base: Base_Data,
pages: [dynamic]Page_Context, pages: [dynamic]Page_Context,
} }
Section_Data :: struct { Section_Data :: struct {
using base: Base_Data, using base: Base_Data,
page_title: string, page_title: string,
by_year: [dynamic]Year_Section, by_year: [dynamic]Year_Section,
} }
build_page_context :: proc(page: Page) -> Page_Context { build_page_context :: proc(page: Page) -> Page_Context {
@@ -60,8 +60,8 @@ build_page_context :: proc(page: Page) -> Page_Context {
} }
} }
strip_html_tags :: proc(s: string) -> string { strip_html_tags :: proc(s: string, allocator := context.allocator) -> string {
sb := strings.builder_make() sb := strings.builder_make(allocator)
defer strings.builder_destroy(&sb) defer strings.builder_destroy(&sb)
in_tag := false in_tag := false
@@ -117,7 +117,7 @@ get_template :: proc(
chain[n] = "base"; n += 1 chain[n] = "base"; n += 1
} }
for i in 0..<n { for i in 0 ..< n {
candidate := chain[i] candidate := chain[i]
if cached, ok := cache[candidate]; ok { if cached, ok := cache[candidate]; ok {
return cached return cached
@@ -179,12 +179,7 @@ render_site :: proc(site: ^Site) {
now = now, now = now,
author = site.author, author = site.author,
params = site.params, params = site.params,
og = { og = og_init(site^),
site_name = site.title,
description = site.description,
image = fmt.tprintf("%s/avatar.jpg", site.base_url),
locale = "en_US",
},
} }
// Find home page // Find home page
@@ -297,12 +292,7 @@ render_page_html :: proc(
data.body = page.body_html data.body = page.body_html
data.date_iso = page.date data.date_iso = page.date
data.date_display = format_date(page.date) data.date_display = format_date(page.date)
data.og.url = fmt.tprintf("%s%s", site.base_url, page.permalink) data.og = og_for_page(site^, page, base.og)
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) return render_template(content_tpl, data, partials)
} }