feat(config): add global nav.toc setting with frontmatter override
- Add toc: bool to [nav] config section (default: false) - Frontmatter toc: true/false overrides global config - If frontmatter toc is not specified, falls back to config.nav.toc - Enable nav.toc = true in docs/site.toml for global TOC
This commit is contained in:
@@ -2,7 +2,6 @@
|
|||||||
title: Tera Templates
|
title: Tera Templates
|
||||||
description: Customizable templates without recompilation
|
description: Customizable templates without recompilation
|
||||||
weight: 1
|
weight: 1
|
||||||
toc: true
|
|
||||||
---
|
---
|
||||||
|
|
||||||
sukr uses [Tera](https://tera.netlify.app/), a Jinja2-like templating engine. Templates are loaded at runtime, so you can modify them without recompiling sukr.
|
sukr uses [Tera](https://tera.netlify.app/), a Jinja2-like templating engine. Templates are loaded at runtime, so you can modify them without recompiling sukr.
|
||||||
|
|||||||
@@ -10,3 +10,4 @@ templates = "templates"
|
|||||||
|
|
||||||
[nav]
|
[nav]
|
||||||
nested = true
|
nested = true
|
||||||
|
toc = true
|
||||||
|
|||||||
@@ -28,6 +28,9 @@ pub struct SiteConfig {
|
|||||||
pub struct NavConfig {
|
pub struct NavConfig {
|
||||||
/// Whether to display nested navigation (default: false).
|
/// Whether to display nested navigation (default: false).
|
||||||
pub nested: bool,
|
pub nested: bool,
|
||||||
|
/// Enable table of contents (anchor nav) globally (default: false).
|
||||||
|
/// Can be overridden per-page via frontmatter toc field.
|
||||||
|
pub toc: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Path configuration with sensible defaults.
|
/// Path configuration with sensible defaults.
|
||||||
|
|||||||
@@ -159,7 +159,7 @@ fn run(config_path: &Path) -> Result<()> {
|
|||||||
let page_path = format!("/{}/index.html", section.name);
|
let page_path = format!("/{}/index.html", section.name);
|
||||||
let item_contexts: Vec<_> = items
|
let item_contexts: Vec<_> = items
|
||||||
.iter()
|
.iter()
|
||||||
.map(|c| ContentContext::from_content(c, &content_dir))
|
.map(|c| ContentContext::from_content(c, &content_dir, &config))
|
||||||
.collect();
|
.collect();
|
||||||
let html = engine.render_section(
|
let html = engine.render_section(
|
||||||
§ion.index,
|
§ion.index,
|
||||||
|
|||||||
@@ -45,7 +45,10 @@ impl TemplateEngine {
|
|||||||
) -> Result<String> {
|
) -> Result<String> {
|
||||||
let mut ctx = self.base_context(page_path, config, nav);
|
let mut ctx = self.base_context(page_path, config, nav);
|
||||||
ctx.insert("title", &content.frontmatter.title);
|
ctx.insert("title", &content.frontmatter.title);
|
||||||
ctx.insert("page", &FrontmatterContext::from(&content.frontmatter));
|
ctx.insert(
|
||||||
|
"page",
|
||||||
|
&FrontmatterContext::new(&content.frontmatter, config),
|
||||||
|
);
|
||||||
ctx.insert("content", html_body);
|
ctx.insert("content", html_body);
|
||||||
ctx.insert("anchors", anchors);
|
ctx.insert("anchors", anchors);
|
||||||
self.render("page.html", &ctx)
|
self.render("page.html", &ctx)
|
||||||
@@ -68,7 +71,10 @@ impl TemplateEngine {
|
|||||||
.unwrap_or("content/default.html");
|
.unwrap_or("content/default.html");
|
||||||
let mut ctx = self.base_context(page_path, config, nav);
|
let mut ctx = self.base_context(page_path, config, nav);
|
||||||
ctx.insert("title", &content.frontmatter.title);
|
ctx.insert("title", &content.frontmatter.title);
|
||||||
ctx.insert("page", &FrontmatterContext::from(&content.frontmatter));
|
ctx.insert(
|
||||||
|
"page",
|
||||||
|
&FrontmatterContext::new(&content.frontmatter, config),
|
||||||
|
);
|
||||||
ctx.insert("content", html_body);
|
ctx.insert("content", html_body);
|
||||||
ctx.insert("anchors", anchors);
|
ctx.insert("anchors", anchors);
|
||||||
self.render(template, &ctx)
|
self.render(template, &ctx)
|
||||||
@@ -88,7 +94,10 @@ impl TemplateEngine {
|
|||||||
|
|
||||||
let mut ctx = self.base_context(page_path, config, nav);
|
let mut ctx = self.base_context(page_path, config, nav);
|
||||||
ctx.insert("title", §ion.frontmatter.title);
|
ctx.insert("title", §ion.frontmatter.title);
|
||||||
ctx.insert("section", &FrontmatterContext::from(§ion.frontmatter));
|
ctx.insert(
|
||||||
|
"section",
|
||||||
|
&FrontmatterContext::new(§ion.frontmatter, config),
|
||||||
|
);
|
||||||
ctx.insert("items", items);
|
ctx.insert("items", items);
|
||||||
self.render(&template, &ctx)
|
self.render(&template, &ctx)
|
||||||
}
|
}
|
||||||
@@ -154,8 +163,9 @@ pub struct FrontmatterContext {
|
|||||||
pub toc: bool,
|
pub toc: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<&crate::content::Frontmatter> for FrontmatterContext {
|
impl FrontmatterContext {
|
||||||
fn from(fm: &crate::content::Frontmatter) -> Self {
|
/// Create context from frontmatter with config fallback for toc.
|
||||||
|
pub fn new(fm: &crate::content::Frontmatter, config: &SiteConfig) -> Self {
|
||||||
Self {
|
Self {
|
||||||
title: fm.title.clone(),
|
title: fm.title.clone(),
|
||||||
description: fm.description.clone(),
|
description: fm.description.clone(),
|
||||||
@@ -163,7 +173,7 @@ impl From<&crate::content::Frontmatter> for FrontmatterContext {
|
|||||||
tags: fm.tags.clone(),
|
tags: fm.tags.clone(),
|
||||||
weight: fm.weight,
|
weight: fm.weight,
|
||||||
link_to: fm.link_to.clone(),
|
link_to: fm.link_to.clone(),
|
||||||
toc: fm.toc.unwrap_or(false),
|
toc: fm.toc.unwrap_or(config.nav.toc),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -178,9 +188,9 @@ pub struct ContentContext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl ContentContext {
|
impl ContentContext {
|
||||||
pub fn from_content(content: &Content, content_dir: &Path) -> Self {
|
pub fn from_content(content: &Content, content_dir: &Path, config: &SiteConfig) -> Self {
|
||||||
Self {
|
Self {
|
||||||
frontmatter: FrontmatterContext::from(&content.frontmatter),
|
frontmatter: FrontmatterContext::new(&content.frontmatter, config),
|
||||||
body: content.body.clone(),
|
body: content.body.clone(),
|
||||||
slug: content.slug.clone(),
|
slug: content.slug.clone(),
|
||||||
path: format!("/{}", content.output_path(content_dir).display()),
|
path: format!("/{}", content.output_path(content_dir).display()),
|
||||||
|
|||||||
Reference in New Issue
Block a user