nargo_document/plugin/
mermaid.rs1use crate::plugin::{DocumentPlugin, PluginContext, PluginMeta};
6use lazy_static::lazy_static;
7use regex::Regex;
8
9lazy_static! {
10 static ref MERMAID_BLOCK_RE: Regex = Regex::new(r"```mermaid\s*\n([\s\S]*?)\n```").unwrap();
12}
13
14pub struct MermaidPlugin {
16 meta: PluginMeta,
18}
19
20impl MermaidPlugin {
21 pub fn new() -> Self {
23 Self { meta: PluginMeta::new("nargo-document-plugin-mermaid".to_string(), "0.1.0".to_string(), "Mermaid 图表渲染插件,支持流程图、时序图、甘特图等".to_string()) }
24 }
25
26 fn process_mermaid_blocks(&self, content: &str) -> String {
36 MERMAID_BLOCK_RE
37 .replace_all(content, |caps: ®ex::Captures| {
38 let diagram = &caps[1];
39 format!("<div class=\"mermaid\">{}</div>", diagram.trim())
40 })
41 .to_string()
42 }
43}
44
45impl Default for MermaidPlugin {
46 fn default() -> Self {
47 Self::new()
48 }
49}
50
51impl DocumentPlugin for MermaidPlugin {
52 fn meta(&self) -> &PluginMeta {
54 &self.meta
55 }
56
57 fn before_render(&self, context: PluginContext) -> PluginContext {
67 let content = self.process_mermaid_blocks(&context.content);
68
69 PluginContext { content, frontmatter: context.frontmatter, path: context.path }
70 }
71}