feat: Added site to the template context stack.

This commit is contained in:
Spencer Brower
2026-07-28 12:06:22 -04:00
parent b81aa38c62
commit 6ec8fcf2a1
3 changed files with 23 additions and 22 deletions
+6 -2
View File
@@ -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
+4 -14
View File
@@ -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,
+13 -6
View File
@@ -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,