From 84e5cc4f7e580d4765cad52fffbe6d258cd097fa Mon Sep 17 00:00:00 2001 From: Gabriel Kaszewski Date: Wed, 17 Jun 2026 10:23:11 +0200 Subject: [PATCH] fix: sanitize mermaid member syntax (colons, angle brackets, refs) --- .../adapters/mermaid/src/mermaid_renderer.rs | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/crates/adapters/mermaid/src/mermaid_renderer.rs b/crates/adapters/mermaid/src/mermaid_renderer.rs index 14117fe..33e0031 100644 --- a/crates/adapters/mermaid/src/mermaid_renderer.rs +++ b/crates/adapters/mermaid/src/mermaid_renderer.rs @@ -136,10 +136,10 @@ impl MermaidRenderer { } let name = element.name(); for field in element.fields() { - member_target.push(format!(" {name} : {field}")); + member_target.push(format!(" {name} : {}", sanitize_member(field))); } for method in element.methods() { - member_target.push(format!(" {name} : {method}")); + member_target.push(format!(" {name} : {}", sanitize_member(method))); } } @@ -274,6 +274,20 @@ impl MermaidRenderer { } } +// Sanitize a field/method string for Mermaid classDiagram member syntax. +// Mermaid uses `ClassName : member` — it cannot handle colons inside the +// member (Rust's `field: Type`), nor reference/lifetime syntax (`&`, `'`), +// nor angle-bracket generics (`<`, `>`). +fn sanitize_member(s: &str) -> String { + // Convert `name: Type` → `name Type` (drop the colon) + let no_colon = s.replace(": ", " ").replace(':', " "); + // Strip chars that break the Mermaid grammar + no_colon + .replace(['&', '\''], "") + .replace('<', "[") + .replace('>', "]") +} + impl DiagramRenderer for MermaidRenderer { fn render(&self, graph: &CodeGraph) -> Result { let content = match self.level {