Skip to main content

katana_render_runtime/renderer/backends/
mathjax.rs

1use crate::markdown::color_preset::DiagramColorPreset;
2use crate::markdown::{DiagramBlock, mathjax_renderer::MathJaxRendererOps};
3use crate::renderer::api::{DiagramKind, RenderError, RenderInput, RenderOutput, Renderer};
4use crate::renderer::output::RenderOutputFactory;
5use crate::renderer::runtime::RuntimeDescriptor;
6use std::path::PathBuf;
7
8#[derive(Debug, Clone)]
9pub struct MathJaxRenderer {
10    runtime_path: PathBuf,
11}
12
13impl MathJaxRenderer {
14    pub fn with_runtime_path(runtime_path: PathBuf) -> Self {
15        Self { runtime_path }
16    }
17}
18
19impl Renderer for MathJaxRenderer {
20    fn render(&self, input: &RenderInput) -> Result<RenderOutput, RenderError> {
21        if input.kind != DiagramKind::MathJax {
22            return Err(RenderError::UnsupportedKind);
23        }
24        let runtime = RuntimeDescriptor::mathjax();
25        match self.render_block(input) {
26            crate::markdown::DiagramResult::Ok(svg) => RenderOutputFactory::from_diagram_result(
27                input,
28                crate::markdown::DiagramResult::Ok(svg),
29                runtime,
30            ),
31            crate::markdown::DiagramResult::RawCode { source, warning } => Ok(
32                RenderOutputFactory::from_raw_string(input, source, warning, runtime),
33            ),
34            crate::markdown::DiagramResult::Err { error, source } => Ok(
35                RenderOutputFactory::from_raw_string(input, source, error, runtime),
36            ),
37            _ => Err(RenderError::Runtime(
38                "unexpected MathJax output".to_string(),
39            )),
40        }
41    }
42}
43
44impl MathJaxRenderer {
45    fn render_block(&self, input: &RenderInput) -> crate::markdown::DiagramResult {
46        let block = DiagramBlock {
47            kind: crate::markdown::DiagramKind::MathJax,
48            source: input.source.clone(),
49        };
50        let preset = DiagramColorPreset::for_render_input(input);
51        MathJaxRendererOps::render_mathjax_with_runtime_path(
52            &block,
53            &self.runtime_path,
54            &preset,
55            MathJaxRenderConfig::display(input),
56        )
57    }
58}
59
60struct MathJaxRenderConfig;
61
62impl MathJaxRenderConfig {
63    fn display(input: &RenderInput) -> bool {
64        input
65            .config
66            .vendor_config
67            .get("display")
68            .and_then(serde_json::Value::as_bool)
69            .unwrap_or(false)
70    }
71}