use std::{
cell::{Ref, RefCell, RefMut},
fmt::{Debug, Formatter},
rc::Rc,
};
use std::sync::Arc;
use dioxus::prelude::*;
use dioxus_elements::{div, GlobalAttributes};
use katex_wasmbind::KaTeXOptions;
pub mod builder;
pub struct UseKatex {
katex: Rc<RefCell<KaTeXOptions>>,
updater: Arc<dyn Fn() + 'static>,
}
impl UseKatex {
pub fn get_config(&self) -> Ref<'_, KaTeXOptions> {
self.katex.borrow()
}
pub fn get_config_mut(&self) -> RefMut<'_, KaTeXOptions> {
self.katex.borrow_mut()
}
pub fn set_inline_mode(&self) {
self.get_config_mut().display_mode = false;
self.needs_update();
}
pub fn set_display_mode(&self) {
self.get_config_mut().display_mode = true;
self.needs_update();
}
pub fn needs_update(&self) {
(self.updater)();
}
}
impl UseKatex {
pub fn compile(&self, input: &str) -> LazyNodes {
let config = self.katex.borrow_mut();
let out = config.render(input);
LazyNodes::new(move |cx: NodeFactory| -> VNode {
cx.element(
div,
&[],
cx.bump().alloc([div.dangerous_inner_html(cx, format_args!("{out}", out = out))]),
&[],
None,
)
})
}
}