raw
1use sable_vault::Note;
2use tera::Context;
3
4use crate::{IntoDiagnostic as _, Renderer, RendererError};
5
6impl Renderer {
7 pub fn render_notes(&self) {
9 let vault = self.vault.read();
10
11 for note in vault.notes.values() {
12 tracing::debug!(path=%note.path.full, "rendering vault note");
13
14 if note.properties.draft == Some(true) {
15 continue;
16 }
17
18 if let Err(err) = self.render_note(note).into_diagnostic() {
19 tracing::error!(path=%note.path.full, "failed to render vault note");
20 eprint!("{err:?}");
21 }
22
23 tracing::debug!(path=%note.path.full, "rendered vault note");
24 }
25 }
26
27 fn render_note(&self, note: &Note) -> Result<(), RendererError> {
28 let dest_path = self
29 .config
30 .build
31 .join(note.path.slug.with_extension("html"));
32
33 if let Some(dir) = dest_path.parent() {
34 std::fs::create_dir_all(dir).map_err(RendererError::CreateDir)?;
35 }
36
37 let template = note.template().unwrap_or("default");
38 let template = format!("{template}.html");
39
40 let mut ctx = Context::new();
41
42 ctx.insert("meta", &self.meta_info);
43 if let Some(data) = self.config.data.as_ref() {
44 ctx.insert("data", data);
45 }
46
47 ctx.insert("note", ¬e.as_context());
48
49 let rendered = self
50 .templates
51 .render(&template, &ctx)
52 .map_err(RendererError::RenderTemplate)?;
53
54 std::fs::write(dest_path, rendered).map_err(RendererError::WriteTemplate)?;
55
56 Ok(())
57 }
58}
59