use regex::Regex;
use std::sync::LazyLock;
use syntect::highlighting::ThemeSet;
use syntect::html::highlighted_html_for_string;
use syntect::parsing::SyntaxSet;
static CODE_BLOCK_RE: LazyLock<Regex> = LazyLock::new(|| {
Regex::new(r"(?s)```(\w*)\n(.*?)```").expect("BUG: invalid regex for code blocks")
});
static SYNTAX_SET: LazyLock<SyntaxSet> = LazyLock::new(SyntaxSet::load_defaults_newlines);
static THEME_SET: LazyLock<ThemeSet> = LazyLock::new(ThemeSet::load_defaults);
pub fn highlight_code_blocks(markdown: &str) -> String {
let theme = &THEME_SET.themes["base16-ocean.dark"];
CODE_BLOCK_RE
.replace_all(markdown, |caps: ®ex::Captures| {
let language = caps.get(1).map_or("", |m| m.as_str());
let code = caps.get(2).map_or("", |m| m.as_str());
match SYNTAX_SET.find_syntax_by_token(language) {
Some(syntax) => {
match highlighted_html_for_string(code, &SYNTAX_SET, syntax, theme) {
Ok(html) => html, Err(_) => caps[0].to_string(), }
}
None => caps[0].to_string(), }
})
.to_string()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_highlight_rust_code() {
let md = "```rust\nfn main() {\n println!(\"Hello\");\n}\n```";
let highlighted = highlight_code_blocks(md);
assert!(highlighted.contains("<span"));
}
#[test]
fn test_highlight_python_code() {
let md = "```python\nprint('Hello')\n```";
let highlighted = highlight_code_blocks(md);
assert!(highlighted.contains("<span"));
}
#[test]
fn test_no_code_blocks() {
let md = "Just plain text without code blocks";
let highlighted = highlight_code_blocks(md);
assert_eq!(highlighted, md);
}
#[test]
fn test_empty_string() {
let md = "";
let highlighted = highlight_code_blocks(md);
assert_eq!(highlighted, "");
}
#[test]
fn test_multiple_identical_code_blocks() {
let md = "```rust\nfn foo() {}\n```\ntext\n```rust\nfn foo() {}\n```";
let highlighted = highlight_code_blocks(md);
assert_eq!(highlighted.matches("<pre").count(), 2);
assert!(!highlighted.contains("```"));
}
#[test]
fn test_html_not_wrapped_in_backticks() {
let md = "```rust\nfn main() {}\n```";
let highlighted = highlight_code_blocks(md);
assert!(!highlighted.contains("```")); assert!(highlighted.contains("<pre")); }
#[test]
fn test_lazy_initialization() {
let _ = &SYNTAX_SET;
let _ = &THEME_SET;
}
#[test]
fn test_unknown_language_fallback() {
let md = "```unknownlang\nsome code\n```";
let highlighted = highlight_code_blocks(md);
assert!(highlighted.contains("```unknownlang"));
}
#[test]
fn test_multiline_code_blocks() {
let md = "```rust\nfn main() {\n println!(\"Hello\");\n println!(\"World\");\n}\n```";
let highlighted = highlight_code_blocks(md);
assert!(highlighted.contains("<span"));
}
}