From 6ec8fcf2a129d7b9be8cff091a243b7e846c9c54 Mon Sep 17 00:00:00 2001 From: Spencer Brower <6729162+sbrow@users.noreply.github.com> Date: Tue, 28 Jul 2026 12:06:22 -0400 Subject: [PATCH] feat: Added `site` to the template context stack. --- TODOS.md | 8 ++++++-- render.odin | 18 ++++-------------- site.odin | 19 +++++++++++++------ 3 files changed, 23 insertions(+), 22 deletions(-) diff --git a/TODOS.md b/TODOS.md index e2a876a..0950d08 100644 --- a/TODOS.md +++ b/TODOS.md @@ -2,14 +2,18 @@ - Polish existing features before moving on to new ones. - [ ] Improve diagnostics -- [ ] Simplify / unify template context stack. Come up with a name for it. - - [ ] `render_template` should accept `Template_Context`, not `any` +- [x] Simplify / unify template context stack. Come up with a name for it. + - [x] `render_template` should accept `Template_Context`, not `any` - [ ] Load grammars dynamically - [ ] consider adding a limit to the context stack in mustache. - [ ] better diagnostics for syntax errors in treesitter. - [x] Add heading ids as a default on extension. - [ ] show "stack traces" in template error diagnostics - [ ] starred must be a param. +- [ ] Add a `#config(MAX_CONTEXT_DEPTH, 16?)` to `mustache`. +- [ ] menu system + - [ ] like Hugo's, but warn(/fail?) if menus are defined in the config *and* pages. + - i.e. force the user to choose one or the other. ## Performance diff --git a/render.odin b/render.odin index c6a6d0e..65d86c2 100644 --- a/render.odin +++ b/render.odin @@ -2,7 +2,6 @@ package main import "mustache" -import "core:encoding/json" import "core:fmt" import "core:log" import "core:os" @@ -11,13 +10,12 @@ import "core:time" import "core:time/datetime" Template_Context :: struct { - params: json.Value, now: string, title: string, - description: string, - og: Open_Graph, date_format: string, timezone: ^datetime.TZ_Region, + og: Open_Graph, + site: Site_Context, page: Page, // Home data @@ -106,14 +104,7 @@ render_template :: proc( ctx: Template_Context, partials: map[string]mustache.Template, ) -> string { - result, err := mustache.render( - content_tpl, - []any { /*ctx.site,*/ - ctx.page, - ctx, - }, - partials, - ) + result, err := mustache.render(content_tpl, []any{ctx.site, ctx.page, ctx}, partials) if err != nil { log.errorf( "%s", @@ -142,9 +133,8 @@ render_site :: proc(site: ^Site) { assert(ok2) ctx := Template_Context { + site = site.site_context, now = now, - params = site.params, - description = site.description, og = site.og, date_format = site.date.format, timezone = site.tz, diff --git a/site.odin b/site.odin index 77475b4..2f8ba3d 100644 --- a/site.odin +++ b/site.odin @@ -13,24 +13,31 @@ import "core:time/timezone" import md "markdown" -// Site is the primary workhorse. +// Site_Context holds the site date that is accessible in templates. +Site_Context :: struct { + title: string, + description: string, + base_url: string, + params: json.Object, + og: Open_Graph, +} + +// Site is the primary workhorse, containing everything needed to build the site, +// including an arena allocator, the pages, and all the various directories and +// enabled features. Site :: struct { + using site_context: Site_Context, arena: mem.Dynamic_Arena, pages: #soa[dynamic]Page, modules: [dynamic]string, vfs: VFS, - title: string, - description: string, - base_url: string, config_path: string, content_dir: string, assets_dir: string, output_dir: string, layouts_dir: string, - params: json.Object, features: bit_set[Feature], markdown_extensions: bit_set[md.Extension], - og: Open_Graph, date: Date_Preferences, tz: ^datetime.TZ_Region, grammars: string,