use crate::plugin::{DocumentPlugin, PluginContext, PluginMeta};
use lazy_static::lazy_static;
use regex::Regex;
lazy_static! {
static ref MERMAID_BLOCK_RE: Regex = Regex::new(r"```mermaid\s*\n([\s\S]*?)\n```").unwrap();
}
pub struct MermaidPlugin {
meta: PluginMeta,
}
impl MermaidPlugin {
pub fn new() -> Self {
Self { meta: PluginMeta::new("nargo-document-plugin-mermaid".to_string(), "0.1.0".to_string(), "Mermaid 图表渲染插件,支持流程图、时序图、甘特图等".to_string()) }
}
fn process_mermaid_blocks(&self, content: &str) -> String {
MERMAID_BLOCK_RE
.replace_all(content, |caps: ®ex::Captures| {
let diagram = &caps[1];
format!("<div class=\"mermaid\">{}</div>", diagram.trim())
})
.to_string()
}
}
impl Default for MermaidPlugin {
fn default() -> Self {
Self::new()
}
}
impl DocumentPlugin for MermaidPlugin {
fn meta(&self) -> &PluginMeta {
&self.meta
}
fn before_render(&self, context: PluginContext) -> PluginContext {
let content = self.process_mermaid_blocks(&context.content);
PluginContext { content, frontmatter: context.frontmatter, path: context.path }
}
}