wayver's git archive


an obsidian renderer
git clone https://git.wayver.dev/sable

sable-renderer/src/note.rs@main

raw
Date Commit Message Author Files + -
2026-02-23 01:55 initial mvp wayverd 139 17808 0
...

1use sable_vault::Note;
2use tera::Context;
3
4use crate::{IntoDiagnostic as _, Renderer, RendererError};
5
6impl Renderer {
7    /// Render all notes using [`tera`] and write then to the destination folder.
8    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", &note.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