lssg_lib/renderer/
token_renderer.rs

1use std::{
2    cell::{Cell, RefCell, UnsafeCell},
3    collections::HashMap,
4    rc::Rc,
5};
6
7use log::warn;
8
9use super::{DefaultModule, RenderContext, RendererModule};
10use crate::{
11    html::{DomId, DomNode, DomNodeKind, DomTree},
12    lmarkdown::Token,
13    sitetree::{Page, SiteTree},
14};
15
16/// used for recursively rendering
17pub struct TokenRenderer {
18    modules: *mut Vec<Box<dyn RendererModule>>,
19}
20
21impl<'a> TokenRenderer {
22    pub fn new(modules: &'a mut Vec<Box<dyn RendererModule>>) -> TokenRenderer {
23        // turn into pointer to allow for recursive call backs in render()
24        let modules: *mut Vec<Box<dyn RendererModule>> = modules;
25        TokenRenderer { modules }
26    }
27
28    pub fn render(
29        &mut self,
30        dom: &mut DomTree,
31        context: &RenderContext<'a>,
32        parent_id: DomId,
33        tokens: &Vec<Token>,
34    ) {
35        'l: for token in tokens.iter() {
36            let modules = unsafe { self.modules.as_mut().unwrap() };
37            for module in modules.iter_mut() {
38                if module.render_body(dom, context, parent_id, &token, self) {
39                    continue 'l;
40                }
41            }
42            warn!("{token:?} not renderered");
43        }
44    }
45
46    /// consume self and return a parsed domtree
47    pub fn start_render(mut self, dom: &mut DomTree, context: &RenderContext) {
48        let body = dom.get_elements_by_tag_name("body")[0];
49        let tokens = context.page.tokens();
50        self.render(dom, context, body, tokens);
51    }
52}