katana_render_runtime/renderer/backends/
mathjax.rs1use 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}