yggdrasil/api/markdown/
code_block.rs1use std::fmt::Write as _;
4
5pub(super) fn runnable_attrs(info: &str) -> Option<(String, String)> {
10 let (lang, runnable, overrides) = crate::api::code_runner::languages::parse_fence_info(info);
11 if runnable && crate::api::code_runner::languages::is_supported_lang(&lang) {
12 let ov_json = overrides
14 .map(|o| serde_json::to_string(&o).unwrap_or_default())
15 .unwrap_or_default();
16 let overrides_escaped = crate::utils::html::escape_html(&ov_json);
17 Some((lang, overrides_escaped))
18 } else {
19 None
20 }
21}
22
23pub(super) fn push_code_block(
27 html: &mut String,
28 info: Option<&str>,
29 runnable: Option<(String, String)>,
30 source: &str,
31 diagrams: &mut super::mermaid::Diagrams,
32) {
33 let is_mermaid = info
36 .map(|l| l.split_whitespace().next() == Some("mermaid"))
37 .unwrap_or(false);
38 if is_mermaid {
39 diagrams.push(html, source);
40 return;
41 }
42 let highlight_lang = info.and_then(|lang| lang.split_whitespace().next());
45 let highlighted = crate::highlight::server::highlight_code(source, highlight_lang);
46 if let Some((lang, overrides_escaped)) = runnable {
50 let source_escaped = crate::utils::html::escape_html(source);
51 let _ = write!(
52 html,
53 r#"<pre data-runnable="true" data-lang="{lang}" data-overrides="{overrides_escaped}" data-source="{source_escaped}"><code class="language-{lang}">"#
54 );
55 } else {
56 html.push_str("<pre><code");
57 if let Some(lang) = info {
58 let clean_lang = lang.split_whitespace().next().unwrap_or("");
61 if !clean_lang.is_empty() {
62 let _ = write!(html, " class=\"language-{clean_lang}\"");
63 }
64 }
65 html.push('>');
66 }
67 html.push_str(&highlighted);
68 html.push_str("</code></pre>");
69}