lssg_lib/renderer/modules/
mod.rs

1use log::error;
2use serde_extensions::Overwrite;
3
4use crate::{
5    html::{DomId, DomTree},
6    lmarkdown::Token,
7    sitetree::{Page, SiteTree},
8    LssgError,
9};
10
11mod blog_module;
12pub use blog_module::*;
13mod default_module;
14pub use default_module::*;
15
16use super::{RenderContext, TokenRenderer};
17
18#[allow(unused)]
19pub trait RendererModule {
20    /// Return a static id
21    fn id(&self) -> &'static str;
22
23    /// This gets run once just after site_tree has been created
24    fn init(&mut self, site_tree: &mut SiteTree) -> Result<(), LssgError> {
25        Ok(())
26    }
27
28    /// Gets run after all changes to site tree has been made
29    fn after_init(&mut self, site_tree: &SiteTree) -> Result<(), LssgError> {
30        Ok(())
31    }
32
33    /// Modify DomTree before rendering page
34    fn render_page<'n>(&mut self, dom: &mut DomTree, context: &RenderContext<'n>) {}
35
36    /// Render a token before default token renderer returns true if it parsed this token otherwise false
37    fn render_body<'n>(
38        &mut self,
39        dom: &mut DomTree,
40        context: &RenderContext<'n>,
41        parent_id: DomId,
42        token: &Token,
43        tr: &mut TokenRenderer,
44    ) -> bool {
45        false
46    }
47
48    /// Gets called after body has been rendered, can be used for final changes to the dom
49    fn after_render<'n>(&mut self, dom: &mut DomTree, context: &RenderContext<'n>) {}
50
51    fn options_with_default<D: Overwrite + Default>(&self, page: &Page, mut default: D) -> D
52    where
53        Self: Sized,
54    {
55        if let Some(Token::Attributes { table: toml }) = page.tokens().first() {
56            if let Some(v) = toml.get(self.id()) {
57                match default.overwrite(v.clone()) {
58                    Ok(d) => d,
59                    Err(e) => error!("Failed to parse options for '{}' module: {e}", self.id()),
60                }
61            }
62        }
63        default
64    }
65
66    fn options<D: Overwrite + Default>(&self, page: &Page) -> D
67    where
68        Self: Sized,
69    {
70        let mut o = D::default();
71        if let Some(Token::Attributes { table: toml }) = page.tokens().first() {
72            if let Some(v) = toml.get(self.id()) {
73                match o.overwrite(v.clone()) {
74                    Ok(d) => d,
75                    Err(e) => error!("Failed to parse options for '{}' module: {e}", self.id()),
76                }
77            }
78        }
79        o
80    }
81}