lssg_lib/renderer/modules/
mod.rs1use 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 fn id(&self) -> &'static str;
22
23 fn init(&mut self, site_tree: &mut SiteTree) -> Result<(), LssgError> {
25 Ok(())
26 }
27
28 fn after_init(&mut self, site_tree: &SiteTree) -> Result<(), LssgError> {
30 Ok(())
31 }
32
33 fn render_page<'n>(&mut self, dom: &mut DomTree, context: &RenderContext<'n>) {}
35
36 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 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}