lssg_lib/renderer/
token_renderer.rs1use 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
16pub 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 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 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}