use std::rc::Rc;
use gpui::{AnyElement, App, Global, Window};
pub type Rewrite = Rc<dyn Fn(String, &mut Window, &mut App)>;
pub struct Fence<'a> {
pub language: &'a str,
pub code: &'a str,
pub height: Option<u32>,
pub rewrite: Option<Rewrite>,
}
pub type BlockRenderer = fn(&Fence<'_>, &mut Window, &mut App) -> Option<AnyElement>;
struct Installed(BlockRenderer);
impl Global for Installed {}
pub(crate) fn set_block_renderer(cx: &mut App, renderer: BlockRenderer) {
cx.set_global(Installed(renderer));
}
pub(crate) fn render(fence: &Fence<'_>, window: &mut Window, cx: &mut App) -> Option<AnyElement> {
if let Some(renderer) = cx.try_global::<Installed>().map(|installed| installed.0)
&& let Some(painted) = renderer(fence, window, cx)
{
return Some(painted);
}
#[cfg(feature = "mermaid")]
if fence.language == crate::mermaid::LANGUAGE {
return crate::mermaid::render(fence.code, fence.height, window, cx);
}
None
}