raw
1use sable_core::config::PageConfig;
2use tera::Context;
3
4use crate::{IntoDiagnostic as _, Renderer, RendererError};
5
6impl Renderer {
7 pub fn render_pages(&self) {
9 for page in &self.config.pages {
10 if let Err(err) = self.render_page(page).into_diagnostic() {
11 tracing::error!(path=%page.path, "failed to render custom page");
12 eprintln!("{err:?}");
13 }
14 }
15 }
16
17 fn render_page(&self, page: &PageConfig) -> Result<(), RendererError> {
18 let dest_path = self.config.build.join(&page.path);
19
20 if let Some(dir) = dest_path.parent() {
21 std::fs::create_dir_all(dir).map_err(RendererError::CreateDir)?;
22 }
23
24 let mut ctx = Context::new();
25
26 ctx.insert("meta", &self.meta_info);
27 if let Some(data) = self.config.data.as_ref() {
28 ctx.insert("data", data);
29 }
30
31 let rendered = self
32 .templates
33 .render(&page.template, &ctx)
34 .map_err(RendererError::RenderTemplate)?;
35
36 std::fs::write(dest_path, rendered).map_err(RendererError::WriteTemplate)?;
37
38 Ok(())
39 }
40}
41